hyperbook 0.89.0 → 0.89.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -470,14 +470,14 @@ else {
470
470
  Inhaltsobjekt des binaeren Suchbaums. Diese Bedingung gilt (rekursiv) auch in
471
471
  beiden Teilbaeumen.
472
472
  Hinweis: In dieser Version wird die Klasse BinaryTree nicht benutzt.
473
- `,en:"Generic binary search tree class"})),r(S,"binarySearchTreeConstructorComment1",()=>d({de:"Nach dem Aufruf des Konstruktors existiert ein leerer Binärer Suchbaum.",en:"Creates an empty binary tree."})),r(S,"binarySearchTreeIsEmptyComment",()=>d({de:"Diese Anfrage liefert den Wahrheitswert true, wenn der Binaerbaum leer ist, sonst liefert sie den Wert false.",en:"Returns true if and only if this tree is empty."})),r(S,"binarySearchTreeGetContentComment",()=>d({de:"Diese Anfrage liefert das Inhaltsobjekt des Binaerbaums. Wenn der Binaerbaum leer ist, wird null zurueckgegeben.",en:"Returns content of this tree if it's not empty."})),r(S,"binarySearchTreeGetLeftTreeComment",()=>d({de:"Diese Anfrage liefert den linken Teilbaum des Binaerbaumes. Wenn der Binaerbaum leer ist, wird null zurueckgegeben.",en:"If this tree is not empty then this method returns it's left subtree."})),r(S,"binarySearchTreeGetRightTreeComment",()=>d({de:"Diese Anfrage liefert den rechten Teilbaum des Binaerbaumes. Wenn der Binaerbaum leer ist, wird null zurueckgegeben.",en:"If this tree is not empty then this method returns it's right subtree."})),r(S,"binarySearchTreeInsertComment",()=>d({de:"Falls der Parameter null ist, geschieht nichts. Falls ein bezueglich der verwendeten Vergleichsmethode isEqual mit pContent uebereinstimmendes Objekt im geordneten binaeren Suchbau enthalten ist, passiert nichts. Achtung: hier wird davon ausgegangen, dass isEqual genau dann true liefert, wenn isLess und isGreater false liefern. Andernfalls (isLess oder isGreater) wird das Objekt pContent entsprechend der vorgegebenen Ordnungsrelation in den BinarySearchTree eingeordnet.",en:"If given pContent != null then it is inserted into this binary search tree."})),r(S,"binarySearchTreeRemoveComment",()=>d({de:"Falls ein bezueglich der verwendeten Vergleichsmethode mit pContent uebereinstimmendes Objekt im binaeren Suchbaum enthalten ist, wird dieses entfernt. Falls der Parameter null ist, aendert sich nichts.",en:"Removes given pContent from this tree if present."})),r(S,"binarySearchTreeSearchComment",()=>d({de:"Falls ein bezueglich der verwendeten Vergleichsmethode isEqual mit pContent uebereinstimmendes Objekt im binaeren Suchbaum enthalten ist, liefert die Anfrage dieses, ansonsten wird null zurueckgegeben. <br /> Falls der Parameter null ist, wird null zurueckgegeben.",en:"If this tree contains pContent, then pContent is returned, otherwise null is returned."})),r(S,"vertexClassComment",()=>d({de:"Die Klasse Vertex stellt einen einzelnen Knoten eines Graphen dar. Jedes Objekt dieser Klasse verfuegt ueber eine im Graphen eindeutige ID als String und kann diese ID zurueckliefern. Darueber hinaus kann eine Markierung gesetzt und abgefragt werden.",en:"Objects of this class represent a node in a graph. Each vertex has a (per graph) unique ID (type String). There's also a boolean field mark which you can set and get."})),r(S,"vertexConstructorComment",()=>d({de:"Ein neues Objekt vom Typ Vertex wird erstellt. Seine Markierung hat den Wert false.",en:"Creates a new vertex object with mark == false."})),r(S,"vertexGetIDComment",()=>d({de:"Die Anfrage liefert die ID des Knotens als String.",en:"Returns the id of this vertex."})),r(S,"vertexSetMarkComment",()=>d({de:"Der Auftrag setzt die Markierung des Knotens auf den Wert pMark.",en:"Sets value of field mark."})),r(S,"vertexIsMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn die Markierung des Knotens den Wert true hat, ansonsten false.",en:"Returns the value of this vertex' mark."})),r(S,"edgeClassComment",()=>d({de:"Die Klasse Edge stellt eine einzelne, ungerichtete Kante eines Graphen dar. Beim Erstellen werden die beiden durch sie zu verbindenden Knotenobjekte und eine Gewichtung als double uebergeben. Beide Knotenobjekte koennen abgefragt werden. Des Weiteren koennen die Gewichtung und eine Markierung gesetzt und abgefragt werden.",en:"Objects of class edge represent an edge of a graph."})),r(S,"edgeConstructorComment",()=>d({de:"Ein neues Objekt vom Typ Edge wird erstellt. Die von diesem Objekt repraesentierte Kante verbindet die Knoten pVertex und pAnotherVertex mit der Gewichtung pWeight. Ihre Markierung hat den Wert false.",en:"Creates a new edge-object connecting nodes pVertex and pAnotherVertex with given weight. Its mark has value false. "})),r(S,"edgeGetVerticesComment",()=>d({de:"Die Anfrage gibt die beiden Knoten, die durch die Kante verbunden werden, als neues Feld vom Typ Vertex zurueck. Das Feld hat genau zwei Eintraege mit den Indexwerten 0 und 1.",en:"Returns an array containing the two nodes that are connected by this vertex."})),r(S,"edgeSetWeightComment",()=>d({de:"Der Auftrag setzt das Gewicht der Kante auf pWeight.",en:"Sets value of field weight."})),r(S,"edgeGetWeightComment",()=>d({de:"Die Anfrage liefert das Gewicht der Kante als double.",en:"Returns weight of this edge."})),r(S,"edgeSetMarkComment",()=>d({de:"Der Auftrag setzt die Markierung der Kante auf den Wert pMark.",en:"Sets value of field mark."})),r(S,"edgeIsMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn die Markierung der Kante den Wert true hat, ansonsten false.",en:"Returns the value of this edges mark."})),r(S,"graphClassComment",()=>d({de:"Die Klasse Graph stellt einen ungerichteten, kantengewichteten Graphen dar. Es koennen Knoten- und Kantenobjekte hinzugefuegt und entfernt, flache Kopien der Knoten- und Kantenlisten des Graphen angefragt und Markierungen von Knoten und Kanten gesetzt und ueberprueft werden. Des Weiteren kann eine Liste der Nachbarn eines bestimmten Knoten, eine Liste der inzidenten Kanten eines bestimmten Knoten und die Kante von einem bestimmten Knoten zu einem anderen bestimmten Knoten angefragt werden. Abgesehen davon kann abgefragt werden, welches Knotenobjekt zu einer bestimmten ID gehoert und ob der Graph leer ist.",en:"An object of class graph represents an undirected, weighted graph."})),r(S,"graphConstructorComment",()=>d({de:"Ein Objekt vom Typ Graph wird erstellt. Der von diesem Objekt repräsentierte Graph ist leer.",en:"Creates a new empty graph object."})),r(S,"graphGetVerticesComment",()=>d({de:"Die Anfrage liefert eine neue Liste aller Knotenobjekte vom Typ List<Vertex>.",en:"Returns a list containing all vertices of this graph."})),r(S,"graphGetEdgesComment",()=>d({de:"Die Anfrage liefert eine neue Liste aller Kantenobjekte vom Typ List<Edge>.",en:"Returns a list containing all edges of this graph."})),r(S,"graphGetVertexComment",()=>d({de:"Die Anfrage liefert das Knotenobjekt mit pID als ID. Ist ein solchen Knotenobjekt nicht im Graphen enthalten, wird null zurueckgeliefert.",en:"Return vertex object with given id. Returns null if not found."})),r(S,"graphAddVertexComment",()=>d({de:"Der Auftrag fuegt den Knoten pVertex in den Graphen ein, sofern es noch keinen Knoten mit demselben ID-Eintrag wie pVertex im Graphen gibt und pVertex eine ID ungleich null hat. Ansonsten passiert nichts.",en:"Adds given vertex to this graph. Does nothing if vertex with this vertex' id is already present."})),r(S,"graphAddEdgeComment",()=>d({de:"Der Auftrag fuegt die Kante pEdge in den Graphen ein, sofern beide durch die Kante verbundenen Knoten im Graphen enthalten sind, nicht identisch sind und noch keine Kante zwischen den Knoten existiert. Ansonsten passiert nichts.",en:"Adds given edge if graph contains both it's vertices and no edge that connects them."})),r(S,"graphRemoveVertexComment",()=>d({de:"Der Auftrag entfernt den Knoten pVertex aus dem Graphen und loescht alle Kanten, die mit ihm inzident sind. Ist der Knoten pVertex nicht im Graphen enthalten, passiert nichts.",en:"Removes given Vertex and all edges adjacent to it."})),r(S,"graphRemoveEdgeComment",()=>d({de:"Der Auftrag entfernt die Kante pEdge aus dem Graphen. Ist die Kante pEdge nicht im Graphen enthalten, passiert nichts.",en:"Removes given Edge from graph."})),r(S,"graphSetAllVertexMarksComment",()=>d({de:"Der Auftrag setzt die Markierungen aller Knoten des Graphen auf pMark.",en:"Sets marks of all vertices to given value."})),r(S,"graphSetAllEdgeMarksComment",()=>d({de:"Der Auftrag setzt die Markierungen aller Kanten des Graphen auf pMark.",en:"Sets marks of all edges to given value."})),r(S,"graphAllVerticesMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn alle Knoten des Graphen mit true markiert sind, ansonsten false.",en:"Returns true if and only if all vertices of this graph have mark == true."})),r(S,"graphAllEdgesMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn alle Kanten des Graphen mit true markiert sind, ansonsten false.",en:"Returns true if and only if all edges of this graph have mark == true."})),r(S,"graphGetNeighboursComment",()=>d({de:"Die Anfrage liefert alle Nachbarn des Knotens pVertex als neue Liste vom Typ List<Vertex>. Hat der Knoten pVertex keine Nachbarn in diesem Graphen oder ist gar nicht in diesem Graphen enthalten, so wird eine leere Liste zurueckgeliefert.",en:"Returns all vertices that are connected to pVertex."})),r(S,"graphGetEdgesForVertexComment",()=>d({de:"Die Anfrage liefert eine neue Liste alle inzidenten Kanten zum Knoten pVertex. Hat der Knoten pVertex keine inzidenten Kanten in diesem Graphen oder ist gar nicht in diesem Graphen enthalten, so wird eine leere Liste zurueckgeliefert.",en:"Returns all edges connected to given vertex."})),r(S,"graphGetEdgeComment",()=>d({de:"Die Anfrage liefert die Kante, welche die Knoten pVertex und pAnotherVertex verbindet, als Objekt vom Typ Edge. Ist der Knoten pVertex oder der Knoten pAnotherVertex nicht im Graphen enthalten oder gibt es keine Kante, die beide Knoten verbindet, so wird null zurueckgeliefert.",en:"Returns edge between given vertices. Returns null if vertices are not connected."})),r(S,"graphIsEmptyComment",()=>d({de:"Die Anfrage liefert true, wenn der Graph keine Knoten enthaelt, ansonsten false.",en:"Returns true if and only if this graph contains no vertices."})),r(S,"queryResultClassComment",()=>d({de:"Ein Objekt der Klasse QueryResult stellt die Ergebnistabelle einer Datenbankanfrage mit Hilfe der Klasse DatabaseConnector dar. Objekte dieser Klasse werden nur von der Klasse DatabaseConnector erstellt. Die Klasse verfuegt ueber keinen oeffentlichen Konstruktor.",en:"An object of class QueryResult represents the result talbe of a database query."})),r(S,"queryResultGetDataComment",()=>d({de:"Die Anfrage liefert die Eintraege der Ergebnistabelle als zweidimensionales Feld vom Typ String. Der erste Index des Feldes stellt die Zeile und der zweite die Spalte dar (d.h. Object[zeile][spalte]).",en:"Returns the entries of the result table as twodimensional String[][]. First index is line, second index is column."})),r(S,"queryResultGetColumnNamesComment",()=>d({de:"Die Anfrage liefert die Bezeichner der Spalten der Ergebnistabelle als Feld vom Typ String zurueck.",en:"Returns column names of query result table."})),r(S,"queryResultGetColumnTypesComment",()=>d({de:"Die Anfrage liefert die Bezeichner der Datentypen der Spalten der Ergebnistabelle als Feld vom Typ String zurueck.",en:"Returns column types of query result table."})),r(S,"queryResultGetRowCountComment",()=>d({de:"Die Anfrage liefert die Anzahl der Zeilen der Ergebnistabelle als Integer.",en:"Returns row count of result table."})),r(S,"queryResultGetColumnCountComment",()=>d({de:"Die Anfrage liefert die Anzahl der Spalten der Ergebnistabelle als Integer.",en:"Returns column count of result table."})),r(S,"databaseConnectorClassComment",()=>d({de:"Ein Objekt der Klasse DatabaseConnector ermoeglicht die Abfrage und Manipulation einer MySQL-Datenbank. Beim Erzeugen des Objekts wird eine Datenbankverbindung aufgebaut, so dass anschließend SQL-Anweisungen an diese Datenbank gerichtet werden koennen.",en:"With an object of class DatabaseConnector you can query and manipulate a database."})),r(S,"databaseConnectorConstructorComment",()=>d({de:"Erstellt ein neues DatabaseConnector-Objekt. code ist der Zugriffscode für eine Datenbank der SQL-IDE.",en:"Creates a new DatabaseConnector object. You get the access code from the SQL-IDE."})),r(S,"databaseConnectorExecuteStatementComment",()=>d({de:"Der Auftrag schickt den im Parameter pSQLStatement enthaltenen SQL-Befehl an die Datenbank ab. Handelt es sich bei pSQLStatement um einen SQL-Befehl, der eine Ergebnismenge liefert, so kann dieses Ergebnis anschließend mit der Methode getCurrentQueryResult abgerufen werden.",en:"Sends statement to database and executes it. You may retrieve an error message with getMessage() and result table with getCurrentQueryResult()."})),r(S,"databaseConnectorGetCurrentQueryResultComment",()=>d({de:"Die Anfrage liefert das Ergebnis des letzten mit der Methode executeStatement an die Datenbank geschickten SQL-Befehls als Ob-jekt vom Typ QueryResult zurueck. Wurde bisher kein SQL-Befehl abgeschickt oder ergab der letzte Aufruf von executeStatement keine Ergebnismenge (z.B. bei einem INSERT-Befehl oder einem Syntaxfehler), so wird null geliefert. ",en:"Returns the result table from last executed statement."})),r(S,"databaseConnectorGetErrorMessageComment",()=>d({de:"Die Anfrage liefert null oder eine Fehlermeldung, die sich jeweils auf die letzte zuvor ausgefuehrte Datenbankoperation bezieht.",en:"Returns error message or null if last statement executed flawlessly."})),r(S,"databaseConnectorCloseComment",()=>d({de:"Die Datenbankverbindung wird geschlossen.",en:"Closes database connection"})),r(S,"databaseConnectorNotInEmbeddedVersionException",()=>d({de:"Aus der Embedded-IDE heraus kann keine Datenbankverbindung aufgebaut werden.",en:"You can't connect a database from online-ide embedded version."})),r(S,"connectionError",()=>d({de:"Fehler beim Aufbau der Datenbankverbindung",en:"Error connecting database"}));class By{constructor(t){r(this,"left");r(this,"right");this.content=t,this.left=new rl,this.right=new rl}}const cn=class cn extends z{constructor(){super();r(this,"node",null)}_constructor(){return this.node=null,this}_getContent(){return this._isEmpty()?null:this.node.content}_getLeftTree(){return this._isEmpty()?null:this.node.left}_getRightTree(){return this._isEmpty()?null:this.node.right}_isEmpty(){return this.node==null}_mj$insert$void$ContentType(e,i,n){n!=null&&(this._isEmpty()?this.node=new By(n):n._mj$isLess$boolean$ContentType(e,()=>{e.s.pop()?this.node.left._mj$insert$void$ContentType(e,i,n):n._mj$isGreater$boolean$ContentType(e,()=>{e.s.pop()&&this.node.right._mj$insert$void$ContentType(e,i,n)},this.node.content)},this.node.content)),i&&i()}_mj$remove$void$ContentType(e,i,n){this._isEmpty()||n==null||n._mj$isLess$boolean$ContentType(e,()=>{e.s.pop()?this.node.left._mj$remove$void$ContentType(e,i,n):n._mj$isGreater$boolean$ContentType(e,()=>{if(e.s.pop())this.node.right._mj$remove$void$ContentType(e,i,n);else if(this.node.left._isEmpty())this.node.right._isEmpty()?this.node=null:this.node=this.getNodeOfRightSuccessor();else if(this.node.right._isEmpty())this.node=this.getNodeOfLeftSuccessor();else if(this.getNodeOfRightSuccessor().left._isEmpty())this.node.content=this.getNodeOfRightSuccessor().content,this.node.right=this.getNodeOfRightSuccessor().right;else{const s=this.node.right.ancestorOfSmallRight(),a=s.node.left;this.node.content=a.node.content,s._mj$remove$void$ContentType(e,i,a.node.content)}},this.node.content)},this.node.content)}_mj$search$ContentType$ContentType(e,i,n){if(this._isEmpty()||n==null){e.s.push(null);return}else n._mj$isLess$boolean$ContentType(e,()=>{e.s.pop()?this._getLeftTree()._mj$search$ContentType$ContentType(e,i,n):n._mj$isGreater$boolean$ContentType(e,()=>{e.s.pop()?this._getRightTree()._mj$search$ContentType$ContentType(e,i,n):n._mj$isEqual$boolean$ContentType(e,()=>{e.s.pop()?e.s.push(this.node.content):e.s.push(null),i&&i()},this.node.content)},this.node.content)},this.node.content)}ancestorOfSmallRight(){return this.getNodeOfLeftSuccessor().left._isEmpty()?this:this.node.left.ancestorOfSmallRight()}getNodeOfLeftSuccessor(){return this.node.left.node}getNodeOfRightSuccessor(){return this.node.right.node}};r(cn,"__javaDeclarations",[{type:"declaration",signature:"class BinarySearchTree<ContentType extends ComparableContent<ContentType>>",comment:S.binarySearchTreeClassComment},{type:"method",signature:"BinarySearchTree()",native:cn.prototype._constructor,comment:S.binarySearchTreeConstructorComment1},{type:"method",signature:"ContentType getContent()",native:cn.prototype._getContent,comment:S.binarySearchTreeGetContentComment},{type:"method",signature:"void insert(ContentType pContent)",java:cn.prototype._mj$insert$void$ContentType,comment:S.binarySearchTreeInsertComment},{type:"method",signature:"void remove(ContentType pContent)",java:cn.prototype._mj$remove$void$ContentType,comment:S.binarySearchTreeRemoveComment},{type:"method",signature:"ContentType search(ContentType pContent)",java:cn.prototype._mj$search$ContentType$ContentType,comment:S.binarySearchTreeSearchComment},{type:"method",signature:"BinarySearchTree<ContentType> getLeftTree()",native:cn.prototype._getLeftTree,comment:S.binarySearchTreeGetLeftTreeComment},{type:"method",signature:"BinarySearchTree<ContentType> getRightTree()",native:cn.prototype._getRightTree,comment:S.binarySearchTreeGetRightTreeComment},{type:"method",signature:"boolean isEmpty()",native:cn.prototype._isEmpty,comment:S.binarySearchTreeIsEmptyComment}]),r(cn,"type");let rl=cn;class Rm{constructor(t){r(this,"left");r(this,"right");this.content=t,this.left=new sl,this.right=new sl}}const Ft=class Ft extends z{constructor(){super();r(this,"node",null)}_constructor(e,i,n){return e!=null?(this.node=new Rm(e),i!=null?this.node.left=i:this.node.left=new Ft,n!=null?this.node.right=n:this.node.right=new Ft):this.node=null,this}_setContent(e){e!=null&&(this._isEmpty()&&(this.node=new Rm(e),this.node.left=new Ft,this.node.right=new Ft),this.node.content=e)}_getContent(){return this._isEmpty()?null:this.node.content}_setLeftTree(e){!this._isEmpty()&&e!=null&&(this.node.left=e)}_setRightTree(e){!this._isEmpty()&&e!=null&&(this.node.right=e)}_getLeftTree(){return this._isEmpty()?null:this.node.left}_getRightTree(){return this._isEmpty()?null:this.node.right}_isEmpty(){return this.node==null}};r(Ft,"__javaDeclarations",[{type:"declaration",signature:"class BinaryTree<ContentType>",comment:S.binaryTreeClassComment},{type:"method",signature:"BinaryTree()",native:Ft.prototype._constructor,comment:S.binaryTreeConstructorComment1},{type:"method",signature:"BinaryTree(ContentType pContent)",native:Ft.prototype._constructor,comment:S.binaryTreeConstructorComment2},{type:"method",signature:"BinaryTree(ContentType pContent, BinaryTree<ContentType> pLeftTree, BinaryTree<ContentType> pRightTree)",native:Ft.prototype._constructor,comment:S.binaryTreeConstructorComment3},{type:"method",signature:"void setContent(ContentType pContent)",native:Ft.prototype._setContent,comment:S.binaryTreeSetContentComment},{type:"method",signature:"ContentType getContent()",native:Ft.prototype._getContent,comment:S.binaryTreeGetContentComment},{type:"method",signature:"void setLeftTree(BinaryTree<ContentType> pTree)",native:Ft.prototype._setLeftTree,comment:S.binaryTreeSetLeftTreeComment},{type:"method",signature:"void setRightTree(BinaryTree<ContentType> pTree)",native:Ft.prototype._setRightTree,comment:S.binaryTreeSetRightTreeComment},{type:"method",signature:"BinaryTree<ContentType> getLeftTree()",native:Ft.prototype._getLeftTree,comment:S.binaryTreeGetLeftTreeComment},{type:"method",signature:"BinaryTree<ContentType> getRightTree()",native:Ft.prototype._getRightTree,comment:S.binaryTreeGetRightTreeComment},{type:"method",signature:"boolean isEmpty()",native:Ft.prototype._isEmpty,comment:S.binaryTreeIsEmptyComment}]),r(Ft,"type");let sl=Ft;const Fs=class Fs extends ci{_mj$isGreater$boolean$ContentType(t,e,i){}_mj$isLess$boolean$ContentType(t,e,i){}_mj$isEqual$boolean$ContentType(t,e,i){}};r(Fs,"__javaDeclarations",[{type:"declaration",signature:"interface ComparableContent<ContentType>",comment:S.comparableContentInterfaceComment},{type:"method",signature:"boolean isGreater(ContentType pContent)",java:Fs.prototype._mj$isGreater$boolean$ContentType,comment:S.comparableContentIsGreaterComment},{type:"method",signature:"boolean isLess(ContentType pContent)",java:Fs.prototype._mj$isLess$boolean$ContentType,comment:S.comparableContentIsLessComment},{type:"method",signature:"boolean isEqual(ContentType pContent)",java:Fs.prototype._mj$isEqual$boolean$ContentType,comment:S.comparableContentIsEqualComment}]),r(Fs,"type");let Gu=Fs;const xr=class xr extends z{constructor(){super();r(this,"data",[]);r(this,"columnNames",[]);r(this,"columnTypes",[])}_constructor1(e,i,n){this.data=e,this.columnNames=i,this.columnTypes=n}_getData(){let e=[];for(let i of this.data){let n=[];e.push(n);for(let s of i)s==null&&n.push(null),n.push(s)}return e}_getColumnNames(){return this.columnNames.map(e=>e??null)}_getColumnTypes(){return this.columnTypes.map(e=>e??null)}_getColumnCount(){return this.data!=null&&this.data.length>0&&this.data[0]!=null?this.data[0].length:0}};r(xr,"__javaDeclarations",[{type:"declaration",signature:"class QueryResult",comment:S.queryResultClassComment},{type:"method",signature:"private QueryResult(string[][] pData, string[] pColumnNames, string[] pColumnTypes)",native:xr.prototype._constructor1},{type:"method",signature:"string[][] getData()",native:xr.prototype._getData,comment:S.queryResultGetDataComment},{type:"method",signature:"string[] getColumnNames()",native:xr.prototype._getColumnNames,comment:S.queryResultGetColumnNamesComment},{type:"method",signature:"string[] getColumnTypes()",native:xr.prototype._getColumnTypes,comment:S.queryResultGetColumnTypesComment},{type:"method",signature:"int getColumnCount()",native:xr.prototype._getColumnCount,comment:S.queryResultGetColumnCountComment}]),r(xr,"type");let al=xr;const Tr=class Tr extends z{constructor(){super();r(this,"ch");r(this,"message",null);r(this,"currentQueryResult")}_cj$_constructor_$DatabaseConnector$string(e,i,n){let s=e.scheduler.interpreter,a=s.getMain();if(!a||a.isEmbedded()){this.message=S.databaseConnectorNotInEmbeddedVersionException(),e.s.push(this),i&&i();return}this.ch=new nl(e.scheduler.interpreter),s.showProgramPointer(void 0,"DatabaseManager"),a.getBottomDiv().showHideDBBusyIcon(!0),e.state=B.waiting,this.ch.connect(n,l=>{a.getBottomDiv().showHideDBBusyIcon(!1),l&&(this.message=S.connectionError()+": "+l),e.s.push(this),e.state=B.running,i&&i()})}_mj$executeStatement$void$string(e,i,n){if(!this.ch){i&&i();return}e.scheduler.interpreter.showProgramPointer(void 0,"DatabaseManager"),this.ch.main.getBottomDiv().showHideDBBusyIcon(!0),e.state=B.waiting,n.trim().toLowerCase().startsWith("select")?this.ch.executeQuery(n,(s,a)=>{if(this.ch.main.getBottomDiv().showHideDBBusyIcon(!1),e.state=B.running,s){this.message=s,i&&i();return}this.currentQueryResult=new al;const l=a.values.map(c=>c.map(u=>""+u)),h=a.columns.map(c=>"String");for(let c of a.values)for(let u=0;u<c.length;u++){let g=c[u];typeof g=="number"?h[u]="Number":typeof g=="boolean"&&(h[u]="Boolean")}this.currentQueryResult._constructor1(l,a.columns,h),i&&i()}):this.ch.executeWriteStatement(n,s=>{if(this.ch.main.getBottomDiv().showHideDBBusyIcon(!1),e.state=B.running,s){this.message=s,i&&i();return}this.currentQueryResult=new al,this.currentQueryResult._constructor1([],[],[]),i&&i()})}_getCurrentQueryResult(){return this.currentQueryResult?this.currentQueryResult:null}_getErrorMessage(){return this.message}_close(){this.ch&&this.ch._close()}};r(Tr,"__javaDeclarations",[{type:"declaration",signature:"class DatabaseConnector",comment:S.databaseConnectorClassComment},{type:"method",signature:"public DatabaseConnector(string code)",java:Tr.prototype._cj$_constructor_$DatabaseConnector$string,comment:S.databaseConnectorConstructorComment},{type:"method",signature:"void executeStatement(string statement)",java:Tr.prototype._mj$executeStatement$void$string,comment:S.databaseConnectorExecuteStatementComment},{type:"method",signature:"QueryResult getCurrentQueryResult()",native:Tr.prototype._getCurrentQueryResult,comment:S.databaseConnectorGetCurrentQueryResultComment},{type:"method",signature:"string getErrorMessage()",native:Tr.prototype._getErrorMessage,comment:S.databaseConnectorGetErrorMessageComment},{type:"method",signature:"void close()",native:Tr.prototype._close,comment:S.databaseConnectorCloseComment}]),r(Tr,"type");let Ku=Tr;const Xn=class Xn extends z{constructor(){super();r(this,"vertices");r(this,"weight");r(this,"mark")}_constructor1(e,i,n){this.vertices=[e,i],this.weight=n,this.mark=!1}_isMarked(){return this.mark}_setMark(e){this.mark=e}_getVertices(){return this.vertices.slice()}_setWeight(e){this.weight=e}_getWeight(){return this.weight}};r(Xn,"__javaDeclarations",[{type:"declaration",signature:"class Edge",comment:S.edgeClassComment},{type:"method",signature:"Edge()",native:Xn.prototype._constructor1,comment:S.edgeConstructorComment},{type:"method",signature:"boolean isMarked()",native:Xn.prototype._isMarked,comment:S.edgeIsMarkedComment},{type:"method",signature:"void setMark(boolean pMark)",native:Xn.prototype._setMark,comment:S.edgeSetMarkComment},{type:"method",signature:"Vertex[] getVertices()",native:Xn.prototype._getVertices,comment:S.edgeGetVerticesComment},{type:"method",signature:"void setWeight(double pWeight)",native:Xn.prototype._setWeight,comment:S.edgeSetWeightComment},{type:"method",signature:"double getWeight(double pWeight)",native:Xn.prototype._getWeight,comment:S.edgeGetWeightComment}]),r(Xn,"type");let Hu=Xn;class kh{constructor(t){r(this,"next");this.contentObject=t}}const Qt=class Qt extends Ve{constructor(){super();r(this,"first",null);r(this,"last",null);r(this,"current",null)}_constructor(){return this}_isEmpty(){return this.first==null}_hasAccess(){return this.current!=null}_next(){this._hasAccess()&&(this.current=this.current.next)}_toFirst(){this._isEmpty()||(this.current=this.first)}_toLast(){this._isEmpty()||(this.current=this.last)}_getContent(){return this._hasAccess()?this.current.contentObject:null}_setContent(e){e!=null&&this._hasAccess()&&(this.current.contentObject=e)}_insert(e){if(e!=null){if(this._hasAccess()){const i=new kh(e);if(this.current!=this.first){const n=this._getPrevious(this.current);i.next=n.next,n.next=i}else i.next=this.first,this.first=i}else if(this._isEmpty()){const i=new kh(e);this.first=i,this.last=i}}}_append(e){if(e!=null)if(this._isEmpty())this._insert(e);else{const i=new kh(e);this.last.next=i,this.last=i}}_concat(e){e!=this&&e!=null&&!e._isEmpty()&&(this._isEmpty()?(this.first=e.first,this.last=e.last):(this.last.next=e.first,this.last=e.last),e.first=null,e.last=null,e.current=null)}_remove(){if(this._hasAccess()&&!this._isEmpty()){if(this.current==this.first)this.first=this.first.next;else{const i=this._getPrevious(this.current);this.current==this.last&&(this.last=i),i.next=this.current.next}const e=this.current.next;this.current.contentObject=null,this.current.next=null,this.current=e,this._isEmpty()&&(this.last=null)}}_getPrevious(e){if(e!=null&&e!=this.first&&!this._isEmpty()){let i=this.first;for(;i!=null&&i.next!=e;)i=i.next;return i}else return null}_mj$toString$String$(e,i){if(this.first==null){e.s.push("[]"),i&&i();return}let n=this.first.contentObject;if(typeof n=="object"||Array.isArray(n)||n==null){e._arrayOfObjectsToString(this.getElements(),()=>{e.s.push(new G(e.s.pop())),i&&i()});return}else{e.s.push(new G(e._primitiveElementOrArrayToString(this.getElements()))),i&&i();return}}getElements(){if(this.first==null)return[];const e=[];let i=this.first;for(;i!=null;)e.push(i.contentObject),i=i.next;return e}};r(Qt,"__javaDeclarations",[{type:"declaration",signature:"class List<ContentType>",comment:S.listClassComment},{type:"method",signature:"List()",native:Qt.prototype._constructor,comment:S.listClassConstructorComment},{type:"method",signature:"boolean isEmpty()",native:Qt.prototype._isEmpty,comment:S.listClassIsEmptyComment},{type:"method",signature:"boolean hasAccess()",native:Qt.prototype._hasAccess,comment:S.listClassHasAccessComment},{type:"method",signature:"void next()",native:Qt.prototype._next,comment:S.listClassNextComment},{type:"method",signature:"void toFirst()",native:Qt.prototype._toFirst,comment:S.listClassToFirstComment},{type:"method",signature:"void toLast()",native:Qt.prototype._toLast,comment:S.listClassToLastComment},{type:"method",signature:"ContentType getContent()",native:Qt.prototype._getContent,comment:S.listClassGetContentComment},{type:"method",signature:"void setContent(ContentType pContent)",native:Qt.prototype._setContent,comment:S.listClassSetContentComment},{type:"method",signature:"void insert(ContentType pContent)",native:Qt.prototype._insert,comment:S.listClassInsertComment},{type:"method",signature:"void append(ContentType pContent)",native:Qt.prototype._append,comment:S.listClassAppendComment},{type:"method",signature:"void concat(List<ContentType> pList)",native:Qt.prototype._concat,comment:S.listClassConcatComment},{type:"method",signature:"void remove()",native:Qt.prototype._remove,comment:S.listClassRemoveComment},{type:"method",signature:"String toString()",java:Qt.prototype._mj$toString$String$,comment:o.objectToStringComment}]),r(Qt,"type");let Rs=Qt;const Ct=class Ct extends z{constructor(){super();r(this,"vertices");r(this,"edges")}_constructor1(){this.vertices=[],this.edges=[]}_getVertices(){let e=new Rs;for(let i of this.vertices)e._append(i);return e}_getEdges(){let e=new Rs;for(let i of this.edges)e._append(i);return e}_getVertex(e){let i=this.vertices.find(n=>n.id==e);return i||null}_addVertex(e){e==null||e.id==null||this.vertices.find(n=>n.id==e.id)||this.vertices.push(e)}_addEdge(e){e!=null&&(e.vertices[0]==null||e.vertices[1]==null||this._getVertex(e.vertices[0].id)==e.vertices[0]&&this._getVertex(e.vertices[1].id)==e.vertices[1]&&this._getEdge(e.vertices[0],e.vertices[1])==null&&e.vertices[0]!=e.vertices[1]&&this.edges.push(e))}_removeVertex(e){this.edges=this.edges.filter(n=>n.vertices[0]!=e&&n.vertices[1]!=e);let i=this.vertices.indexOf(e);i>=0&&this.vertices.splice(i,1)}_removeEdge(e){this.edges=this.edges.filter(i=>i!=e)}_setAllVertexMarks(e){this.vertices.forEach(i=>i.mark=e)}_setAllEdgeMarks(e){this.edges.forEach(i=>i.mark=e)}_allVerticesMarked(){return typeof this.vertices.find(e=>!e.mark)>"u"}_allEdgesMarked(){return typeof this.edges.find(e=>!e.mark)>"u"}_getNeighbours(e){let i=new Rs;for(let n of this.edges)n.vertices[0]==e?i._append(n.vertices[1]):n.vertices[1]==e&&i._append(n.vertices[0]);return i}_getEdgesForVertex(e){let i=new Rs;for(let n of this.edges)(n.vertices[0]==e||n.vertices[1]==e)&&i._append(n);return i}_getEdge(e,i){for(let n of this.edges)if(n.vertices[0]==e&&n.vertices[1]==i||n.vertices[1]==e&&n.vertices[0]==i)return n;return null}_isEmpty(){return this.vertices.length==0}};r(Ct,"__javaDeclarations",[{type:"declaration",signature:"class Graph",comment:S.graphClassComment},{type:"method",signature:"Graph()",native:Ct.prototype._constructor1,comment:S.graphConstructorComment},{type:"method",signature:"List<Vertex> getVertices()",native:Ct.prototype._getVertices,comment:S.graphGetVerticesComment},{type:"method",signature:"List<Edge> getEdges()",native:Ct.prototype._getEdges,comment:S.graphGetEdgesComment},{type:"method",signature:"Vertex getVertex(string pID)",native:Ct.prototype._getVertex,comment:S.graphGetVertexComment},{type:"method",signature:"void addVertex(Vertex pVertex)",native:Ct.prototype._addVertex,comment:S.graphAddVertexComment},{type:"method",signature:"void addEdge(Edge pEdge)",native:Ct.prototype._addEdge,comment:S.graphAddEdgeComment},{type:"method",signature:"void removeVertex(Vertex pVertex)",native:Ct.prototype._removeVertex,comment:S.graphRemoveVertexComment},{type:"method",signature:"void removeEdge(Edge pEdge)",native:Ct.prototype._removeEdge,comment:S.graphRemoveEdgeComment},{type:"method",signature:"void setAllVertexMarks(boolean pMark)",native:Ct.prototype._setAllVertexMarks,comment:S.graphSetAllVertexMarksComment},{type:"method",signature:"void setAllEdgeMarks(boolean pMark)",native:Ct.prototype._setAllEdgeMarks,comment:S.graphSetAllEdgeMarksComment},{type:"method",signature:"boolean allVerticesMarked()",native:Ct.prototype._allVerticesMarked,comment:S.graphAllVerticesMarkedComment},{type:"method",signature:"boolean allEdgesMarked()",native:Ct.prototype._allEdgesMarked,comment:S.graphAllEdgesMarkedComment},{type:"method",signature:"List<Vertex> getNeighbours(Vertex pVertex)",native:Ct.prototype._getNeighbours,comment:S.graphGetNeighboursComment},{type:"method",signature:"List<Edge> getEdges(Vertex pVertex)",native:Ct.prototype._getEdgesForVertex,comment:S.graphGetEdgesForVertexComment},{type:"method",signature:"Edge getEdge(Vertex pVertex, Vertex pAnotherVertex)",native:Ct.prototype._getEdge,comment:S.graphGetEdgeComment},{type:"method",signature:"boolean isEmpty()",native:Ct.prototype._isEmpty,comment:S.graphIsEmptyComment}]),r(Ct,"type");let Uu=Ct;class Oy{constructor(t){r(this,"next",null);this.contentObject=t}}const Jn=class Jn extends Ve{constructor(){super();r(this,"head",null);r(this,"tail",null)}_constructor(){return this}_isEmpty(){return this.head==null}_enqueue(e){if(e!=null){const i=new Oy(e);this._isEmpty()?(this.head=i,this.tail=i):(this.tail.next=i,this.tail=i)}}_dequeue(){this._isEmpty()||(this.head=this.head.next,this._isEmpty()&&(this.head=null,this.tail=null))}_front(){return this._isEmpty()?null:this.head.contentObject}_mj$toString$String$(e,i){if(this.head==null){e.s.push("[]"),i&&i();return}let n=this.head.contentObject;if(typeof n=="object"||Array.isArray(n)||n==null){e._arrayOfObjectsToString(this.getElements(),()=>{e.s.push(new G(e.s.pop())),i&&i()});return}else{e.s.push(new G(e._primitiveElementOrArrayToString(this.getElements()))),i&&i();return}}getElements(){if(this.head==null)return[];const e=[];let i=this.head;for(;i!=null;)e.push(i.contentObject),i=i.next;return e}};r(Jn,"__javaDeclarations",[{type:"declaration",signature:"class Queue<ContentType>",comment:S.queueClassComment},{type:"method",signature:"Queue()",native:Jn.prototype._constructor,comment:S.queueClassConstructorComment},{type:"method",signature:"boolean isEmpty()",native:Jn.prototype._isEmpty,comment:S.queueClassIsEmptyComment},{type:"method",signature:"void enqueue(ContentType pContent)",native:Jn.prototype._enqueue,comment:S.queueClassEnqueueComment},{type:"method",signature:"void dequeue()",native:Jn.prototype._dequeue,comment:S.queueClassDequeueComment},{type:"method",signature:"ContentType front()",native:Jn.prototype._front,comment:S.queueClassFrontComment},{type:"method",signature:"String toString()",java:Jn.prototype._mj$toString$String$,comment:o.objectToStringComment}]),r(Jn,"type");let Qu=Jn;class Vy{constructor(t){r(this,"next",null);this.content=t}}const er=class er extends Ve{constructor(){super();r(this,"head",null)}_constructor(){return this}_isEmpty(){return this.head==null}_push(e){if(e!=null){const i=new Vy(e);i.next=this.head,this.head=i}}_pop(){this._isEmpty()||(this.head=this.head.next)}_top(){return this._isEmpty()?null:this.head.content}_mj$toString$String$(e,i){if(this.head==null){e.s.push("[]"),i&&i();return}let n=this.head.content;if(typeof n=="object"||Array.isArray(n)||n==null){e._arrayOfObjectsToString(this.getElements(),()=>{e.s.push(new G(e.s.pop())),i&&i()});return}else{e.s.push(new G(e._primitiveElementOrArrayToString(this.getElements()))),i&&i();return}}getElements(){if(this.head==null)return[];const e=[];let i=this.head;for(;i!=null;)e.push(i.content),i=i.next;return e}};r(er,"__javaDeclarations",[{type:"declaration",signature:"class Stack<ContentType>",comment:S.stackClassComment},{type:"method",signature:"Stack()",native:er.prototype._constructor,comment:S.stackClassConstructorComment},{type:"method",signature:"boolean isEmpty()",native:er.prototype._isEmpty,comment:S.stackClassIsEmptyComment},{type:"method",signature:"void push(ContentType pContent)",native:er.prototype._push,comment:S.stackClassPushComment},{type:"method",signature:"void pop()",native:er.prototype._pop,comment:S.stackClassPopComment},{type:"method",signature:"ContentType top()",native:er.prototype._top,comment:S.stackClassTopComment},{type:"method",signature:"String toString()",java:er.prototype._mj$toString$String$,comment:o.objectToStringComment}]),r(er,"type");let Yu=er;const rs=class rs extends z{constructor(){super();r(this,"id");r(this,"mark")}_constructor1(e){this.id=e,this.mark=!1}_getID(){return this.id}_isMarked(){return this.mark}_setMark(e){this.mark=e}};r(rs,"__javaDeclarations",[{type:"declaration",signature:"class Vertex",comment:S.vertexClassComment},{type:"method",signature:"Vertex()",native:rs.prototype._constructor1,comment:S.vertexConstructorComment},{type:"method",signature:"string getID()",native:rs.prototype._getID,comment:S.vertexGetIDComment},{type:"method",signature:"boolean isMarked()",native:rs.prototype._isMarked,comment:S.vertexIsMarkedComment},{type:"method",signature:"void setMark(boolean pMark)",native:rs.prototype._setMark,comment:S.vertexSetMarkComment}]),r(rs,"type");let Zu=rs;class Ly extends co{constructor(){super(),this.classesInterfacesEnums.push(Rs,Qu,Yu,Gu,sl,rl,Zu,Hu,Uu,al,Ku)}isReplModule(){return!1}getCodeFragments(){return[]}prepareSystemModule(t){let e=["List","ArrayList","LinkedList","Vector","Stack","Queue","Deque","CopyOnWriteArrayList"];t.classesInterfacesEnums=t.classesInterfacesEnums.filter(i=>e.indexOf(this.getName(i))<0)}}class ng{constructor(){r(this,"libraries",[{identifier:"Graphics and Games Library",description:"Graphische Klassenbibliothek für die bayerischen Informatikbücher des Cornelsen-Verlages",id:"gng"},{identifier:"Abiturklassen Nordrhein-Westfalen",description:"Klassenbibliothek zur Verwendung im Zentralabitur Nordrhein-Westfalen",id:"nrw"},{identifier:"Abiturklassen Niedersachsen",description:"Klassenbibliothek zur Verwendung im Abitur Niedersachsen",id:"niedersachsen"}]);r(this,"libraryIds",[])}addLibrariesToCompiler(t){let e=[new jy];for(let i of this.libraryIds)switch(i){case"gng":e.push(new My);break;case"nrw":e.push(new Ly);break;case"niedersachsen":e.push(new Py);break}t.setAdditionalModules(...e)}addLibraries(...t){for(let e of t)this.libraryIds.indexOf(e)<0&&this.libraryIds.push(e)}}class yi extends Ey{constructor(e,i,n){super(e);r(this,"isFolder");r(this,"parent_folder_id");r(this,"sorting_order");r(this,"readonly");r(this,"id");r(this,"owner_id");r(this,"version");r(this,"published_to");r(this,"repository_id");r(this,"has_write_permission_to_repository");r(this,"spritesheetId");r(this,"grade");r(this,"points");r(this,"comment");r(this,"files",[]);r(this,"currentlyOpenFile");r(this,"saved",!0);r(this,"pruefung_id");r(this,"userSpritesheet");r(this,"settings",{libraries:[]});this.main=i,this.owner_id=n}setLibraries(e){let i=new ng;i.addLibraries(...this.settings.libraries),i.addLibrariesToCompiler(e)}getFiles(){return this.files}getPath(e){let i=[],n;for(;n=e.parent_folder_id?this.files.find(s=>s.id==e.parent_folder_id):void 0;)i.unshift(n.name),e=n;return i}static pathsEqual(e,i){if(e.length!=i.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=i[n])return!1;return!0}removeAllFiles(){for(let e of this.files.filter(i=>i.hasMonacoModel()))e.getMonacoModel().dispose();this.files=[]}addFile(e){this.files.push(e)}removeFile(e){let i=this.files.indexOf(e);i>=0&&this.files.splice(i,1)}getWorkspaceData(e){let i={name:this.name,isFolder:this.isFolder,parent_folder_id:this.parent_folder_id,sorting_order:this.sorting_order,id:this.id,owner_id:this.owner_id,current_file_id:this.currentlyOpenFile==null?null:this.currentlyOpenFile.id,files:[],version:this.version,repository_id:this.repository_id,has_write_permission_to_repository:this.has_write_permission_to_repository,settings:JSON.stringify(this.settings),spritesheet_id:this.spritesheetId,pruefung_id:this.pruefung_id,readonly:this.readonly,grade:this.grade,points:this.points,comment:this.comment};if(e)for(let n of this.files)i.files.push(n.getFileData(this));return i}renderSynchronizeButton(e){let i=e.getIconButtonByTag("Synchronize");i||(i=e.addIconButton("img_open-change-dark",()=>{this.synchronizeWithRepository()},T.SynchronizeWorkspace(),!1),i.tag="Synchronize");let n=this.main;i.setVisible(this.repository_id!=null&&this.owner_id==n.user.id)}synchronizeWithRepository(){let e=this.main;this.repository_id!=null&&this.owner_id==e.user.id&&e.networkManager.sendUpdatesAsync(!0).then(()=>{e.synchronizationManager.synchronizeWithWorkspace(this)})}static restoreFromData(e,i){let n=e.settings!=null&&e.settings.startsWith("{")?JSON.parse(e.settings):{libraries:[]};n.libaries&&(n.libraries=n.libaries);let s=new yi(e.name,i,e.owner_id);s.id=e.id,s.isFolder=e.isFolder,s.parent_folder_id=e.parent_folder_id,s.sorting_order=e.sorting_order,s.owner_id=e.owner_id,s.version=e.version,s.repository_id=e.repository_id,s.has_write_permission_to_repository=e.has_write_permission_to_repository,s.settings=n,s.pruefung_id=e.pruefung_id,s.spritesheetId=e.spritesheet_id,s.readonly=e.readonly,s.grade=e.grade,s.points=e.points,s.comment=e.comment,s.settings.libraries==null&&(s.settings.libraries=[]);for(let a of e.files){let l=Ue.restoreFromData(i,a);s.files.push(l),a.id==e.current_file_id&&(s.currentlyOpenFile=l)}return s}findFileById(e){return this.files.find(i=>i.id==e)}getFirstFile(){if(this.files.length>0)return this.files[0]}getIdentifier(){return this.name}getModuleForMonacoModel(e){var s;if(e==null||!((s=this.main)==null?void 0:s.getCompiler()))return;for(let a of this.getFiles())if(a.getMonacoModel()==e)return this.main.getCompiler().findModuleByFile(a);let n=this.main.getRepl().getCurrentModule();if(n&&n.file instanceof Ue&&n.file.getMonacoModel()==e)return n}async ensureModuleIsCompiled(e){e.isReplModule()?this.main.getRepl().compile(e.file.getText(),!1):await this.main.getCompiler().updateSingleModuleForCodeCompletion(e)}getCurrentlyEditedModule(){let e=this.main.getMainEditor().getModel();if(e)return this.getModuleForMonacoModel(e)}getFileForMonacoModel(e){if(e!=null){for(let i of this.getFiles())if(i.getMonacoModel()==e)return i}}getCurrentlyEditedFile(){let e=this.main.getMainEditor().getModel();if(e)return this.getFileForMonacoModel(e)}disposeMonacoModels(){this.getFiles().forEach(e=>e.disposeMonacoModel())}createMonacoModels(){this.getFiles().forEach(e=>e.getMonacoModel())}getFolderContentsRecursively(e){let i=e.filter(n=>n.parent_folder_id==this.id);for(let n of i.slice())n.isFolder&&(i=i.concat(n.getFolderContentsRecursively(e)));return i}}class Dd{}r(Dd,"displayOnLeftSide",()=>d({de:"Auf der linken Seite darstellen",en:"Display on left side"})),r(Dd,"displayOnRightSide",()=>d({de:"Auf der rechten Seite darstellen",en:"Display on right side"}));class ge{}r(ge,"serverTemporarilyNotReachable",()=>d({de:"Ser Server ist temporär nicht erreichbar.",en:"Server is temporarily not reachable."})),r(ge,"chooseFile",()=>d({de:"Wählen Sie eine Datei aus!",en:"Choose a file!"})),r(ge,"yourWorkspace",()=>d({de:"Dein Workspace:",en:"Your Workspace:"})),r(ge,"withWriteAccess",()=>d({de:", mit Schreibzugriff",en:", with write access"})),r(ge,"withoutWriteAccess",()=>d({de:", ohne Schreibzugriff",en:", without write access"})),r(ge,"repoCurrentVersion",t=>d({de:"Repository (aktuelle Version "+t+"):",en:"Repository (current Version "+t+"):"})),r(ge,"synchronizeWithRepository",()=>d({de:"Synchronisieren mit Repository",en:"Synchronize with Repository"})),r(ge,"synchronizeWorkspaceWithRepository",()=>d({de:"Workspace mit Repository synchronisieren",en:"Synchronize Workspace with repository"})),r(ge,"backToCoding",()=>d({de:"Zurück zum Programmieren",en:"Back to coding"})),r(ge,"history",()=>d({de:"History:",en:"History:"})),r(ge,"repositoryCurrentVersion",()=>d({de:"Repository (aktuelle Version):",en:"Repository (current version):"})),r(ge,"showOwnWorkspace",()=>d({de:"Zeige eigenen Workspace",en:"Show own workspace"})),r(ge,"showCurrentRepoVersion",()=>d({de:"Zeige aktuelle Repository-Version",en:"Show current Repository version"})),r(ge,"saveWorkspaceChanges",()=>d({de:"Änderungen am Workspace (rot!) speichern",en:"Save workspace-changes (red!)"})),r(ge,"saveRepoChanges",()=>d({de:"Änderungen am Repository (rot!) speichern",en:"Save Repository changes (red!)"})),r(ge,"commitMessage",()=>d({de:"Beschreibe kurz die vorgenommenen Änderungen:",en:"Commit message:"})),r(ge,"OK",()=>d({de:"OK",en:"OK"}));class $i{}r($i,"withoutVersion",()=>d({de:"(ohne Version)",en:"(without version)"})),r($i,"withChanges",()=>d({de:"mit Änderungen",en:"with changes"})),r($i,"DELETED",()=>d({de:" - GELÖSCHT",en:" - DELETED"})),r($i,"synchronized",()=>d({de:"synchron",en:"identical"})),r($i,"markAsMerged",()=>d({de:'Als "merged" markieren',en:'Mark as "merged"'})),r($i,"merged",()=>d({de:"merged",en:"merged"}));class Gs{}r(Gs,"Workspace",()=>d({de:"Workspace: ",en:"Workspace: "})),r(Gs,"historyVersion",()=>d({de:"History-Version ",en:"History version"})),r(Gs,"serverNotReachable",()=>d({de:"Der Server ist nicht erreichbar!",en:"Server not reachable!"}));class Ie{}r(Ie,"all",()=>d({de:"alle",en:"alle"})),r(Ie,"private",()=>d({de:"private",en:"private"})),r(Ie,"accessableForClass",()=>d({de:"für die Klasse freigegebene",en:"accessable for whole class"})),r(Ie,"accessableForSchool",()=>d({de:"für die Schule freigegebene",en:"accessable for whole school"})),r(Ie,"caption",()=>d({de:"Checkout Repository - Workspace mit Repository verbinden",en:"Checkout Repository - connect workspace to repository"})),r(Ie,"backToCoding",()=>d({de:"Zurück zum Programmieren",en:"Back to coding"})),r(Ie,"connectThisWorkspaceToRepository",()=>d({de:"Diesen Workspace mit dem Repository verbinden:",en:"Connect this workspace to repository:"})),r(Ie,"inputRepositoryCode",()=>d({de:"Alternativ zur Auswahl unten Eingabe eines Repository-Codes:",en:"Provide repository code as alternative to choosing below:"})),r(Ie,"showTheseRepositories",()=>d({de:"Diese Repositories anzeigen:",en:"Show these repositories:"})),r(Ie,"filterSearch",()=>d({de:"Filter/Suche:",en:"Filter/search:"})),r(Ie,"createNewWorkspace",()=>d({de:"Neuen Workspace erstellen",en:"Create new workspace"})),r(Ie,"codeMustContainT",()=>d({de:"Der Code muss den Buchstaben T enthalten.",en:"Code has to contain character T."})),r(Ie,"digitPriorToTInsideCode",()=>d({de:"Im Code muss vor dem T eine Zahl stehen.",en:"Code has to contain a digit prior to character T."})),r(Ie,"newWorkspaceCreateSuccessfully",t=>d({de:"Der neue Workspace "+t+" wurde erfolgreich angelegt.",en:"New workspace "+t+" successfully created."})),r(Ie,"workspaceSuccessfullyConnectedToRepository",t=>d({de:"Der Workspace "+t+" wurde erfolgreich mit dem Repository verbunden.",en:"Workspace "+t+" successfully connected to repository."}));class et{}r(et,"nameOfRepository",()=>d({de:"Name des Repositorys:",en:"Name of repository:"})),r(et,"description",()=>d({de:"Beschreibung:",en:"Description:"})),r(et,"publishedFor",()=>d({de:"Veröffentlicht für:",en:"Published for:"})),r(et,"privateRepository",()=>d({de:"Keine Veröffentlichung (privates Repository)",en:"Private repository (not published)"})),r(et,"publishedToClassStudents",()=>d({de:"Veröffentlicht für alle Schüler/-innen der Klasse",en:"Published to students of own class"})),r(et,"publishedToClasses",()=>d({de:"Veröffentlicht für alle Schüler/-innen der unterrichteten Klassen",en:"Published to all students in all of my classes"})),r(et,"publishedToSchool",()=>d({de:"Veröffentlicht für alle Nutzer/-innen an meiner Schule",en:"Published to all users in my school"})),r(et,"createRepositoryAndConnectToWorkspace",t=>d({de:"Repository anlegen und mit Workspae "+t+" verknüpfen:",en:"Create repository and connect to workspace "+t}));class oe{}r(oe,"caption",()=>d({de:"Repository-Verwaltung",en:"Repository Management"})),r(oe,"backToCoding",()=>d({de:"Zurück zum Programmieren",en:"Back to coding"})),r(oe,"repositories",()=>d({de:"Repositories:",en:"Repositories:"})),r(oe,"owner",()=>d({de:"Eigentümer:",en:"Owner:"})),r(oe,"codeForRepoReadAccess",()=>d({de:"Code zum lesenden Zugriff aufs Repository:",en:"Repository read access code:"})),r(oe,"codeForRepoWriteAccess",()=>d({de:"Code zum schreibenden Zugriff aufs Repository:",en:"Repository write access code:"})),r(oe,"copy",()=>d({de:"Kopieren",en:"Copy"})),r(oe,"change",()=>d({de:"Ändern",en:"Change"})),r(oe,"repositoryUsers",()=>d({de:"Benutzer, die das Repository nutzen",en:"Users using this repository"})),r(oe,"writeAccess",()=>d({de:"Schreibberechtigung",en:"Write access"})),r(oe,"saveChanges",()=>d({de:"Änderungen speichern",en:"Save changes"})),r(oe,"noRepositoryPresent",()=>d({de:`Sie haben noch keine Repositories, und
473
+ `,en:"Generic binary search tree class"})),r(S,"binarySearchTreeConstructorComment1",()=>d({de:"Nach dem Aufruf des Konstruktors existiert ein leerer Binärer Suchbaum.",en:"Creates an empty binary tree."})),r(S,"binarySearchTreeIsEmptyComment",()=>d({de:"Diese Anfrage liefert den Wahrheitswert true, wenn der Binaerbaum leer ist, sonst liefert sie den Wert false.",en:"Returns true if and only if this tree is empty."})),r(S,"binarySearchTreeGetContentComment",()=>d({de:"Diese Anfrage liefert das Inhaltsobjekt des Binaerbaums. Wenn der Binaerbaum leer ist, wird null zurueckgegeben.",en:"Returns content of this tree if it's not empty."})),r(S,"binarySearchTreeGetLeftTreeComment",()=>d({de:"Diese Anfrage liefert den linken Teilbaum des Binaerbaumes. Wenn der Binaerbaum leer ist, wird null zurueckgegeben.",en:"If this tree is not empty then this method returns it's left subtree."})),r(S,"binarySearchTreeGetRightTreeComment",()=>d({de:"Diese Anfrage liefert den rechten Teilbaum des Binaerbaumes. Wenn der Binaerbaum leer ist, wird null zurueckgegeben.",en:"If this tree is not empty then this method returns it's right subtree."})),r(S,"binarySearchTreeInsertComment",()=>d({de:"Falls der Parameter null ist, geschieht nichts. Falls ein bezueglich der verwendeten Vergleichsmethode isEqual mit pContent uebereinstimmendes Objekt im geordneten binaeren Suchbau enthalten ist, passiert nichts. Achtung: hier wird davon ausgegangen, dass isEqual genau dann true liefert, wenn isLess und isGreater false liefern. Andernfalls (isLess oder isGreater) wird das Objekt pContent entsprechend der vorgegebenen Ordnungsrelation in den BinarySearchTree eingeordnet.",en:"If given pContent != null then it is inserted into this binary search tree."})),r(S,"binarySearchTreeRemoveComment",()=>d({de:"Falls ein bezueglich der verwendeten Vergleichsmethode mit pContent uebereinstimmendes Objekt im binaeren Suchbaum enthalten ist, wird dieses entfernt. Falls der Parameter null ist, aendert sich nichts.",en:"Removes given pContent from this tree if present."})),r(S,"binarySearchTreeSearchComment",()=>d({de:"Falls ein bezueglich der verwendeten Vergleichsmethode isEqual mit pContent uebereinstimmendes Objekt im binaeren Suchbaum enthalten ist, liefert die Anfrage dieses, ansonsten wird null zurueckgegeben. <br /> Falls der Parameter null ist, wird null zurueckgegeben.",en:"If this tree contains pContent, then pContent is returned, otherwise null is returned."})),r(S,"vertexClassComment",()=>d({de:"Die Klasse Vertex stellt einen einzelnen Knoten eines Graphen dar. Jedes Objekt dieser Klasse verfuegt ueber eine im Graphen eindeutige ID als String und kann diese ID zurueckliefern. Darueber hinaus kann eine Markierung gesetzt und abgefragt werden.",en:"Objects of this class represent a node in a graph. Each vertex has a (per graph) unique ID (type String). There's also a boolean field mark which you can set and get."})),r(S,"vertexConstructorComment",()=>d({de:"Ein neues Objekt vom Typ Vertex wird erstellt. Seine Markierung hat den Wert false.",en:"Creates a new vertex object with mark == false."})),r(S,"vertexGetIDComment",()=>d({de:"Die Anfrage liefert die ID des Knotens als String.",en:"Returns the id of this vertex."})),r(S,"vertexSetMarkComment",()=>d({de:"Der Auftrag setzt die Markierung des Knotens auf den Wert pMark.",en:"Sets value of field mark."})),r(S,"vertexIsMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn die Markierung des Knotens den Wert true hat, ansonsten false.",en:"Returns the value of this vertex' mark."})),r(S,"edgeClassComment",()=>d({de:"Die Klasse Edge stellt eine einzelne, ungerichtete Kante eines Graphen dar. Beim Erstellen werden die beiden durch sie zu verbindenden Knotenobjekte und eine Gewichtung als double uebergeben. Beide Knotenobjekte koennen abgefragt werden. Des Weiteren koennen die Gewichtung und eine Markierung gesetzt und abgefragt werden.",en:"Objects of class edge represent an edge of a graph."})),r(S,"edgeConstructorComment",()=>d({de:"Ein neues Objekt vom Typ Edge wird erstellt. Die von diesem Objekt repraesentierte Kante verbindet die Knoten pVertex und pAnotherVertex mit der Gewichtung pWeight. Ihre Markierung hat den Wert false.",en:"Creates a new edge-object connecting nodes pVertex and pAnotherVertex with given weight. Its mark has value false. "})),r(S,"edgeGetVerticesComment",()=>d({de:"Die Anfrage gibt die beiden Knoten, die durch die Kante verbunden werden, als neues Feld vom Typ Vertex zurueck. Das Feld hat genau zwei Eintraege mit den Indexwerten 0 und 1.",en:"Returns an array containing the two nodes that are connected by this vertex."})),r(S,"edgeSetWeightComment",()=>d({de:"Der Auftrag setzt das Gewicht der Kante auf pWeight.",en:"Sets value of field weight."})),r(S,"edgeGetWeightComment",()=>d({de:"Die Anfrage liefert das Gewicht der Kante als double.",en:"Returns weight of this edge."})),r(S,"edgeSetMarkComment",()=>d({de:"Der Auftrag setzt die Markierung der Kante auf den Wert pMark.",en:"Sets value of field mark."})),r(S,"edgeIsMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn die Markierung der Kante den Wert true hat, ansonsten false.",en:"Returns the value of this edges mark."})),r(S,"graphClassComment",()=>d({de:"Die Klasse Graph stellt einen ungerichteten, kantengewichteten Graphen dar. Es koennen Knoten- und Kantenobjekte hinzugefuegt und entfernt, flache Kopien der Knoten- und Kantenlisten des Graphen angefragt und Markierungen von Knoten und Kanten gesetzt und ueberprueft werden. Des Weiteren kann eine Liste der Nachbarn eines bestimmten Knoten, eine Liste der inzidenten Kanten eines bestimmten Knoten und die Kante von einem bestimmten Knoten zu einem anderen bestimmten Knoten angefragt werden. Abgesehen davon kann abgefragt werden, welches Knotenobjekt zu einer bestimmten ID gehoert und ob der Graph leer ist.",en:"An object of class graph represents an undirected, weighted graph."})),r(S,"graphConstructorComment",()=>d({de:"Ein Objekt vom Typ Graph wird erstellt. Der von diesem Objekt repräsentierte Graph ist leer.",en:"Creates a new empty graph object."})),r(S,"graphGetVerticesComment",()=>d({de:"Die Anfrage liefert eine neue Liste aller Knotenobjekte vom Typ List<Vertex>.",en:"Returns a list containing all vertices of this graph."})),r(S,"graphGetEdgesComment",()=>d({de:"Die Anfrage liefert eine neue Liste aller Kantenobjekte vom Typ List<Edge>.",en:"Returns a list containing all edges of this graph."})),r(S,"graphGetVertexComment",()=>d({de:"Die Anfrage liefert das Knotenobjekt mit pID als ID. Ist ein solchen Knotenobjekt nicht im Graphen enthalten, wird null zurueckgeliefert.",en:"Return vertex object with given id. Returns null if not found."})),r(S,"graphAddVertexComment",()=>d({de:"Der Auftrag fuegt den Knoten pVertex in den Graphen ein, sofern es noch keinen Knoten mit demselben ID-Eintrag wie pVertex im Graphen gibt und pVertex eine ID ungleich null hat. Ansonsten passiert nichts.",en:"Adds given vertex to this graph. Does nothing if vertex with this vertex' id is already present."})),r(S,"graphAddEdgeComment",()=>d({de:"Der Auftrag fuegt die Kante pEdge in den Graphen ein, sofern beide durch die Kante verbundenen Knoten im Graphen enthalten sind, nicht identisch sind und noch keine Kante zwischen den Knoten existiert. Ansonsten passiert nichts.",en:"Adds given edge if graph contains both it's vertices and no edge that connects them."})),r(S,"graphRemoveVertexComment",()=>d({de:"Der Auftrag entfernt den Knoten pVertex aus dem Graphen und loescht alle Kanten, die mit ihm inzident sind. Ist der Knoten pVertex nicht im Graphen enthalten, passiert nichts.",en:"Removes given Vertex and all edges adjacent to it."})),r(S,"graphRemoveEdgeComment",()=>d({de:"Der Auftrag entfernt die Kante pEdge aus dem Graphen. Ist die Kante pEdge nicht im Graphen enthalten, passiert nichts.",en:"Removes given Edge from graph."})),r(S,"graphSetAllVertexMarksComment",()=>d({de:"Der Auftrag setzt die Markierungen aller Knoten des Graphen auf pMark.",en:"Sets marks of all vertices to given value."})),r(S,"graphSetAllEdgeMarksComment",()=>d({de:"Der Auftrag setzt die Markierungen aller Kanten des Graphen auf pMark.",en:"Sets marks of all edges to given value."})),r(S,"graphAllVerticesMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn alle Knoten des Graphen mit true markiert sind, ansonsten false.",en:"Returns true if and only if all vertices of this graph have mark == true."})),r(S,"graphAllEdgesMarkedComment",()=>d({de:"Die Anfrage liefert true, wenn alle Kanten des Graphen mit true markiert sind, ansonsten false.",en:"Returns true if and only if all edges of this graph have mark == true."})),r(S,"graphGetNeighboursComment",()=>d({de:"Die Anfrage liefert alle Nachbarn des Knotens pVertex als neue Liste vom Typ List<Vertex>. Hat der Knoten pVertex keine Nachbarn in diesem Graphen oder ist gar nicht in diesem Graphen enthalten, so wird eine leere Liste zurueckgeliefert.",en:"Returns all vertices that are connected to pVertex."})),r(S,"graphGetEdgesForVertexComment",()=>d({de:"Die Anfrage liefert eine neue Liste alle inzidenten Kanten zum Knoten pVertex. Hat der Knoten pVertex keine inzidenten Kanten in diesem Graphen oder ist gar nicht in diesem Graphen enthalten, so wird eine leere Liste zurueckgeliefert.",en:"Returns all edges connected to given vertex."})),r(S,"graphGetEdgeComment",()=>d({de:"Die Anfrage liefert die Kante, welche die Knoten pVertex und pAnotherVertex verbindet, als Objekt vom Typ Edge. Ist der Knoten pVertex oder der Knoten pAnotherVertex nicht im Graphen enthalten oder gibt es keine Kante, die beide Knoten verbindet, so wird null zurueckgeliefert.",en:"Returns edge between given vertices. Returns null if vertices are not connected."})),r(S,"graphIsEmptyComment",()=>d({de:"Die Anfrage liefert true, wenn der Graph keine Knoten enthaelt, ansonsten false.",en:"Returns true if and only if this graph contains no vertices."})),r(S,"queryResultClassComment",()=>d({de:"Ein Objekt der Klasse QueryResult stellt die Ergebnistabelle einer Datenbankanfrage mit Hilfe der Klasse DatabaseConnector dar. Objekte dieser Klasse werden nur von der Klasse DatabaseConnector erstellt. Die Klasse verfuegt ueber keinen oeffentlichen Konstruktor.",en:"An object of class QueryResult represents the result talbe of a database query."})),r(S,"queryResultGetDataComment",()=>d({de:"Die Anfrage liefert die Eintraege der Ergebnistabelle als zweidimensionales Feld vom Typ String. Der erste Index des Feldes stellt die Zeile und der zweite die Spalte dar (d.h. Object[zeile][spalte]).",en:"Returns the entries of the result table as twodimensional String[][]. First index is line, second index is column."})),r(S,"queryResultGetColumnNamesComment",()=>d({de:"Die Anfrage liefert die Bezeichner der Spalten der Ergebnistabelle als Feld vom Typ String zurueck.",en:"Returns column names of query result table."})),r(S,"queryResultGetColumnTypesComment",()=>d({de:"Die Anfrage liefert die Bezeichner der Datentypen der Spalten der Ergebnistabelle als Feld vom Typ String zurueck.",en:"Returns column types of query result table."})),r(S,"queryResultGetRowCountComment",()=>d({de:"Die Anfrage liefert die Anzahl der Zeilen der Ergebnistabelle als Integer.",en:"Returns row count of result table."})),r(S,"queryResultGetColumnCountComment",()=>d({de:"Die Anfrage liefert die Anzahl der Spalten der Ergebnistabelle als Integer.",en:"Returns column count of result table."})),r(S,"databaseConnectorClassComment",()=>d({de:"Ein Objekt der Klasse DatabaseConnector ermoeglicht die Abfrage und Manipulation einer MySQL-Datenbank. Beim Erzeugen des Objekts wird eine Datenbankverbindung aufgebaut, so dass anschließend SQL-Anweisungen an diese Datenbank gerichtet werden koennen.",en:"With an object of class DatabaseConnector you can query and manipulate a database."})),r(S,"databaseConnectorConstructorComment",()=>d({de:"Erstellt ein neues DatabaseConnector-Objekt. code ist der Zugriffscode für eine Datenbank der SQL-IDE.",en:"Creates a new DatabaseConnector object. You get the access code from the SQL-IDE."})),r(S,"databaseConnectorExecuteStatementComment",()=>d({de:"Der Auftrag schickt den im Parameter pSQLStatement enthaltenen SQL-Befehl an die Datenbank ab. Handelt es sich bei pSQLStatement um einen SQL-Befehl, der eine Ergebnismenge liefert, so kann dieses Ergebnis anschließend mit der Methode getCurrentQueryResult abgerufen werden.",en:"Sends statement to database and executes it. You may retrieve an error message with getMessage() and result table with getCurrentQueryResult()."})),r(S,"databaseConnectorGetCurrentQueryResultComment",()=>d({de:"Die Anfrage liefert das Ergebnis des letzten mit der Methode executeStatement an die Datenbank geschickten SQL-Befehls als Ob-jekt vom Typ QueryResult zurueck. Wurde bisher kein SQL-Befehl abgeschickt oder ergab der letzte Aufruf von executeStatement keine Ergebnismenge (z.B. bei einem INSERT-Befehl oder einem Syntaxfehler), so wird null geliefert. ",en:"Returns the result table from last executed statement."})),r(S,"databaseConnectorGetErrorMessageComment",()=>d({de:"Die Anfrage liefert null oder eine Fehlermeldung, die sich jeweils auf die letzte zuvor ausgefuehrte Datenbankoperation bezieht.",en:"Returns error message or null if last statement executed flawlessly."})),r(S,"databaseConnectorCloseComment",()=>d({de:"Die Datenbankverbindung wird geschlossen.",en:"Closes database connection"})),r(S,"databaseConnectorNotInEmbeddedVersionException",()=>d({de:"Aus der Embedded-IDE heraus kann keine Datenbankverbindung aufgebaut werden.",en:"You can't connect a database from online-ide embedded version."})),r(S,"connectionError",()=>d({de:"Fehler beim Aufbau der Datenbankverbindung",en:"Error connecting database"}));class By{constructor(t){r(this,"left");r(this,"right");this.content=t,this.left=new rl,this.right=new rl}}const cn=class cn extends z{constructor(){super();r(this,"node",null)}_constructor(){return this.node=null,this}_getContent(){return this._isEmpty()?null:this.node.content}_getLeftTree(){return this._isEmpty()?null:this.node.left}_getRightTree(){return this._isEmpty()?null:this.node.right}_isEmpty(){return this.node==null}_mj$insert$void$ContentType(e,i,n){n!=null&&(this._isEmpty()?this.node=new By(n):n._mj$isLess$boolean$ContentType(e,()=>{e.s.pop()?this.node.left._mj$insert$void$ContentType(e,i,n):n._mj$isGreater$boolean$ContentType(e,()=>{e.s.pop()&&this.node.right._mj$insert$void$ContentType(e,i,n)},this.node.content)},this.node.content)),i&&i()}_mj$remove$void$ContentType(e,i,n){this._isEmpty()||n==null||n._mj$isLess$boolean$ContentType(e,()=>{e.s.pop()?this.node.left._mj$remove$void$ContentType(e,i,n):n._mj$isGreater$boolean$ContentType(e,()=>{if(e.s.pop())this.node.right._mj$remove$void$ContentType(e,i,n);else if(this.node.left._isEmpty())this.node.right._isEmpty()?this.node=null:this.node=this.getNodeOfRightSuccessor();else if(this.node.right._isEmpty())this.node=this.getNodeOfLeftSuccessor();else if(this.getNodeOfRightSuccessor().left._isEmpty())this.node.content=this.getNodeOfRightSuccessor().content,this.node.right=this.getNodeOfRightSuccessor().right;else{const s=this.node.right.ancestorOfSmallRight(),a=s.node.left;this.node.content=a.node.content,s._mj$remove$void$ContentType(e,i,a.node.content)}},this.node.content)},this.node.content)}_mj$search$ContentType$ContentType(e,i,n){if(this._isEmpty()||n==null){e.s.push(null);return}else n._mj$isLess$boolean$ContentType(e,()=>{e.s.pop()?this._getLeftTree()._mj$search$ContentType$ContentType(e,i,n):n._mj$isGreater$boolean$ContentType(e,()=>{e.s.pop()?this._getRightTree()._mj$search$ContentType$ContentType(e,i,n):n._mj$isEqual$boolean$ContentType(e,()=>{e.s.pop()?e.s.push(this.node.content):e.s.push(null),i&&i()},this.node.content)},this.node.content)},this.node.content)}ancestorOfSmallRight(){return this.getNodeOfLeftSuccessor().left._isEmpty()?this:this.node.left.ancestorOfSmallRight()}getNodeOfLeftSuccessor(){return this.node.left.node}getNodeOfRightSuccessor(){return this.node.right.node}};r(cn,"__javaDeclarations",[{type:"declaration",signature:"class BinarySearchTree<ContentType extends ComparableContent<ContentType>>",comment:S.binarySearchTreeClassComment},{type:"method",signature:"BinarySearchTree()",native:cn.prototype._constructor,comment:S.binarySearchTreeConstructorComment1},{type:"method",signature:"ContentType getContent()",native:cn.prototype._getContent,comment:S.binarySearchTreeGetContentComment},{type:"method",signature:"void insert(ContentType pContent)",java:cn.prototype._mj$insert$void$ContentType,comment:S.binarySearchTreeInsertComment},{type:"method",signature:"void remove(ContentType pContent)",java:cn.prototype._mj$remove$void$ContentType,comment:S.binarySearchTreeRemoveComment},{type:"method",signature:"ContentType search(ContentType pContent)",java:cn.prototype._mj$search$ContentType$ContentType,comment:S.binarySearchTreeSearchComment},{type:"method",signature:"BinarySearchTree<ContentType> getLeftTree()",native:cn.prototype._getLeftTree,comment:S.binarySearchTreeGetLeftTreeComment},{type:"method",signature:"BinarySearchTree<ContentType> getRightTree()",native:cn.prototype._getRightTree,comment:S.binarySearchTreeGetRightTreeComment},{type:"method",signature:"boolean isEmpty()",native:cn.prototype._isEmpty,comment:S.binarySearchTreeIsEmptyComment}]),r(cn,"type");let rl=cn;class Rm{constructor(t){r(this,"left");r(this,"right");this.content=t,this.left=new sl,this.right=new sl}}const Ft=class Ft extends z{constructor(){super();r(this,"node",null)}_constructor(e,i,n){return e!=null?(this.node=new Rm(e),i!=null?this.node.left=i:this.node.left=new Ft,n!=null?this.node.right=n:this.node.right=new Ft):this.node=null,this}_setContent(e){e!=null&&(this._isEmpty()&&(this.node=new Rm(e),this.node.left=new Ft,this.node.right=new Ft),this.node.content=e)}_getContent(){return this._isEmpty()?null:this.node.content}_setLeftTree(e){!this._isEmpty()&&e!=null&&(this.node.left=e)}_setRightTree(e){!this._isEmpty()&&e!=null&&(this.node.right=e)}_getLeftTree(){return this._isEmpty()?null:this.node.left}_getRightTree(){return this._isEmpty()?null:this.node.right}_isEmpty(){return this.node==null}};r(Ft,"__javaDeclarations",[{type:"declaration",signature:"class BinaryTree<ContentType>",comment:S.binaryTreeClassComment},{type:"method",signature:"BinaryTree()",native:Ft.prototype._constructor,comment:S.binaryTreeConstructorComment1},{type:"method",signature:"BinaryTree(ContentType pContent)",native:Ft.prototype._constructor,comment:S.binaryTreeConstructorComment2},{type:"method",signature:"BinaryTree(ContentType pContent, BinaryTree<ContentType> pLeftTree, BinaryTree<ContentType> pRightTree)",native:Ft.prototype._constructor,comment:S.binaryTreeConstructorComment3},{type:"method",signature:"void setContent(ContentType pContent)",native:Ft.prototype._setContent,comment:S.binaryTreeSetContentComment},{type:"method",signature:"ContentType getContent()",native:Ft.prototype._getContent,comment:S.binaryTreeGetContentComment},{type:"method",signature:"void setLeftTree(BinaryTree<ContentType> pTree)",native:Ft.prototype._setLeftTree,comment:S.binaryTreeSetLeftTreeComment},{type:"method",signature:"void setRightTree(BinaryTree<ContentType> pTree)",native:Ft.prototype._setRightTree,comment:S.binaryTreeSetRightTreeComment},{type:"method",signature:"BinaryTree<ContentType> getLeftTree()",native:Ft.prototype._getLeftTree,comment:S.binaryTreeGetLeftTreeComment},{type:"method",signature:"BinaryTree<ContentType> getRightTree()",native:Ft.prototype._getRightTree,comment:S.binaryTreeGetRightTreeComment},{type:"method",signature:"boolean isEmpty()",native:Ft.prototype._isEmpty,comment:S.binaryTreeIsEmptyComment}]),r(Ft,"type");let sl=Ft;const Fs=class Fs extends ci{_mj$isGreater$boolean$ContentType(t,e,i){}_mj$isLess$boolean$ContentType(t,e,i){}_mj$isEqual$boolean$ContentType(t,e,i){}};r(Fs,"__javaDeclarations",[{type:"declaration",signature:"interface ComparableContent<ContentType>",comment:S.comparableContentInterfaceComment},{type:"method",signature:"boolean isGreater(ContentType pContent)",java:Fs.prototype._mj$isGreater$boolean$ContentType,comment:S.comparableContentIsGreaterComment},{type:"method",signature:"boolean isLess(ContentType pContent)",java:Fs.prototype._mj$isLess$boolean$ContentType,comment:S.comparableContentIsLessComment},{type:"method",signature:"boolean isEqual(ContentType pContent)",java:Fs.prototype._mj$isEqual$boolean$ContentType,comment:S.comparableContentIsEqualComment}]),r(Fs,"type");let Gu=Fs;const xr=class xr extends z{constructor(){super();r(this,"data",[]);r(this,"columnNames",[]);r(this,"columnTypes",[])}_constructor1(e,i,n){this.data=e,this.columnNames=i,this.columnTypes=n}_getData(){let e=[];for(let i of this.data){let n=[];e.push(n);for(let s of i)s==null&&n.push(null),n.push(s)}return e}_getColumnNames(){return this.columnNames.map(e=>e??null)}_getColumnTypes(){return this.columnTypes.map(e=>e??null)}_getColumnCount(){return this.data!=null&&this.data.length>0&&this.data[0]!=null?this.data[0].length:0}};r(xr,"__javaDeclarations",[{type:"declaration",signature:"class QueryResult",comment:S.queryResultClassComment},{type:"method",signature:"private QueryResult(string[][] pData, string[] pColumnNames, string[] pColumnTypes)",native:xr.prototype._constructor1},{type:"method",signature:"string[][] getData()",native:xr.prototype._getData,comment:S.queryResultGetDataComment},{type:"method",signature:"string[] getColumnNames()",native:xr.prototype._getColumnNames,comment:S.queryResultGetColumnNamesComment},{type:"method",signature:"string[] getColumnTypes()",native:xr.prototype._getColumnTypes,comment:S.queryResultGetColumnTypesComment},{type:"method",signature:"int getColumnCount()",native:xr.prototype._getColumnCount,comment:S.queryResultGetColumnCountComment}]),r(xr,"type");let al=xr;const Tr=class Tr extends z{constructor(){super();r(this,"ch");r(this,"message",null);r(this,"currentQueryResult")}_cj$_constructor_$DatabaseConnector$string(e,i,n){let s=e.scheduler.interpreter,a=s.getMain();if(!a||a.isEmbedded()){this.message=S.databaseConnectorNotInEmbeddedVersionException(),e.s.push(this),i&&i();return}this.ch=new nl(e.scheduler.interpreter),s.showProgramPointer(void 0,"DatabaseManager"),a.getBottomDiv().showHideDBBusyIcon(!0),e.state=B.waiting,this.ch.connect(n,l=>{a.getBottomDiv().showHideDBBusyIcon(!1),l&&(this.message=S.connectionError()+": "+l),e.s.push(this),e.state=B.running,i&&i()})}_mj$executeStatement$void$string(e,i,n){if(!this.ch){i&&i();return}e.scheduler.interpreter.showProgramPointer(void 0,"DatabaseManager"),this.ch.main.getBottomDiv().showHideDBBusyIcon(!0),e.state=B.waiting,n.trim().toLowerCase().startsWith("select")?this.ch.executeQuery(n,(s,a)=>{if(this.ch.main.getBottomDiv().showHideDBBusyIcon(!1),e.state=B.running,s){this.message=s,i&&i();return}this.currentQueryResult=new al;const l=a.values.map(c=>c.map(u=>""+u)),h=a.columns.map(c=>"String");for(let c of a.values)for(let u=0;u<c.length;u++){let g=c[u];typeof g=="number"?h[u]="Number":typeof g=="boolean"&&(h[u]="Boolean")}this.currentQueryResult._constructor1(l,a.columns,h),i&&i()}):this.ch.executeWriteStatement(n,s=>{if(this.ch.main.getBottomDiv().showHideDBBusyIcon(!1),e.state=B.running,s){this.message=s,i&&i();return}this.currentQueryResult=new al,this.currentQueryResult._constructor1([],[],[]),i&&i()})}_getCurrentQueryResult(){return this.currentQueryResult?this.currentQueryResult:null}_getErrorMessage(){return this.message}_close(){this.ch&&this.ch._close()}};r(Tr,"__javaDeclarations",[{type:"declaration",signature:"class DatabaseConnector",comment:S.databaseConnectorClassComment},{type:"method",signature:"public DatabaseConnector(string code)",java:Tr.prototype._cj$_constructor_$DatabaseConnector$string,comment:S.databaseConnectorConstructorComment},{type:"method",signature:"void executeStatement(string statement)",java:Tr.prototype._mj$executeStatement$void$string,comment:S.databaseConnectorExecuteStatementComment},{type:"method",signature:"QueryResult getCurrentQueryResult()",native:Tr.prototype._getCurrentQueryResult,comment:S.databaseConnectorGetCurrentQueryResultComment},{type:"method",signature:"string getErrorMessage()",native:Tr.prototype._getErrorMessage,comment:S.databaseConnectorGetErrorMessageComment},{type:"method",signature:"void close()",native:Tr.prototype._close,comment:S.databaseConnectorCloseComment}]),r(Tr,"type");let Ku=Tr;const Xn=class Xn extends z{constructor(){super();r(this,"vertices");r(this,"weight");r(this,"mark")}_constructor1(e,i,n){this.vertices=[e,i],this.weight=n,this.mark=!1}_isMarked(){return this.mark}_setMark(e){this.mark=e}_getVertices(){return this.vertices.slice()}_setWeight(e){this.weight=e}_getWeight(){return this.weight}};r(Xn,"__javaDeclarations",[{type:"declaration",signature:"class Edge",comment:S.edgeClassComment},{type:"method",signature:"Edge()",native:Xn.prototype._constructor1,comment:S.edgeConstructorComment},{type:"method",signature:"boolean isMarked()",native:Xn.prototype._isMarked,comment:S.edgeIsMarkedComment},{type:"method",signature:"void setMark(boolean pMark)",native:Xn.prototype._setMark,comment:S.edgeSetMarkComment},{type:"method",signature:"Vertex[] getVertices()",native:Xn.prototype._getVertices,comment:S.edgeGetVerticesComment},{type:"method",signature:"void setWeight(double pWeight)",native:Xn.prototype._setWeight,comment:S.edgeSetWeightComment},{type:"method",signature:"double getWeight(double pWeight)",native:Xn.prototype._getWeight,comment:S.edgeGetWeightComment}]),r(Xn,"type");let Hu=Xn;class kh{constructor(t){r(this,"next");this.contentObject=t}}const Qt=class Qt extends Ve{constructor(){super();r(this,"first",null);r(this,"last",null);r(this,"current",null)}_constructor(){return this}_isEmpty(){return this.first==null}_hasAccess(){return this.current!=null}_next(){this._hasAccess()&&(this.current=this.current.next)}_toFirst(){this._isEmpty()||(this.current=this.first)}_toLast(){this._isEmpty()||(this.current=this.last)}_getContent(){return this._hasAccess()?this.current.contentObject:null}_setContent(e){e!=null&&this._hasAccess()&&(this.current.contentObject=e)}_insert(e){if(e!=null){if(this._hasAccess()){const i=new kh(e);if(this.current!=this.first){const n=this._getPrevious(this.current);i.next=n.next,n.next=i}else i.next=this.first,this.first=i}else if(this._isEmpty()){const i=new kh(e);this.first=i,this.last=i}}}_append(e){if(e!=null)if(this._isEmpty())this._insert(e);else{const i=new kh(e);this.last.next=i,this.last=i}}_concat(e){e!=this&&e!=null&&!e._isEmpty()&&(this._isEmpty()?(this.first=e.first,this.last=e.last):(this.last.next=e.first,this.last=e.last),e.first=null,e.last=null,e.current=null)}_remove(){if(this._hasAccess()&&!this._isEmpty()){if(this.current==this.first)this.first=this.first.next;else{const i=this._getPrevious(this.current);this.current==this.last&&(this.last=i),i.next=this.current.next}const e=this.current.next;this.current.contentObject=null,this.current.next=null,this.current=e,this._isEmpty()&&(this.last=null)}}_getPrevious(e){if(e!=null&&e!=this.first&&!this._isEmpty()){let i=this.first;for(;i!=null&&i.next!=e;)i=i.next;return i}else return null}_mj$toString$String$(e,i){if(this.first==null){e.s.push("[]"),i&&i();return}let n=this.first.contentObject;if(typeof n=="object"||Array.isArray(n)||n==null){e._arrayOfObjectsToString(this.getElements(),()=>{e.s.push(new G(e.s.pop())),i&&i()});return}else{e.s.push(new G(e._primitiveElementOrArrayToString(this.getElements()))),i&&i();return}}getElements(){if(this.first==null)return[];const e=[];let i=this.first;for(;i!=null;)e.push(i.contentObject),i=i.next;return e}};r(Qt,"__javaDeclarations",[{type:"declaration",signature:"class List<ContentType>",comment:S.listClassComment},{type:"method",signature:"List()",native:Qt.prototype._constructor,comment:S.listClassConstructorComment},{type:"method",signature:"boolean isEmpty()",native:Qt.prototype._isEmpty,comment:S.listClassIsEmptyComment},{type:"method",signature:"boolean hasAccess()",native:Qt.prototype._hasAccess,comment:S.listClassHasAccessComment},{type:"method",signature:"void next()",native:Qt.prototype._next,comment:S.listClassNextComment},{type:"method",signature:"void toFirst()",native:Qt.prototype._toFirst,comment:S.listClassToFirstComment},{type:"method",signature:"void toLast()",native:Qt.prototype._toLast,comment:S.listClassToLastComment},{type:"method",signature:"ContentType getContent()",native:Qt.prototype._getContent,comment:S.listClassGetContentComment},{type:"method",signature:"void setContent(ContentType pContent)",native:Qt.prototype._setContent,comment:S.listClassSetContentComment},{type:"method",signature:"void insert(ContentType pContent)",native:Qt.prototype._insert,comment:S.listClassInsertComment},{type:"method",signature:"void append(ContentType pContent)",native:Qt.prototype._append,comment:S.listClassAppendComment},{type:"method",signature:"void concat(List<ContentType> pList)",native:Qt.prototype._concat,comment:S.listClassConcatComment},{type:"method",signature:"void remove()",native:Qt.prototype._remove,comment:S.listClassRemoveComment},{type:"method",signature:"String toString()",java:Qt.prototype._mj$toString$String$,comment:o.objectToStringComment}]),r(Qt,"type");let Rs=Qt;const Ct=class Ct extends z{constructor(){super();r(this,"vertices");r(this,"edges")}_constructor1(){this.vertices=[],this.edges=[]}_getVertices(){let e=new Rs;for(let i of this.vertices)e._append(i);return e}_getEdges(){let e=new Rs;for(let i of this.edges)e._append(i);return e}_getVertex(e){let i=this.vertices.find(n=>n.id==e);return i||null}_addVertex(e){e==null||e.id==null||this.vertices.find(n=>n.id==e.id)||this.vertices.push(e)}_addEdge(e){e!=null&&(e.vertices[0]==null||e.vertices[1]==null||this._getVertex(e.vertices[0].id)==e.vertices[0]&&this._getVertex(e.vertices[1].id)==e.vertices[1]&&this._getEdge(e.vertices[0],e.vertices[1])==null&&e.vertices[0]!=e.vertices[1]&&this.edges.push(e))}_removeVertex(e){this.edges=this.edges.filter(n=>n.vertices[0]!=e&&n.vertices[1]!=e);let i=this.vertices.indexOf(e);i>=0&&this.vertices.splice(i,1)}_removeEdge(e){this.edges=this.edges.filter(i=>i!=e)}_setAllVertexMarks(e){this.vertices.forEach(i=>i.mark=e)}_setAllEdgeMarks(e){this.edges.forEach(i=>i.mark=e)}_allVerticesMarked(){return typeof this.vertices.find(e=>!e.mark)>"u"}_allEdgesMarked(){return typeof this.edges.find(e=>!e.mark)>"u"}_getNeighbours(e){let i=new Rs;for(let n of this.edges)n.vertices[0]==e?i._append(n.vertices[1]):n.vertices[1]==e&&i._append(n.vertices[0]);return i}_getEdgesForVertex(e){let i=new Rs;for(let n of this.edges)(n.vertices[0]==e||n.vertices[1]==e)&&i._append(n);return i}_getEdge(e,i){for(let n of this.edges)if(n.vertices[0]==e&&n.vertices[1]==i||n.vertices[1]==e&&n.vertices[0]==i)return n;return null}_isEmpty(){return this.vertices.length==0}};r(Ct,"__javaDeclarations",[{type:"declaration",signature:"class Graph",comment:S.graphClassComment},{type:"method",signature:"Graph()",native:Ct.prototype._constructor1,comment:S.graphConstructorComment},{type:"method",signature:"List<Vertex> getVertices()",native:Ct.prototype._getVertices,comment:S.graphGetVerticesComment},{type:"method",signature:"List<Edge> getEdges()",native:Ct.prototype._getEdges,comment:S.graphGetEdgesComment},{type:"method",signature:"Vertex getVertex(string pID)",native:Ct.prototype._getVertex,comment:S.graphGetVertexComment},{type:"method",signature:"void addVertex(Vertex pVertex)",native:Ct.prototype._addVertex,comment:S.graphAddVertexComment},{type:"method",signature:"void addEdge(Edge pEdge)",native:Ct.prototype._addEdge,comment:S.graphAddEdgeComment},{type:"method",signature:"void removeVertex(Vertex pVertex)",native:Ct.prototype._removeVertex,comment:S.graphRemoveVertexComment},{type:"method",signature:"void removeEdge(Edge pEdge)",native:Ct.prototype._removeEdge,comment:S.graphRemoveEdgeComment},{type:"method",signature:"void setAllVertexMarks(boolean pMark)",native:Ct.prototype._setAllVertexMarks,comment:S.graphSetAllVertexMarksComment},{type:"method",signature:"void setAllEdgeMarks(boolean pMark)",native:Ct.prototype._setAllEdgeMarks,comment:S.graphSetAllEdgeMarksComment},{type:"method",signature:"boolean allVerticesMarked()",native:Ct.prototype._allVerticesMarked,comment:S.graphAllVerticesMarkedComment},{type:"method",signature:"boolean allEdgesMarked()",native:Ct.prototype._allEdgesMarked,comment:S.graphAllEdgesMarkedComment},{type:"method",signature:"List<Vertex> getNeighbours(Vertex pVertex)",native:Ct.prototype._getNeighbours,comment:S.graphGetNeighboursComment},{type:"method",signature:"List<Edge> getEdges(Vertex pVertex)",native:Ct.prototype._getEdgesForVertex,comment:S.graphGetEdgesForVertexComment},{type:"method",signature:"Edge getEdge(Vertex pVertex, Vertex pAnotherVertex)",native:Ct.prototype._getEdge,comment:S.graphGetEdgeComment},{type:"method",signature:"boolean isEmpty()",native:Ct.prototype._isEmpty,comment:S.graphIsEmptyComment}]),r(Ct,"type");let Uu=Ct;class Oy{constructor(t){r(this,"next",null);this.contentObject=t}}const Jn=class Jn extends Ve{constructor(){super();r(this,"head",null);r(this,"tail",null)}_constructor(){return this}_isEmpty(){return this.head==null}_enqueue(e){if(e!=null){const i=new Oy(e);this._isEmpty()?(this.head=i,this.tail=i):(this.tail.next=i,this.tail=i)}}_dequeue(){this._isEmpty()||(this.head=this.head.next,this._isEmpty()&&(this.head=null,this.tail=null))}_front(){return this._isEmpty()?null:this.head.contentObject}_mj$toString$String$(e,i){if(this.head==null){e.s.push("[]"),i&&i();return}let n=this.head.contentObject;if(typeof n=="object"||Array.isArray(n)||n==null){e._arrayOfObjectsToString(this.getElements(),()=>{e.s.push(new G(e.s.pop())),i&&i()});return}else{e.s.push(new G(e._primitiveElementOrArrayToString(this.getElements()))),i&&i();return}}getElements(){if(this.head==null)return[];const e=[];let i=this.head;for(;i!=null;)e.push(i.contentObject),i=i.next;return e}};r(Jn,"__javaDeclarations",[{type:"declaration",signature:"class Queue<ContentType>",comment:S.queueClassComment},{type:"method",signature:"Queue()",native:Jn.prototype._constructor,comment:S.queueClassConstructorComment},{type:"method",signature:"boolean isEmpty()",native:Jn.prototype._isEmpty,comment:S.queueClassIsEmptyComment},{type:"method",signature:"void enqueue(ContentType pContent)",native:Jn.prototype._enqueue,comment:S.queueClassEnqueueComment},{type:"method",signature:"void dequeue()",native:Jn.prototype._dequeue,comment:S.queueClassDequeueComment},{type:"method",signature:"ContentType front()",native:Jn.prototype._front,comment:S.queueClassFrontComment},{type:"method",signature:"String toString()",java:Jn.prototype._mj$toString$String$,comment:o.objectToStringComment}]),r(Jn,"type");let Qu=Jn;class Vy{constructor(t){r(this,"next",null);this.content=t}}const er=class er extends Ve{constructor(){super();r(this,"head",null)}_constructor(){return this}_isEmpty(){return this.head==null}_push(e){if(e!=null){const i=new Vy(e);i.next=this.head,this.head=i}}_pop(){this._isEmpty()||(this.head=this.head.next)}_top(){return this._isEmpty()?null:this.head.content}_mj$toString$String$(e,i){if(this.head==null){e.s.push("[]"),i&&i();return}let n=this.head.content;if(typeof n=="object"||Array.isArray(n)||n==null){e._arrayOfObjectsToString(this.getElements(),()=>{e.s.push(new G(e.s.pop())),i&&i()});return}else{e.s.push(new G(e._primitiveElementOrArrayToString(this.getElements()))),i&&i();return}}getElements(){if(this.head==null)return[];const e=[];let i=this.head;for(;i!=null;)e.push(i.content),i=i.next;return e}};r(er,"__javaDeclarations",[{type:"declaration",signature:"class Stack<ContentType>",comment:S.stackClassComment},{type:"method",signature:"Stack()",native:er.prototype._constructor,comment:S.stackClassConstructorComment},{type:"method",signature:"boolean isEmpty()",native:er.prototype._isEmpty,comment:S.stackClassIsEmptyComment},{type:"method",signature:"void push(ContentType pContent)",native:er.prototype._push,comment:S.stackClassPushComment},{type:"method",signature:"void pop()",native:er.prototype._pop,comment:S.stackClassPopComment},{type:"method",signature:"ContentType top()",native:er.prototype._top,comment:S.stackClassTopComment},{type:"method",signature:"String toString()",java:er.prototype._mj$toString$String$,comment:o.objectToStringComment}]),r(er,"type");let Yu=er;const rs=class rs extends z{constructor(){super();r(this,"id");r(this,"mark")}_constructor1(e){return this.id=e,this.mark=!1,this}_getID(){return this.id}_isMarked(){return this.mark}_setMark(e){this.mark=e}};r(rs,"__javaDeclarations",[{type:"declaration",signature:"class Vertex",comment:S.vertexClassComment},{type:"method",signature:"Vertex(String pID)",native:rs.prototype._constructor1,comment:S.vertexConstructorComment},{type:"method",signature:"String getID()",native:rs.prototype._getID,comment:S.vertexGetIDComment},{type:"method",signature:"boolean isMarked()",native:rs.prototype._isMarked,comment:S.vertexIsMarkedComment},{type:"method",signature:"void setMark(boolean pMark)",native:rs.prototype._setMark,comment:S.vertexSetMarkComment}]),r(rs,"type");let Zu=rs;class Ly extends co{constructor(){super(),this.classesInterfacesEnums.push(Rs,Qu,Yu,Gu,sl,rl,Zu,Hu,Uu,al,Ku)}isReplModule(){return!1}getCodeFragments(){return[]}prepareSystemModule(t){let e=["List","ArrayList","LinkedList","Vector","Stack","Queue","Deque","CopyOnWriteArrayList"];t.classesInterfacesEnums=t.classesInterfacesEnums.filter(i=>e.indexOf(this.getName(i))<0)}}class ng{constructor(){r(this,"libraries",[{identifier:"Graphics and Games Library",description:"Graphische Klassenbibliothek für die bayerischen Informatikbücher des Cornelsen-Verlages",id:"gng"},{identifier:"Abiturklassen Nordrhein-Westfalen",description:"Klassenbibliothek zur Verwendung im Zentralabitur Nordrhein-Westfalen",id:"nrw"},{identifier:"Abiturklassen Niedersachsen",description:"Klassenbibliothek zur Verwendung im Abitur Niedersachsen",id:"niedersachsen"}]);r(this,"libraryIds",[])}addLibrariesToCompiler(t){let e=[new jy];for(let i of this.libraryIds)switch(i){case"gng":e.push(new My);break;case"nrw":e.push(new Ly);break;case"niedersachsen":e.push(new Py);break}t.setAdditionalModules(...e)}addLibraries(...t){for(let e of t)this.libraryIds.indexOf(e)<0&&this.libraryIds.push(e)}}class yi extends Ey{constructor(e,i,n){super(e);r(this,"isFolder");r(this,"parent_folder_id");r(this,"sorting_order");r(this,"readonly");r(this,"id");r(this,"owner_id");r(this,"version");r(this,"published_to");r(this,"repository_id");r(this,"has_write_permission_to_repository");r(this,"spritesheetId");r(this,"grade");r(this,"points");r(this,"comment");r(this,"files",[]);r(this,"currentlyOpenFile");r(this,"saved",!0);r(this,"pruefung_id");r(this,"userSpritesheet");r(this,"settings",{libraries:[]});this.main=i,this.owner_id=n}setLibraries(e){let i=new ng;i.addLibraries(...this.settings.libraries),i.addLibrariesToCompiler(e)}getFiles(){return this.files}getPath(e){let i=[],n;for(;n=e.parent_folder_id?this.files.find(s=>s.id==e.parent_folder_id):void 0;)i.unshift(n.name),e=n;return i}static pathsEqual(e,i){if(e.length!=i.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=i[n])return!1;return!0}removeAllFiles(){for(let e of this.files.filter(i=>i.hasMonacoModel()))e.getMonacoModel().dispose();this.files=[]}addFile(e){this.files.push(e)}removeFile(e){let i=this.files.indexOf(e);i>=0&&this.files.splice(i,1)}getWorkspaceData(e){let i={name:this.name,isFolder:this.isFolder,parent_folder_id:this.parent_folder_id,sorting_order:this.sorting_order,id:this.id,owner_id:this.owner_id,current_file_id:this.currentlyOpenFile==null?null:this.currentlyOpenFile.id,files:[],version:this.version,repository_id:this.repository_id,has_write_permission_to_repository:this.has_write_permission_to_repository,settings:JSON.stringify(this.settings),spritesheet_id:this.spritesheetId,pruefung_id:this.pruefung_id,readonly:this.readonly,grade:this.grade,points:this.points,comment:this.comment};if(e)for(let n of this.files)i.files.push(n.getFileData(this));return i}renderSynchronizeButton(e){let i=e.getIconButtonByTag("Synchronize");i||(i=e.addIconButton("img_open-change-dark",()=>{this.synchronizeWithRepository()},T.SynchronizeWorkspace(),!1),i.tag="Synchronize");let n=this.main;i.setVisible(this.repository_id!=null&&this.owner_id==n.user.id)}synchronizeWithRepository(){let e=this.main;this.repository_id!=null&&this.owner_id==e.user.id&&e.networkManager.sendUpdatesAsync(!0).then(()=>{e.synchronizationManager.synchronizeWithWorkspace(this)})}static restoreFromData(e,i){let n=e.settings!=null&&e.settings.startsWith("{")?JSON.parse(e.settings):{libraries:[]};n.libaries&&(n.libraries=n.libaries);let s=new yi(e.name,i,e.owner_id);s.id=e.id,s.isFolder=e.isFolder,s.parent_folder_id=e.parent_folder_id,s.sorting_order=e.sorting_order,s.owner_id=e.owner_id,s.version=e.version,s.repository_id=e.repository_id,s.has_write_permission_to_repository=e.has_write_permission_to_repository,s.settings=n,s.pruefung_id=e.pruefung_id,s.spritesheetId=e.spritesheet_id,s.readonly=e.readonly,s.grade=e.grade,s.points=e.points,s.comment=e.comment,s.settings.libraries==null&&(s.settings.libraries=[]);for(let a of e.files){let l=Ue.restoreFromData(i,a);s.files.push(l),a.id==e.current_file_id&&(s.currentlyOpenFile=l)}return s}findFileById(e){return this.files.find(i=>i.id==e)}getFirstFile(){if(this.files.length>0)return this.files[0]}getIdentifier(){return this.name}getModuleForMonacoModel(e){var s;if(e==null||!((s=this.main)==null?void 0:s.getCompiler()))return;for(let a of this.getFiles())if(a.getMonacoModel()==e)return this.main.getCompiler().findModuleByFile(a);let n=this.main.getRepl().getCurrentModule();if(n&&n.file instanceof Ue&&n.file.getMonacoModel()==e)return n}async ensureModuleIsCompiled(e){e.isReplModule()?this.main.getRepl().compile(e.file.getText(),!1):await this.main.getCompiler().updateSingleModuleForCodeCompletion(e)}getCurrentlyEditedModule(){let e=this.main.getMainEditor().getModel();if(e)return this.getModuleForMonacoModel(e)}getFileForMonacoModel(e){if(e!=null){for(let i of this.getFiles())if(i.getMonacoModel()==e)return i}}getCurrentlyEditedFile(){let e=this.main.getMainEditor().getModel();if(e)return this.getFileForMonacoModel(e)}disposeMonacoModels(){this.getFiles().forEach(e=>e.disposeMonacoModel())}createMonacoModels(){this.getFiles().forEach(e=>e.getMonacoModel())}getFolderContentsRecursively(e){let i=e.filter(n=>n.parent_folder_id==this.id);for(let n of i.slice())n.isFolder&&(i=i.concat(n.getFolderContentsRecursively(e)));return i}}class Dd{}r(Dd,"displayOnLeftSide",()=>d({de:"Auf der linken Seite darstellen",en:"Display on left side"})),r(Dd,"displayOnRightSide",()=>d({de:"Auf der rechten Seite darstellen",en:"Display on right side"}));class ge{}r(ge,"serverTemporarilyNotReachable",()=>d({de:"Ser Server ist temporär nicht erreichbar.",en:"Server is temporarily not reachable."})),r(ge,"chooseFile",()=>d({de:"Wählen Sie eine Datei aus!",en:"Choose a file!"})),r(ge,"yourWorkspace",()=>d({de:"Dein Workspace:",en:"Your Workspace:"})),r(ge,"withWriteAccess",()=>d({de:", mit Schreibzugriff",en:", with write access"})),r(ge,"withoutWriteAccess",()=>d({de:", ohne Schreibzugriff",en:", without write access"})),r(ge,"repoCurrentVersion",t=>d({de:"Repository (aktuelle Version "+t+"):",en:"Repository (current Version "+t+"):"})),r(ge,"synchronizeWithRepository",()=>d({de:"Synchronisieren mit Repository",en:"Synchronize with Repository"})),r(ge,"synchronizeWorkspaceWithRepository",()=>d({de:"Workspace mit Repository synchronisieren",en:"Synchronize Workspace with repository"})),r(ge,"backToCoding",()=>d({de:"Zurück zum Programmieren",en:"Back to coding"})),r(ge,"history",()=>d({de:"History:",en:"History:"})),r(ge,"repositoryCurrentVersion",()=>d({de:"Repository (aktuelle Version):",en:"Repository (current version):"})),r(ge,"showOwnWorkspace",()=>d({de:"Zeige eigenen Workspace",en:"Show own workspace"})),r(ge,"showCurrentRepoVersion",()=>d({de:"Zeige aktuelle Repository-Version",en:"Show current Repository version"})),r(ge,"saveWorkspaceChanges",()=>d({de:"Änderungen am Workspace (rot!) speichern",en:"Save workspace-changes (red!)"})),r(ge,"saveRepoChanges",()=>d({de:"Änderungen am Repository (rot!) speichern",en:"Save Repository changes (red!)"})),r(ge,"commitMessage",()=>d({de:"Beschreibe kurz die vorgenommenen Änderungen:",en:"Commit message:"})),r(ge,"OK",()=>d({de:"OK",en:"OK"}));class $i{}r($i,"withoutVersion",()=>d({de:"(ohne Version)",en:"(without version)"})),r($i,"withChanges",()=>d({de:"mit Änderungen",en:"with changes"})),r($i,"DELETED",()=>d({de:" - GELÖSCHT",en:" - DELETED"})),r($i,"synchronized",()=>d({de:"synchron",en:"identical"})),r($i,"markAsMerged",()=>d({de:'Als "merged" markieren',en:'Mark as "merged"'})),r($i,"merged",()=>d({de:"merged",en:"merged"}));class Gs{}r(Gs,"Workspace",()=>d({de:"Workspace: ",en:"Workspace: "})),r(Gs,"historyVersion",()=>d({de:"History-Version ",en:"History version"})),r(Gs,"serverNotReachable",()=>d({de:"Der Server ist nicht erreichbar!",en:"Server not reachable!"}));class Ie{}r(Ie,"all",()=>d({de:"alle",en:"alle"})),r(Ie,"private",()=>d({de:"private",en:"private"})),r(Ie,"accessableForClass",()=>d({de:"für die Klasse freigegebene",en:"accessable for whole class"})),r(Ie,"accessableForSchool",()=>d({de:"für die Schule freigegebene",en:"accessable for whole school"})),r(Ie,"caption",()=>d({de:"Checkout Repository - Workspace mit Repository verbinden",en:"Checkout Repository - connect workspace to repository"})),r(Ie,"backToCoding",()=>d({de:"Zurück zum Programmieren",en:"Back to coding"})),r(Ie,"connectThisWorkspaceToRepository",()=>d({de:"Diesen Workspace mit dem Repository verbinden:",en:"Connect this workspace to repository:"})),r(Ie,"inputRepositoryCode",()=>d({de:"Alternativ zur Auswahl unten Eingabe eines Repository-Codes:",en:"Provide repository code as alternative to choosing below:"})),r(Ie,"showTheseRepositories",()=>d({de:"Diese Repositories anzeigen:",en:"Show these repositories:"})),r(Ie,"filterSearch",()=>d({de:"Filter/Suche:",en:"Filter/search:"})),r(Ie,"createNewWorkspace",()=>d({de:"Neuen Workspace erstellen",en:"Create new workspace"})),r(Ie,"codeMustContainT",()=>d({de:"Der Code muss den Buchstaben T enthalten.",en:"Code has to contain character T."})),r(Ie,"digitPriorToTInsideCode",()=>d({de:"Im Code muss vor dem T eine Zahl stehen.",en:"Code has to contain a digit prior to character T."})),r(Ie,"newWorkspaceCreateSuccessfully",t=>d({de:"Der neue Workspace "+t+" wurde erfolgreich angelegt.",en:"New workspace "+t+" successfully created."})),r(Ie,"workspaceSuccessfullyConnectedToRepository",t=>d({de:"Der Workspace "+t+" wurde erfolgreich mit dem Repository verbunden.",en:"Workspace "+t+" successfully connected to repository."}));class et{}r(et,"nameOfRepository",()=>d({de:"Name des Repositorys:",en:"Name of repository:"})),r(et,"description",()=>d({de:"Beschreibung:",en:"Description:"})),r(et,"publishedFor",()=>d({de:"Veröffentlicht für:",en:"Published for:"})),r(et,"privateRepository",()=>d({de:"Keine Veröffentlichung (privates Repository)",en:"Private repository (not published)"})),r(et,"publishedToClassStudents",()=>d({de:"Veröffentlicht für alle Schüler/-innen der Klasse",en:"Published to students of own class"})),r(et,"publishedToClasses",()=>d({de:"Veröffentlicht für alle Schüler/-innen der unterrichteten Klassen",en:"Published to all students in all of my classes"})),r(et,"publishedToSchool",()=>d({de:"Veröffentlicht für alle Nutzer/-innen an meiner Schule",en:"Published to all users in my school"})),r(et,"createRepositoryAndConnectToWorkspace",t=>d({de:"Repository anlegen und mit Workspae "+t+" verknüpfen:",en:"Create repository and connect to workspace "+t}));class oe{}r(oe,"caption",()=>d({de:"Repository-Verwaltung",en:"Repository Management"})),r(oe,"backToCoding",()=>d({de:"Zurück zum Programmieren",en:"Back to coding"})),r(oe,"repositories",()=>d({de:"Repositories:",en:"Repositories:"})),r(oe,"owner",()=>d({de:"Eigentümer:",en:"Owner:"})),r(oe,"codeForRepoReadAccess",()=>d({de:"Code zum lesenden Zugriff aufs Repository:",en:"Repository read access code:"})),r(oe,"codeForRepoWriteAccess",()=>d({de:"Code zum schreibenden Zugriff aufs Repository:",en:"Repository write access code:"})),r(oe,"copy",()=>d({de:"Kopieren",en:"Copy"})),r(oe,"change",()=>d({de:"Ändern",en:"Change"})),r(oe,"repositoryUsers",()=>d({de:"Benutzer, die das Repository nutzen",en:"Users using this repository"})),r(oe,"writeAccess",()=>d({de:"Schreibberechtigung",en:"Write access"})),r(oe,"saveChanges",()=>d({de:"Änderungen speichern",en:"Save changes"})),r(oe,"noRepositoryPresent",()=>d({de:`Sie haben noch keine Repositories, und
474
474
  können daher keine verwalten.
475
475
  Tipp: Ein Repository können Sie durch Rechtsklick auf einen Workspace anlegen.`,en:`There's no repository yet, therefore none to manage.
476
476
  Hint: You may create a repository by right-clicking a workspace, then select 'create repository'.`})),r(oe,"deleteRepository",()=>d({de:"Repository löschen...",en:"Delete Repository..."})),r(oe,"cancel",()=>d({de:"Abbrechen",en:"Cancel"})),r(oe,"sureDelete",()=>d({de:"Ich bin mir sicher: löschen!",en:"I'm sure: delete!"})),r(oe,"changesNotSaved",t=>d({de:"Deine Änderungen am Repository "+t+" wurden nicht gespeichert.",en:"Your changes to repository "+t+" have not been saved."})),r(oe,"transferOwnership",(t,e)=>d({de:"Soll die Eigentümerschaft am Repository "+t+" wirklich an "+e+" übertragen werden?",en:"Transfer ownership of repository "+t+" to user "+e+"?"})),r(oe,"changesSavedSuccessfully",()=>d({de:"Die Änderungen wurden erfolgreich gespeichert.",en:"Changes have been saved successfully."})),r(oe,"error",()=>d({de:"Fehler: ",en:"Fehler: "})),r(oe,"notSaved",()=>d({de:"Der Speichervorgang wurde nicht durchgeführt.",en:"Changes have not been saved."}));class ba{constructor(t){r(this,"files",[]);r(this,"copiedFromWorkspace");r(this,"isCurrentRepositoryVersion",!1);r(this,"name");this.manager=t}hasChanges(){for(let t of this.files)if(t.state!="original")return!0;return!1}isWritable(){return this.copiedFromWorkspace!=null||this.isCurrentRepositoryVersion&&this.manager.repositoryIsWritable}copyFromWorkspace(t){return this.files=[],t.getFiles().filter(e=>!e.isFolder).forEach(e=>{this.files.push({name:e.name,path:t.getPath(e),repository_file_version:e.repository_file_version,identical_to_repository_version:e.identical_to_repository_version,idInsideRepository:e.is_copy_of_id,idInsideWorkspace:e.id,workspaceFile:e,text:e.getText().replace(/\r\n/g,`
477
477
  `),synchroWorkspace:this,state:"original",markedAsMerged:!1,originalText:e.getText(),monacoModel:null})}),this.name=Gs.Workspace()+t.name,this.copiedFromWorkspace=t,this}copyFromRepository(t,e){return this.isCurrentRepositoryVersion=e,this.files=[],t.fileEntries.forEach(i=>{this.files.push({name:i.filename,path:i.path.slice(),idInsideRepository:i.id,idInsideWorkspace:null,workspaceFile:null,repository_file_version:i.version,identical_to_repository_version:!0,text:i.text==null?null:i.text.replace(/\r\n/g,`
478
478
  `),synchroWorkspace:this,state:"original",markedAsMerged:!1,monacoModel:null})}),this.name="Repository: "+t.name+" (V "+t.version+")",this}copyFromHistoryElement(t){let e=t.getRepositoryState();return this.copyFromRepository(e,!1),this.name=Gs.historyVersion()+e.version,this}commit(t,e,i,n,s){let a={},l={},h=[];e.fileEntries.forEach(b=>a[b.id]=b),this.files.forEach(b=>{b.idInsideRepository!=null&&(l[b.idInsideRepository]=b)});let c={comment:i,name:n.user.rufname+" "+n.user.familienname,username:n.user.username,isIntermediateEntry:!1,timestamp:cp(new Date),userId:n.user.id,version:e.version+1,historyFiles:[]};for(let b of this.files){if(b.state=="deleted")continue;let A=a[b.idInsideRepository];if(A==null)b.idInsideRepository==null&&(h.push(b.committedFromFile.idInsideWorkspace),b.committedFromFile.idInsideRepository=b.committedFromFile.idInsideWorkspace,b.committedFromFile.repository_file_version=1,b.idInsideRepository=b.committedFromFile.idInsideWorkspace,b.committedFromFile.idInsideRepository=b.committedFromFile.idInsideWorkspace),c.historyFiles.push({id:b.idInsideRepository,type:"create",version:1,content:b.text,filename:b.name,path:b.path});else if(A.text!=b.text){A.version++;let k=this.getPatch(A.text,b.text);k==null?c.historyFiles.push({id:A.id,type:"intermediate",version:A.version,content:b.text,filename:b.name,path:b.path}):c.historyFiles.push({id:A.id,type:"change",version:A.version,content:k,filename:A.filename==b.name?void 0:b.name,path:yi.pathsEqual(A.path,b.path)?void 0:b.path.slice()});let C=b.committedFromFile;C!=null&&(C.repository_file_version=A.version,C.workspaceFile.repository_file_version=A.version,C.workspaceFile.setSaved(!1))}else(A.filename!=b.name||!yi.pathsEqual(A.path,b.path))&&c.historyFiles.push({id:A.id,type:"intermediate",version:A.version,filename:A.filename==b.name?void 0:b.name,path:yi.pathsEqual(A.path,b.path)?void 0:b.path.slice()})}for(let b of e.fileEntries)(l[b.id]==null||l[b.id].state=="deleted")&&c.historyFiles.push({id:b.id,type:"delete",version:b.version});let g={files:this.files.filter(b=>b.state!="deleted").map(b=>({filename:b.name,path:b.path.slice(),id:b.idInsideRepository,text:b.text,version:b.repository_file_version})),repositoryVersionBeforeCommit:e.version,repository_id:e.id,workspace_id:t.id,repositoryHistoryEntry:c,newlyVersionedFileIds:h},f=this;Re("commitFiles",g,b=>{t.getFiles().forEach(A=>{h.indexOf(A.id)>=0&&(A.is_copy_of_id=A.id,A.repository_file_version=1,A.identical_to_repository_version=!0,A.setSaved(!1))}),f.manager.currentUserSynchroWorkspace.files.forEach(A=>{let k=A.workspaceFile;k!=null&&A.text==k.getText()&&(A.repository_file_version!=k.repository_file_version||A.identical_to_repository_version!=k.identical_to_repository_version)&&(k.identical_to_repository_version=A.identical_to_repository_version,k.repository_file_version=A.repository_file_version,k.setSaved(!1)),k.is_copy_of_id!=null&&(A.idInsideRepository=k.is_copy_of_id)}),f.manager.main.networkManager.sendUpdatesAsync(!0).then(()=>{s(b.repository,null)})},b=>{s(e,b)})}getPatch(t,e){let i=new rp,n=i.patch_make(t,e),s=JSON.stringify(n),a=JSON.parse(s),l=i.patch_apply(a,t);return l==null||l[0]==null?null:l[0]==e?s:null}async writeChangesToWorkspace(){var s,a;let t=this.copiedFromWorkspace,e={},i={};t.getFiles().filter(l=>!l.isFolder).forEach(l=>{l.is_copy_of_id!=null&&(e[l.is_copy_of_id]=l)}),this.files.forEach(l=>{l.idInsideWorkspace!=null&&(i[l.idInsideWorkspace]=l)});let n=this.manager.main;for(let l of t.getFiles().filter(h=>!h.isFolder)){let h=i[l.id];h!=null&&h.state!="deleted"?(l.setText(h.monacoModel.getValue(H.EndOfLinePreference.LF,!1)),h.text=l.getText(),l.is_copy_of_id=h.idInsideRepository,l.repository_file_version=h.repository_file_version,l.identical_to_repository_version=h.identical_to_repository_version,l.setSaved(!1),this.manager.main.getCompiler().setFileDirty(l),l.name=h.name,yi.pathsEqual(t.getPath(l),h.path)||(l.parent_folder_id=await this.createPathAndReturnParentFolderId(t,h.path))):(n.networkManager.sendDeleteWorkspaceOrFileAsync("file",[l.id]).then(c=>{c||alert(Gs.serverNotReachable())}),this.files.splice(this.files.indexOf(h),1),t.removeFile(l),n.projectExplorer.fileTreeview.removeElementAndItsFolderContents(l),n.currentWorkspace==t&&((s=n.getCurrentWorkspace())==null?void 0:s.getCurrentlyEditedFile())==l&&n.projectExplorer.setFileActive(null))}for(let l of this.files)if(l.idInsideRepository!=null&&e[l.idInsideRepository]==null){let h=new Ue(this.manager.main,l.name,l.text);h.is_copy_of_id=l.idInsideRepository,h.repository_file_version=l.repository_file_version,h.identical_to_repository_version=l.identical_to_repository_version,h.parent_folder_id=await this.createPathAndReturnParentFolderId(t,l.path),t.addFile(h),await n.networkManager.sendCreateFile(h,t,n.user.id)||alert(Gs.serverNotReachable())}if(await n.networkManager.sendUpdatesAsync(!0),n.currentWorkspace==t){let l=(a=n.getCurrentWorkspace())==null?void 0:a.getCurrentlyEditedFile();n.projectExplorer.setWorkspaceActive(t,!0),t.getFiles().indexOf(l)>=0&&(n.projectExplorer.setFileActive(l),n.projectExplorer.fileTreeview.selectElement(l,!1))}t.getFiles().forEach(l=>n.getCompiler().setFileDirty(l))}async createPathAndReturnParentFolderId(t,e){let i;for(let n=0;n<e.length;n++){let s=(i==null?void 0:i.id)||null;i=t.getFiles().find(a=>a.name==e[n]&&a.isFolder&&a.parent_folder_id==s),i==null&&(i=new Ue(this.manager.main,e[n]),i.isFolder=!0,i.parent_folder_id=s,await this.manager.main.networkManager.sendCreateFile(i,t,t.owner_id))}return(i==null?void 0:i.id)||null}}const Qd=class Qd{constructor(t,e,i,n){r(this,"$historyElementDiv");this.manager=t,this.repository=e,this.repositoryHistoryEntry=i,this.historyEntryIndex=n,this.$historyElementDiv=j(null,"jo_synchro_historyElement"),this.$historyElementDiv.attr("draggable","true");let s=this;this.$historyElementDiv.on("drag",()=>{Qd.currentlyDragged=s});let a=j(null,"jo_synchro_historyElementLine1");a.append(y(`<div class="jo_synchro_he_version">V ${i.version}</div>`)),a.append(y(`<div class="jo_synchro_he_name">${i.name}</div>`)),this.$historyElementDiv.append(a);let l=j(null,"jo_synchro_historyElementLine2");l.append(y(`<div class="jo_synchro_he_timestamp">${i.timestamp}</div>`)),this.$historyElementDiv.append(l);let h=j(null,"jo_synchro_historyElementLine3");h.append(y(`<div class="jo_synchro_he_comment">${i.comment}</div>`)),this.$historyElementDiv.append(h),t.$historyScrollDiv.prepend(this.$historyElementDiv),this.$historyElementDiv.on("click contextmenu",c=>{c.preventDefault(),Vn([{caption:Dd.displayOnLeftSide(),callback:()=>{let u=new ba(this.manager).copyFromHistoryElement(this);this.manager.leftSynchroWorkspace=u,this.manager.setupSynchronizationListElements()}},{caption:Dd.displayOnRightSide(),callback:()=>{let u=new ba(this.manager).copyFromHistoryElement(this);this.manager.rightSynchroWorkspace=u,this.manager.setupSynchronizationListElements()}}],c.pageX+2,c.pageY+2)})}getRepositoryState(){let t=this.repository.historyEntries,e=this.historyEntryIndex;for(;e>0&&!t[e].isIntermediateEntry;)e--;let i=[];for(let s=e;s<=this.historyEntryIndex;s++){let a=t[s];for(let l of a.historyFiles)if(a.isIntermediateEntry)this.setIntermediateState(l,i);else switch(l.type){case"create":this.createFile(l,i);break;case"delete":this.deleteFile(l,i);break;case"change":this.changeFile(l,i);break;case"intermediate":this.setIntermediateState(l,i);break}}let n=Object.assign({},this.repository);return n.fileEntries=i,n.version=this.repositoryHistoryEntry.version,n}setIntermediateState(t,e){let i=e.find(n=>n.id==t.id);i!=null&&(i.text=t.content,i.version=t.version,t.filename&&(i.filename=t.filename),t.path&&(i.path=t.path.slice()))}changeFile(t,e){let i=e.find(n=>n.id==t.id);if(i!=null){if(t.content!=null){let n=JSON.parse(t.content),s=i.text,l=new rp().patch_apply(n,s);i.text=l[0],i.version=t.version}t.filename&&(i.filename=t.filename),t.path&&(i.path=t.path.slice())}}deleteFile(t,e){let i=e.findIndex(n=>n.id==t.id);i!=null&&e.splice(i,1)}createFile(t,e){let i={id:t.id,text:t.content,filename:t.filename,path:t.path?t.path.slice():[],version:t.version};e.push(i)}};r(Qd,"currentlyDragged");let Ao=Qd;class Fy{static deserializeRepository(t){t.files!=null&&t.files.startsWith("[")?t.fileEntries=JSON.parse(t.files):t.fileEntries=[],t.fileEntries.forEach(e=>{e.text=e.text.replace(/\r\n/g,`
479
479
  `),e.path=e.path??[]}),t.history.endsWith("]")||(t.history+="]"),t.historyEntries=JSON.parse(t.history)}static copyRepository(t,e){let i=Object.assign({},t);if(t.fileEntries!=null){i.fileEntries=[];for(let n of t.fileEntries)i.fileEntries.push(Object.assign({},n))}if(t.historyEntries!=null&&e){i.historyEntries=[];for(let n of t.historyEntries){let s=Object.assign({},n);if(n.historyFiles!=null){s.historyFiles=[];for(let a of n.historyFiles)s.historyFiles.push(Object.assign({},a))}i.historyEntries.push(s)}}return i}}class gn{constructor(t,e,i,n,s){r(this,"$leftFileDiv");r(this,"$rightFileDiv");r(this,"$buttonLeftDiv");r(this,"$buttonRightDiv");r(this,"$markAsMergedButtonDiv");r(this,"$mergedFlag");r(this,"editorState");r(this,"$buttons",[]);r(this,"pending",!1);this.manager=t,this.leftSynchroFile=e,this.rightSynchroFile=i,this.leftSynchroWorkspace=n,this.rightSynchroWorkspace=s,this.$leftFileDiv=j(null,"jo_synchro_workspaceFileDiv jo_synchro_listDiv"),this.$buttonLeftDiv=j(null,"jo_synchro_buttonDiv jo_synchro_listDiv jo_synchro_buttonLeftDiv"),this.$buttonRightDiv=j(null,"jo_synchro_buttonDiv jo_synchro_listDiv jo_synchro_buttonRightDiv"),this.$rightFileDiv=j(null,"jo_synchro_repositoryFileDiv jo_synchro_listDiv"),t.$fileListDivs[0].append(this.$leftFileDiv),t.$fileListDivs[1].append(this.$buttonLeftDiv),t.$fileListDivs[2].append(this.$buttonRightDiv),t.$fileListDivs[3].append(this.$rightFileDiv),e!=null&&e.state!="original"&&this.$leftFileDiv.addClass("jo_dirty"),i!=null&&i.state!="original"&&this.$rightFileDiv.addClass("jo_dirty");let a=[this.$leftFileDiv,this.$buttonLeftDiv,this.$buttonRightDiv,this.$rightFileDiv],l=this;for(let h of a)h.on("mouseenter",()=>{for(let c of a)c.addClass("jo_synchro_hoverLine")}),h.on("mouseleave",()=>{for(let c of a)c.removeClass("jo_synchro_hoverLine").removeClass("jo_synchro_hoverActiveLine")}),h.on("mousedown",()=>{for(let c of a)c.addClass("jo_synchro_hoverActiveLine")}),h.on("mouseup",()=>{for(let c of a)c.removeClass("jo_synchro_hoverActiveLine")}),h.on("click",()=>{l.select()});this.createLeftFileModel(),this.createRightFileModel()}select(){var e;let t=[this.$leftFileDiv,this.$buttonLeftDiv,this.$buttonRightDiv,this.$rightFileDiv];y("#jo_synchro_fileListOuter").find(".jo_synchro_activeLine").removeClass("jo_synchro_activeLine");for(let i of t)i.addClass("jo_synchro_activeLine");this.manager.lastShownSynchronizationElement!=null&&(this.manager.lastShownSynchronizationElement.editorState=this.manager.diffEditor.saveViewState()),this.manager.lastShownSynchronizationElement=this,this.setEditorModel(),this.editorState!=null&&this.manager.diffEditor.restoreViewState(this.editorState),this.manager.diffEditor.updateOptions({originalEditable:((e=this.leftSynchroFile)==null?void 0:e.originalText)!=null}),this.displayPaths()}displayPaths(){var t,e;this.manager.$pathLeftDiv.text(this.leftSynchroFile?"Pfad: /"+this.leftSynchroFile.path.join("/"):""),this.manager.$pathRightDiv.text(this.rightSynchroFile?"Pfad: /"+this.rightSynchroFile.path.join("/"):""),this.manager.$pathLeftDiv[0].classList.remove("jo_synchro_path_changed"),this.manager.$pathRightDiv[0].classList.remove("jo_synchro_path_changed"),(t=this.leftSynchroFile)!=null&&t.pathChanged&&this.manager.$pathLeftDiv[0].classList.add("jo_synchro_path_changed"),(e=this.rightSynchroFile)!=null&&e.pathChanged&&this.manager.$pathRightDiv[0].classList.add("jo_synchro_path_changed"),this.manager.$pathButtonCommitDiv.empty(),this.manager.$pathButtonUpdateDiv.empty(),this.leftSynchroFile&&this.rightSynchroFile&&!yi.pathsEqual(this.leftSynchroFile.path,this.rightSynchroFile.path)&&(this.manager.$pathButtonUpdateDiv.append(gn.makeButton("update","left",()=>{this.leftSynchroFile.path=this.rightSynchroFile.path,this.leftSynchroFile.pathChanged=!0,this.leftSynchroFile.state="changed",this.manager.onContentChanged("left"),this.displayPaths(),this.compareFilesAndAdaptGUI()},!1)),this.manager.repositoryIsWritable&&this.manager.$pathButtonCommitDiv.append(gn.makeButton("commit","right",()=>{this.rightSynchroFile.path=this.leftSynchroFile.path,this.rightSynchroFile.pathChanged=!0,this.rightSynchroFile.state="changed",this.manager.onContentChanged("right"),this.displayPaths(),this.compareFilesAndAdaptGUI()},!1)))}createRightFileModel(){this.rightSynchroFile!=null&&(this.rightSynchroFile.monacoModel=H.createModel(this.rightSynchroFile.text,"myJava"))}setEditorModel(){this.manager.lastShownSynchronizationElement==this&&this.manager.diffEditor.setModel({original:this.leftSynchroFile==null?this.getEmptyMonacoModel():this.leftSynchroFile.monacoModel,modified:this.rightSynchroFile==null?this.getEmptyMonacoModel():this.rightSynchroFile.monacoModel})}getEmptyMonacoModel(){return H.createModel("","myJava")}createLeftFileModel(){this.leftSynchroFile!=null&&(this.leftSynchroFile.monacoModel=H.createModel(this.leftSynchroFile.text,"myJava"),this.leftSynchroFile.monacoModel.onDidChangeContent(t=>{this.pending||(this.pending=!0,setTimeout(()=>{var e,i;if(this.leftSynchroFile!=null&&((e=this.leftSynchroFile)==null?void 0:e.state)!="deleted"){let n=this.leftSynchroFile.monacoModel.getValue(H.EndOfLinePreference.LF,!1);((i=this.leftSynchroFile)==null?void 0:i.originalText)!=null&&n==this.leftSynchroFile.originalText?(this.$leftFileDiv.removeClass("jo_dirty"),this.leftSynchroFile.state="original"):(this.$leftFileDiv.addClass("jo_dirty"),this.leftSynchroFile.state="changed",this.leftSynchroFile.identical_to_repository_version=!1),this.manager.onContentChanged("left"),this.leftSynchroFile.text=n,this.compareFilesAndAdaptGUI()}this.pending=!1},700))}))}onFileChanged(t){switch(t=="left"?this.createLeftFileModel():this.createRightFileModel(),this.setEditorModel(),this.compareFilesAndAdaptGUI(),t){case"left":this.leftSynchroFile!=null&&this.leftSynchroFile.state!="original"?this.$leftFileDiv.addClass("jo_dirty"):this.$leftFileDiv.removeClass("jo_dirty");break;case"right":this.rightSynchroFile!=null&&this.rightSynchroFile.state!="original"?this.$rightFileDiv.addClass("jo_dirty"):this.$rightFileDiv.removeClass("jo_dirty");break}this.manager.onContentChanged(t)}compareFilesAndAdaptGUI(){var c,u,g,f;this.emptyGUI();let t=this,e="---",i="",n=!1;if(this.leftSynchroFile!=null){let b=this.rightSynchroFile==null?!0:yi.pathsEqual(this.leftSynchroFile.path,this.rightSynchroFile.path);e=this.leftSynchroFile.name,this.leftSynchroFile.repository_file_version==null?i=$i.withoutVersion():(i="(V "+this.leftSynchroFile.repository_file_version,this.leftSynchroFile.identical_to_repository_version||((c=this.leftSynchroFile)==null?void 0:c.text)==((u=this.rightSynchroFile)==null?void 0:u.text)||(i+=`<span class="jo_synchro_withChanges"> ${$i.withChanges()}</span>`),this.rightSynchroFile!=null&&this.leftSynchroFile.synchroWorkspace.isWritable()&&this.rightSynchroFile.repository_file_version>this.leftSynchroFile.repository_file_version&&(n=!this.leftSynchroFile.markedAsMerged),b||(i+=', <span class="jo_synchro_otherPath">anderer Pfad</span>'),this.leftSynchroFile.pathChanged&&(i+=', <span class="jo_synchro_otherPath">neuer Pfad</span>'),i+=")"),this.leftSynchroFile.state=="deleted"&&(e+=$i.DELETED(),i="")}let s=this.rightSynchroFile==null?"---":this.rightSynchroFile.name,a=this.rightSynchroFile==null?"":"(V "+this.rightSynchroFile.repository_file_version+((g=this.rightSynchroFile)!=null&&g.pathChanged?', <span class="jo_synchro_otherPath">neuer Pfad</span>':"")+")";((f=this.rightSynchroFile)==null?void 0:f.state)=="deleted"&&(s+=$i.DELETED(),a="");let l=j("","jo_synchro_5px_spacer"),h=j("","jo_synchro_5px_spacer");if(this.$buttonRightDiv.append(h),this.leftSynchroFile==null)this.leftSynchroWorkspace.isWritable()&&t.rightSynchroFile.state!="deleted"&&this.$buttonLeftDiv.append(gn.makeButton("create","left",()=>{t.leftSynchroFile={name:t.rightSynchroFile.name,path:t.rightSynchroFile.path.slice(),idInsideRepository:t.rightSynchroFile.idInsideRepository,repository_file_version:t.rightSynchroFile.repository_file_version,identical_to_repository_version:!0,state:"new",markedAsMerged:!1,text:this.rightSynchroFile.text,synchroWorkspace:t.leftSynchroWorkspace,idInsideWorkspace:null,workspaceFile:null,originalText:null,monacoModel:null},t.leftSynchroWorkspace.files.push(t.leftSynchroFile),t.onFileChanged("left")},!1)),t.rightSynchroWorkspace.isWritable()&&t.rightSynchroFile.state!="deleted"&&this.$buttonRightDiv.append(gn.makeButton("delete","right",()=>{t.rightSynchroFile.state="deleted",t.onFileChanged("right")},!1));else if(this.rightSynchroFile==null)this.rightSynchroWorkspace.isWritable()&&t.leftSynchroFile.state!="deleted"&&this.$buttonRightDiv.append(gn.makeButton("create","right",()=>{t.rightSynchroFile={name:t.leftSynchroFile.name,path:t.leftSynchroFile.path.slice(),committedFromFile:t.leftSynchroWorkspace.isWritable()?t.leftSynchroFile:null,idInsideRepository:t.leftSynchroFile.idInsideRepository,repository_file_version:t.leftSynchroFile.repository_file_version==null?1:t.leftSynchroFile.repository_file_version,identical_to_repository_version:t.leftSynchroFile.identical_to_repository_version,state:"new",markedAsMerged:!1,text:this.leftSynchroFile.text,synchroWorkspace:t.rightSynchroWorkspace,idInsideWorkspace:this.leftSynchroFile.idInsideWorkspace,workspaceFile:null,originalText:null,monacoModel:null},t.rightSynchroWorkspace.files.push(t.rightSynchroFile),t.leftSynchroFile.repository_file_version=t.rightSynchroFile.repository_file_version,t.leftSynchroFile.identical_to_repository_version=!0,t.onFileChanged("right")},!1)),t.leftSynchroWorkspace.isWritable()&&t.leftSynchroFile.state!="deleted"&&this.$buttonLeftDiv.append(gn.makeButton("delete","left",()=>{t.leftSynchroFile.state="deleted",t.onFileChanged("left")},!1));else{let b=!0,A=this.leftSynchroFile.name!=this.rightSynchroFile.name,k=this.leftSynchroFile.text!=this.rightSynchroFile.text,C=A&&!k;this.leftSynchroFile.repository_file_version==this.rightSynchroFile.repository_file_version?(k||A)&&(b=!1):b=!1,b?(this.$buttonLeftDiv.append(y(`<div>${$i.synchronized()} - </div>`)),this.$buttonRightDiv.append(y(`<div> - ${$i.synchronized()}</div>`))):(this.leftSynchroWorkspace.isWritable()&&this.$buttonLeftDiv.append(gn.makeButton("update","left",()=>{t.leftSynchroFile.text=t.rightSynchroFile.text,t.leftSynchroFile.repository_file_version=t.rightSynchroFile.repository_file_version,t.leftSynchroFile.identical_to_repository_version=!0,t.leftSynchroFile.name=t.rightSynchroFile.name,t.leftSynchroFile.state="changed",t.onFileChanged("left")},C)),this.rightSynchroWorkspace.isWritable()&&!n&&this.$buttonRightDiv.append(gn.makeButton("commit","right",()=>{t.rightSynchroFile.text=t.leftSynchroFile.text,t.rightSynchroFile.name=t.leftSynchroFile.name,t.rightSynchroFile.repository_file_version++,t.leftSynchroWorkspace.isWritable()&&(t.rightSynchroFile.committedFromFile=t.leftSynchroFile),t.leftSynchroWorkspace.isWritable()&&(t.leftSynchroFile.repository_file_version=t.rightSynchroFile.repository_file_version,this.leftSynchroFile.identical_to_repository_version=!0),t.rightSynchroFile.state="changed",t.onFileChanged("right")},C)))}this.$buttonLeftDiv.append(l),this.$leftFileDiv.append(y(`<div class="jo_synchro_filename">${e}<span class="jo_synchro_fileVersion">${i}</span></div>`)),this.$rightFileDiv.append(y(`<div class="jo_synchro_filename">${s}<span class="jo_synchro_fileVersion">${a}</span></div>`)),n&&(this.$markAsMergedButtonDiv=y(`<div class="jo_synchro_button jo_synchro_markAsMergedButton">${$i.markAsMerged()}</div>`),this.$leftFileDiv.append(this.$markAsMergedButtonDiv),this.$markAsMergedButtonDiv.on("click",b=>{b.stopPropagation(),this.leftSynchroFile.markedAsMerged=!0,this.compareFilesAndAdaptGUI()})),this.leftSynchroFile!=null&&this.leftSynchroFile.markedAsMerged&&this.showMergedDiv(),this.manager.updateCenterButtons()}showMergedDiv(){let t=y(`<div class="jo_synchro_mergedDiv">${$i.merged()}</div><div class="img_errorfree"></div>`);this.$leftFileDiv.append(t)}emptyGUI(){this.$leftFileDiv.empty(),this.$rightFileDiv.empty(),this.$buttonLeftDiv.empty(),this.$buttonRightDiv.empty()}static makeButton(t,e,i,n){let s="",a="";switch(t){case"commit":s=n?"rename":"commit",a="jo_synchro_commitButton";break;case"commitAll":s="commit all",a="jo_synchro_commitButton";break;case"update":s=n?"rename":"update",a="jo_synchro_updateButton";break;case"updateAll":s="update all",a="jo_synchro_updateButton";break;case"create":s="create",a="jo_synchro_createButton";break;case"delete":s="delete",a="jo_synchro_deleteButton";break}switch(e){case"left":a+=" jo_synchro_arrowLeft";break;case"right":a+=" jo_synchro_arrowRight";break}let l=y(`<div class="jo_synchro_button ${a}">${s}</div>`);return l.on("click",h=>{h.stopPropagation(),i!=null&&i()}),l.on("mousedown",h=>{h.stopPropagation()}),l}}class _y{constructor(t){r(this,"$mainHeadingDiv");r(this,"$writeWorkspaceChangesButton");r(this,"$writeRepositoryChangesButton");r(this,"$backToWorkspaceButton");r(this,"$backToCurrentRepositoryVersionButton");r(this,"$exitButton");r(this,"$belowMainHeadingDiv");r(this,"$leftDiv");r(this,"$historyOuterDiv");r(this,"$historyScrollDiv");r(this,"$leftUpperDiv");r(this,"$pathDiv");r(this,"$pathLeftOuterDiv");r(this,"$pathLeftDiv");r(this,"$pathButtonUpdateDiv");r(this,"$pathButtonCommitDiv");r(this,"$pathRightOuterDiv");r(this,"$pathRightDiv");r(this,"$fileListHeaderOuterDiv");r(this,"$fileListHeaderDivs",[]);r(this,"$fileListHeaderContainerRight");r(this,"$updateAllButton");r(this,"$commitAllButton");r(this,"$fileListOuterDiv");r(this,"$fileListDivs",[]);r(this,"$fileListFooterDiv");r(this,"$editorDiv");r(this,"guiReady",!1);r(this,"diffEditor");r(this,"currentUserSynchroWorkspace");r(this,"currentRepositorySynchroWorkspace");r(this,"currentRepository");r(this,"leftSynchroWorkspace");r(this,"rightSynchroWorkspace");r(this,"lastShownSynchronizationElement");r(this,"synchronizationListElements",[]);r(this,"lastShownHistoryElement");r(this,"historyElements",[]);r(this,"timer");r(this,"repositoryIsWritable");this.main=t}synchronizeWithWorkspace(t){this.gainRepositoryLock(t.repository_id,e=>{e?(this.repositoryIsWritable=!0,this.attachToWorkspaceAndRepository(t),this.show(),this.timer=setInterval(()=>{this.gainRepositoryLock(this.currentRepository.id,i=>{i||(alert(ge.serverTemporarilyNotReachable()),window.history.back())})},1e4)):(this.attachToWorkspaceAndRepository(t),this.repositoryIsWritable=!1,this.show())})}gainRepositoryLock(t,e){Re("gainRepositoryLock",{repository_id:t},n=>{e(n.success)},n=>{alert(n),e(!1)})}attachToWorkspaceAndRepository(t){this.currentUserSynchroWorkspace=new ba(this).copyFromWorkspace(t),this.leftSynchroWorkspace=this.currentUserSynchroWorkspace;let e=this,i={repository_id:t.repository_id,workspace_id:t.id};Re("getRepository",i,n=>{e.attachToRepository(n.repository),n.repository.spritesheet_id&&n.repository.spritesheet_id!=t.spritesheetId&&(t.spritesheetId=n.repository.spritesheet_id,new As().initializeSpritesheetForWorkspace(t,this.main).then(()=>{for(let a of t.getFiles())this.main.getCompiler().setFileDirty(a)}))},n=>{alert(n),window.history.back()})}attachToRepository(t){this.currentRepository=t,Fy.deserializeRepository(this.currentRepository),this.currentRepositorySynchroWorkspace=new ba(this).copyFromRepository(this.currentRepository,!0),this.rightSynchroWorkspace=this.currentRepositorySynchroWorkspace,this.setupSynchronizationListElements(),this.setupHistoryElements()}setupHistoryElements(){this.$historyScrollDiv.empty(),this.historyElements=[],this.lastShownHistoryElement=null,this.currentRepository.historyEntries.forEach((t,e)=>{this.historyElements.push(new Ao(this,this.currentRepository,t,e))})}setupSynchronizationListElements(){let t=null,e=null;this.lastShownSynchronizationElement!=null&&(t=this.lastShownSynchronizationElement.leftSynchroFile,e=this.lastShownSynchronizationElement.rightSynchroFile),this.$fileListDivs.forEach(a=>a.empty()),this.synchronizationListElements.forEach(a=>a.emptyGUI()),this.synchronizationListElements=[],this.lastShownSynchronizationElement=null;let i=[],n={};if(this.leftSynchroWorkspace.files.forEach(a=>{let l={id:a.idInsideRepository,name:a.name,leftSynchroFile:a,rightSynchroFile:null};i.push(l),a.idInsideRepository!=null?n["r"+a.idInsideRepository]=l:n["w"+a.idInsideWorkspace]=l}),this.rightSynchroWorkspace.files.forEach(a=>{let l=null;a.idInsideRepository!=null?l=n["r"+a.idInsideRepository]:l=n["w"+a.idInsideWorkspace],l==null?(l={id:a.idInsideRepository,name:a.name,leftSynchroFile:null,rightSynchroFile:a},i.push(l)):l.rightSynchroFile=a}),i.sort((a,l)=>a.name.localeCompare(l.name)),i.forEach(a=>{let l=new gn(this,a.leftSynchroFile,a.rightSynchroFile,this.leftSynchroWorkspace,this.rightSynchroWorkspace);this.synchronizationListElements.push(l),l.compareFilesAndAdaptGUI()}),this.diffEditor.setModel({original:H.createModel(ge.chooseFile(),"myJava"),modified:H.createModel(ge.chooseFile(),"myJava")}),this.diffEditor.updateOptions({originalEditable:!1}),this.leftSynchroWorkspace==this.currentUserSynchroWorkspace?(this.setHeader("left",ge.yourWorkspace()),this.$backToWorkspaceButton.hide()):(this.setHeader("left",this.leftSynchroWorkspace.name+":"),this.$backToWorkspaceButton.show(),this.$writeWorkspaceChangesButton.hide()),this.rightSynchroWorkspace==this.currentRepositorySynchroWorkspace){let a=this.repositoryIsWritable?ge.withWriteAccess():ge.withoutWriteAccess();this.setHeader("right",ge.repoCurrentVersion(a)),this.$backToCurrentRepositoryVersionButton.hide()}else this.setHeader("right",this.rightSynchroWorkspace.name+":"),this.$backToCurrentRepositoryVersionButton.show(),this.$writeRepositoryChangesButton.hide();y("#jo_synchro_main_heading_text").text(`${ge.synchronizeWithRepository()} "${this.currentRepository.name}"${this.repositoryIsWritable?"":" (read-only)"}`);let s=!1;if(t!=null||e!=null){for(let a of this.synchronizationListElements)if(a.leftSynchroFile!=null&&a.leftSynchroFile==t||a.rightSynchroFile!=null&&a.rightSynchroFile==e){a.select(),s=!0;break}}!s&&this.synchronizationListElements.length>0&&this.synchronizationListElements[0].select()}show(){y("#synchronize-div").css("display","flex"),y("#main").css("visibility","hidden"),this.guiReady||this.initGUI(),this.$writeWorkspaceChangesButton.hide(),this.$writeRepositoryChangesButton.hide();let i=this;this.main.windowStateManager.registerOneTimeBackButtonListener(()=>{i.hide()})}hide(){if(y("#synchronize-div").css("display","none"),y("#main").css("visibility","visible"),clearInterval(this.timer),this.currentRepository==null)return;let i={repository_id:this.currentRepository.id};Re("leaseRepositoryLock",i,n=>{},n=>{})}initGUI(){this.guiReady=!0;let t=y("#synchronize-div"),e=this;t.append(this.$mainHeadingDiv=y(`<div id="jo_synchro_main_heading"><span id="jo_synchro_main_heading_text">${ge.synchronizeWorkspaceWithRepository()}</span></div>`),this.$belowMainHeadingDiv=j("jo_synchro_below_main_heading"));let i=j("jo_synchro_buttonsTopRight");this.$mainHeadingDiv.append(i),i.append(this.$exitButton=y(`<div id="jo_synchro_exitButton" class="jo_synchro_button">${ge.backToCoding()}</div>`)),this.$exitButton.on("click",()=>{window.history.back()}),this.$leftDiv=j("jo_synchro_leftDiv"),this.$historyOuterDiv=j("jo_synchro_historyOuterDiv"),this.$historyOuterDiv.append(y(`<div id="jo_synchro_historyHeader"><div class="jo_synchro_tabHeading">${ge.history()}</div></div>)`)),this.$belowMainHeadingDiv.append(this.$leftDiv,this.$historyOuterDiv),new Pr(this.$historyOuterDiv[0],!0,!1,()=>{this.diffEditor.layout()}).sliderDiv.style.left="-3px",this.$historyOuterDiv.find(".joe_slider").css("position","absolute"),this.$historyScrollDiv=j("historyScrollDiv","jo_scrollable"),this.$historyOuterDiv.append(this.$historyScrollDiv),this.$leftDiv.append(this.$leftUpperDiv=j("jo_synchro_leftUpper"),this.$pathDiv=j("jo_synchro_pathDiv","jo_scrollable"),this.$editorDiv=j("jo_synchro_editor")),this.$leftUpperDiv.append(this.$fileListHeaderOuterDiv=j("jo_synchro_fileListHeaderOuter"),this.$fileListOuterDiv=j("jo_synchro_fileListOuter","jo_scrollable"),this.$fileListFooterDiv=j("jo_synchro_fileListFooter")),this.$fileListHeaderContainerRight=j(null,"jo_synchro_fileListHeaderContainerRight");let n=j(null,"jo_synchro_fileListHeader");this.$fileListHeaderContainerRight.append(n);let s=j(null,"jo_synchro_fileListHeaderCenter");s.append(this.$updateAllButton=gn.makeButton("updateAll","left",()=>{e.updateAll()},!1)),s.append(this.$commitAllButton=gn.makeButton("commitAll","right",()=>{e.commitAll()},!1)),this.$fileListHeaderDivs.push(j(null,"jo_synchro_fileListHeader","",{flex:"2 0"}),s,this.$fileListHeaderContainerRight,j(null,"jo_synchro_scrollbarPlaceholder")),this.$fileListDivs.push(j(null,"jo_synchro_fileList"),j(null,"jo_synchro_fileListButtonsLeft"),j(null,"jo_synchro_fileListButtonsRight"),j(null,"jo_synchro_fileList")),this.$fileListHeaderOuterDiv.append(this.$fileListHeaderDivs),this.$fileListOuterDiv.append(this.$fileListDivs),this.$fileListHeaderDivs[0].append(`<div class='jo_synchro_tabHeading'>${ge.yourWorkspace()}</div>`),n.append(`<div class='jo_synchro_tabHeading'>${ge.repositoryCurrentVersion()}</div>`),this.$fileListHeaderDivs[0].append(this.$backToWorkspaceButton=y(`<div class="jo_synchro_button jo_synchro_backToButton">${ge.showOwnWorkspace()}</div>`)),this.$backToWorkspaceButton.on("click",()=>{e.backToWorkspace()}),this.$backToWorkspaceButton.hide(),n.append(this.$backToCurrentRepositoryVersionButton=y(`<div class="jo_synchro_button jo_synchro_backToButton">${ge.showCurrentRepoVersion()}</div>`)),this.$backToCurrentRepositoryVersionButton.on("click",()=>{e.backToCurrentRepositoryVersion()}),this.$backToWorkspaceButton.hide(),this.$fileListHeaderDivs[0].append(this.$writeWorkspaceChangesButton=y(`<div id="jo_synchro_writeChangesButton" class="jo_synchro_button">${ge.saveWorkspaceChanges()}</div>`)),this.$writeWorkspaceChangesButton.on("click",()=>{e.writeWorkspaceChanges()}),this.$writeWorkspaceChangesButton.hide(),n.append(this.$writeRepositoryChangesButton=y(`<div id="jo_synchro_writeChangesButton" class="jo_synchro_button">${ge.saveRepoChanges()}</div>`)),this.$writeRepositoryChangesButton.on("click",()=>{e.writeRepositoryChanges()}),this.$writeRepositoryChangesButton.hide(),this.$pathDiv.append(this.$pathLeftOuterDiv=y('<div id="jo_synchro_pathLeftOuterDiv" class="jo_synchro_fileList"></div>'),this.$pathButtonUpdateDiv=y('<div id="jo_synchro_pathButtonsDiv" class="jo_synchro_fileListButtonsLeft"></div>'),this.$pathButtonCommitDiv=y('<div id="jo_synchro_pathButtonsDiv" class="jo_synchro_fileListButtonsRight"></div>'),this.$pathRightOuterDiv=y('<div id="jo_synchro_pathRightOuterDiv" class="jo_synchro_fileList"></div>')),this.$pathLeftOuterDiv.append(this.$pathLeftDiv=y('<div class="jo_synchro_path"></div>')),this.$pathRightOuterDiv.append(this.$pathRightDiv=y('<div class="jo_synchro_path"></div>')),new Pr(this.$editorDiv[0],!0,!0,()=>{this.diffEditor.layout()}).setColor("var(--slider)"),this.makeDroppable("left",this.$fileListDivs[0]),this.makeDroppable("right",this.$fileListDivs[3]),this.initEditor(),ep(t[0],t[0],{forceListen:!1,dragThresholdPixels:5,isPressHoldMode:!0,pressHoldDelayMS:100})}backToWorkspace(){this.leftSynchroWorkspace=this.currentUserSynchroWorkspace,this.setupSynchronizationListElements(),this.onContentChanged("left")}backToCurrentRepositoryVersion(){this.rightSynchroWorkspace=this.currentRepositorySynchroWorkspace,this.setupSynchronizationListElements(),this.onContentChanged("right")}makeDroppable(t,e){let i=this;e.on("dragover",n=>{e.addClass("jo_synchro_dragZone"),n.preventDefault()}),e.on("dragleave",()=>{e.removeClass("jo_synchro_dragZone")}),e.on("drop",n=>{if(Ao.currentlyDragged){let s=new ba(i).copyFromHistoryElement(Ao.currentlyDragged);switch(t){case"left":i.leftSynchroWorkspace=s;break;case"right":i.rightSynchroWorkspace=s;break}i.setupSynchronizationListElements()}e.removeClass("jo_synchro_dragZone")})}setHeader(t,e){let i=t=="left"?0:2;this.$fileListHeaderDivs[i].find(".jo_synchro_tabHeading").text(e)}writeRepositoryChanges(){let t=this;this.$writeRepositoryChangesButton.hide();let e=j("","jo_synchro_commitDialogDiv");e.hide(),this.$fileListHeaderContainerRight.append(e),e.append(j("","jo_synchro_commitDialogCaption",ge.commitMessage()));let i=y('<textarea class="jo_synchro_commitDialogTextarea"></textarea>');e.append(i);let n=j("","jo_synchro_commitDialogButtonDiv");e.append(n);let s=j("","jo_synchro_button","Abbrechen",{"background-color":"var(--updateButtonBackground)",color:"var(--updateButtonColor)"});n.append(s),s.on("click",()=>{e.remove(),t.$writeRepositoryChangesButton.show()});let a=j("","jo_synchro_button",ge.OK(),{"background-color":"var(--createButtonBackground)",color:"var(--createButtonColor)"});n.append(a),e.show(600),a.on("click",()=>{let l=i.val();e.remove(),this.currentRepositorySynchroWorkspace.commit(this.currentUserSynchroWorkspace.copiedFromWorkspace,this.currentRepository,l,this.main,(h,c)=>{c!=null?(alert(c),this.attachToWorkspaceAndRepository(this.currentUserSynchroWorkspace.copiedFromWorkspace)):(this.attachToRepository(h),this.$writeRepositoryChangesButton.hide())})}),i.focus()}async writeWorkspaceChanges(){await this.currentUserSynchroWorkspace.writeChangesToWorkspace(),this.currentUserSynchroWorkspace=new ba(this).copyFromWorkspace(this.currentUserSynchroWorkspace.copiedFromWorkspace),this.leftSynchroWorkspace=this.currentUserSynchroWorkspace,this.setupSynchronizationListElements(),this.$writeWorkspaceChangesButton.hide()}initEditor(){this.diffEditor=H.createDiffEditor(document.getElementById("jo_synchro_editor"),{originalEditable:!0,readOnly:!0,automaticLayout:!0,renderSideBySide:!0})}onContentChanged(t){let e=t=="left"?this.$writeWorkspaceChangesButton:this.$writeRepositoryChangesButton;(t=="left"?this.currentUserSynchroWorkspace:this.currentRepositorySynchroWorkspace).hasChanges()?e.show():e.hide()}updateAll(){this.$fileListDivs[1].find(".jo_synchro_updateButton").click()}commitAll(){this.$fileListDivs[2].find(".jo_synchro_commitButton").click()}updateCenterButtons(){this.$fileListDivs[1].find(".jo_synchro_updateButton").length>0?this.$updateAllButton.css("visibility","inherit"):this.$updateAllButton.css("visibility","hidden"),this.$fileListDivs[2].find(".jo_synchro_commitButton").length>0?this.$commitAllButton.css("visibility","inherit"):this.$commitAllButton.css("visibility","hidden")}}class zy{constructor(t){r(this,"guiReady",!1);r(this,"$mainHeading");r(this,"$repoListDiv");r(this,"$exitButton");r(this,"$checkoutButton");r(this,"$workspaceDropdown");r(this,"$filterButtonDiv");r(this,"$filterInput");r(this,"filterbuttonOptions",[Ie.all(),Ie.private(),Ie.accessableForClass(),Ie.accessableForSchool()]);r(this,"workspace");r(this,"repositories",[]);r(this,"$codeInput");this.main=t}initGUI(){this.guiReady=!0;let t=this,e=y("#checkoutRepo-div");e.append(this.$mainHeading=j("checkoutRepo-mainHeading","createUpdateRepo-mainHeading","")),this.$mainHeading.append(j("","",Ie.caption())),this.$mainHeading.append(this.$exitButton=j("","jo_synchro_button",Ie.backToCoding(),{"background-color":"var(--speedcontrol-grip)",color:"var(--fontColorLight)","font-size":"10pt"})),this.$exitButton.on("click",()=>{t.exitButtonClicked()});let i=j("checkoutRepo-divBelow");e.append(i);let n=j("","checkoutRepo-chooseDiv");i.append(n),n.append(j("","checkoutRepo-minorHeading",Ie.connectThisWorkspaceToRepository())),this.$workspaceDropdown=y("<select></select>"),n.append(this.$workspaceDropdown);let s=j("","checkoutRepo-chooseDiv");i.append(s),s.append(j("","checkoutRepo-minorHeading",Ie.inputRepositoryCode())),this.$codeInput=y('<input type="text"></input>'),s.append(this.$codeInput),this.$codeInput.on("input",c=>{t.$codeInput.val()==""?this.$repoListDiv.show():this.$repoListDiv.hide()});let a=j("","checkoutRepo-chooseDiv");i.append(a),a.append(j("","checkoutRepo-minorHeading",Ie.showTheseRepositories())),this.$filterButtonDiv=y("<fieldset></fieldset>"),a.append(this.$filterButtonDiv),this.filterbuttonOptions.forEach((c,u)=>{let g=y(`<input type="radio" id="b${u}" name="publishedFilter" value="${u}" ${u==0?"checked":""}>`);g.data("value",u),g.on("change",f=>{t.showRepositories()}),this.$filterButtonDiv.append(g),this.$filterButtonDiv.append(y(`<label for="b${u}">${c}</label>`))});let l=j("","checkoutRepo-chooseDiv");i.append(l),l.append(j("","checkoutRepo-minorHeading",Ie.filterSearch())),this.$filterInput=y('<input type="text"></input>'),l.append(this.$filterInput),this.$filterInput.on("input",c=>{t.showRepositories()}),i.append(j("","updateRepo-minorHeading","Repositories:",{"margin-bottom":"10px","margin-top":"20px"})),this.$repoListDiv=j("checkoutRepo-repoListDiv","jo_scrollable"),i.append(this.$repoListDiv);let h=j("updateRepo-buttonDiv");h.append(this.$checkoutButton=j("","jo_synchro_button","Checkout",{"background-color":"var(--updateButtonBackground)",color:"var(--updateButtonColor)"})),this.$checkoutButton.on("click",()=>{t.checkoutButtonClicked()}),i.append(h)}show(t){this.guiReady||this.initGUI(),y("#checkoutRepo-div").css("visibility","visible"),y("#main").css("visibility","hidden"),this.main.user;let n={onlyOwnRepositories:!1};this.$repoListDiv.empty();let s=this;Re("getRepositoryList",n,a=>{this.repositories=a.repositories,this.showRepositories()}),this.$workspaceDropdown.empty(),no(this.$workspaceDropdown,[{caption:Ie.createNewWorkspace(),object:null,value:-1}].concat(this.main.workspaceList.filter(a=>a.repository_id==null&&!a.isFolder).map(a=>({caption:a.name,object:a,value:a.id}))),-1),this.main.windowStateManager.registerOneTimeBackButtonListener(()=>{s.hide()})}showRepositories(){let t=this;this.$repoListDiv.find(".checkoutRepo-repoListItem").remove();let e=this.$filterButtonDiv.find("input:checked").data("value")-1,i=e<0?this.repositories:this.repositories.filter(s=>s.published_to==e),n=this.$filterInput.val();n=n.toLocaleLowerCase(),n!=""&&(i=i.filter(s=>[s.owner_username,s.owner_name,s.name,s.description].join(" ").toLocaleLowerCase().indexOf(n)>=0)),i.forEach(s=>{let a=j("","checkoutRepo-repoListItem"),l=j("","checkoutRepo-repoListItemLeft");a.append(l),l.append(j("","checkoutRepo-repoListName",s.name)),l.append(j("","checkoutRepo-repoListOwner",s.owner_name+" ("+s.owner_username+")"));let h=j("","checkoutRepo-repoListItemRight",s.description);a.append(h),this.$repoListDiv.append(a),a.data("repoInfo",s),a.on("click",()=>{t.selectRepository(a,s)})}),this.selectFirstRepository()}selectRepository(t,e){this.$repoListDiv.find(".checkoutRepo-repoListItem").removeClass("active"),t!=null&&t.addClass("active")}selectFirstRepository(){this.$repoListDiv.find(".checkoutRepo-repoListItem").removeClass("active"),this.$repoListDiv.find(".checkoutRepo-repoListItem").first().addClass("active")}hide(){y("#checkoutRepo-div").css("visibility","hidden"),y("#main").css("visibility","visible")}checkoutButtonClicked(){let t=-1,e=null,i=this.$codeInput.val();if(i!=""){let l=i.indexOf("T");if(l<0){alert(Ie.codeMustContainT());return}let h=Number.parseInt(i.substring(0,l));if(h>=0)t=h,e=i.substring(l+1);else{alert(Ie.digitPriorToTInsideCode());return}}else t=this.$repoListDiv.find(".active").first().data("repoInfo").id;let n=ro(this.$workspaceDropdown),s={repository_id:t,createNewWorkspace:n==null,workspace_id:n==null?null:n.id,secret:e},a=this;Re("attachWorkspaceToRepository",s,l=>{if(l.message!=null){alert(l.message);return}if(n==null&&l.new_workspace!=null){let h=a.main.networkManager.createNewWorkspaceFromWorkspaceData(l.new_workspace);a.main.projectExplorer.workspaceTreeview.sort(),setTimeout(()=>{a.main.projectExplorer.setWorkspaceActive(h,!0)},400),alert(Ie.newWorkspaceCreateSuccessfully(l.new_workspace.name))}else n.repository_id=t,a.main.projectExplorer.workspaceTreeview.setIconClassForElement(n,"img_workspace-dark-repository"),alert(Ie.workspaceSuccessfullyConnectedToRepository(n.name));window.history.back()})}exitButtonClicked(){this.hide()}}class qy{constructor(t){r(this,"guiReady",!1);r(this,"$mainHeading");r(this,"$settingsDiv");r(this,"$repoName");r(this,"$repoDescription");r(this,"$repoPublishedTo");r(this,"$cancelButton");r(this,"$createButton");r(this,"publishedToItems",[]);r(this,"workspace");this.main=t}initGUI(){this.guiReady=!0;let t=this,e=y("#createRepo-div");e.append(this.$mainHeading=j("","createUpdateRepo-mainHeading")),e.append(this.$settingsDiv=j("","createUpdateRepo-settingsDiv")),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${et.nameOfRepository()}</div>`)),this.$settingsDiv.append(this.$repoName=y('<input type="text" class="createUpdateRepo-inputcolumn"></input>')),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${et.description()}</div>`)),this.$settingsDiv.append(this.$repoDescription=y('<textarea class="createUpdateRepo-inputcolumn" style="min-height: 4em"></textarea>')),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${et.publishedFor()}</div>`)),this.$settingsDiv.append(this.$repoPublishedTo=y('<select class="createUpdateRepo-inputcolumn"></select>'));let i=j("createRepo-buttonDiv");i.append(this.$createButton=j("","jo_synchro_button","Repository erstellen",{"background-color":"var(--createButtonBackground)",color:"var(--createButtonColor)"})),this.$createButton.on("click",()=>{t.createButtonClicked()}),i.append(this.$cancelButton=j("","jo_synchro_button","Abbrechen",{"background-color":"var(--cancelButtonBackground)",color:"var(--cancelButtonColor)"})),this.$cancelButton.on("click",()=>{t.cancelButtonClicked()}),e.append(i)}show(t){this.workspace=t,this.guiReady||this.initGUI();let e=this.main.user,i=!(e.is_admin||e.is_schooladmin||e.is_teacher);this.publishedToItems=[{value:"0",object:0,caption:et.privateRepository()},{value:"1",object:1,caption:i?et.publishedToClassStudents():et.publishedToClasses()},{value:"2",object:2,caption:et.publishedToSchool()}],no(this.$repoPublishedTo,this.publishedToItems,"0"),y("#createRepo-div").css("visibility","visible"),y("#main").css("visibility","hidden"),this.initCreateMode(t);let a=this;this.main.windowStateManager.registerOneTimeBackButtonListener(()=>{a.hide()})}initCreateMode(t){let e=this.main.user;e.rufname,e.familienname,e.username,e.id,this.$mainHeading.text(et.createRepositoryAndConnectToWorkspace(t.name)),this.$createButton.show(),this.$repoName.val(t.name)}hide(){y("#createRepo-div").css("visibility","hidden"),y("#main").css("visibility","visible")}createButtonClicked(){let t=ro(this.$repoPublishedTo),e=this.$repoName.val(),i=this.$repoDescription.val();this.main.networkManager.sendCreateRepository(this.workspace,t,e,i,(n,s)=>{if(n==null){let a=this.main.projectExplorer,l=a.workspaceTreeview.findNodeByElement(this.workspace);l&&(l.iconClass="img_workspace-dark-repository",this.workspace.renderSynchronizeButton(l)),a.showRepositoryButtonIfNeeded(this.workspace),window.history.back()}else alert(n)})}cancelButtonClicked(){window.history.back()}}class Wy{constructor(t){r(this,"guiReady",!1);r(this,"$mainHeading");r(this,"$settingsDiv");r(this,"$repoName");r(this,"$repoDescription");r(this,"$repoPublishedTo");r(this,"$repoOwner");r(this,"$repoListDiv");r(this,"$userlistDiv");r(this,"$exitButton");r(this,"$saveButton");r(this,"$deleteButton");r(this,"$settingsSecretRead");r(this,"$settingsSecretWrite");r(this,"publishedToItems",[]);r(this,"repositoryOwnerItems",[]);r(this,"users",[]);r(this,"workspace");r(this,"repositoryInfo");this.main=t}initGUI(){this.guiReady=!0;let t=this,e=y("#updateRepo-div");e.append(this.$mainHeading=j("updateRepo-mainHeading","createUpdateRepo-mainHeading","")),this.$mainHeading.append(j("","",oe.caption())),this.$mainHeading.append(this.$exitButton=j("","jo_synchro_button",oe.backToCoding(),{"background-color":"var(--speedcontrol-grip)",color:"var(--fontColorLight)","font-size":"10pt"})),this.$exitButton.on("click",()=>{t.exitButtonClicked()});let i=j("updateRepo-divBelow");e.append(i);let n=j("updateRepo-divLeft");i.append(n),n.append(j("","updateRepo-minorHeading",oe.repositories())),this.$repoListDiv=j("updateRepo-repoListDiv"),n.append(this.$repoListDiv);let s=j("updateRepo-divRight");i.append(s),this.$settingsDiv=j("","createUpdateRepo-settingsDiv"),s.append(this.$settingsDiv),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${et.nameOfRepository()}</div>`)),this.$settingsDiv.append(this.$repoName=y('<input type="text" class="createUpdateRepo-inputcolumn"></input>')),this.$repoName.on("input",()=>{t.enableSaveButton()}),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${et.description()}</div>`)),this.$settingsDiv.append(this.$repoDescription=y('<textarea class="createUpdateRepo-inputcolumn" style="min-height: 4em"></textarea>')),this.$repoDescription.on("input",()=>{t.enableSaveButton()}),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${et.publishedFor()}</div>`)),this.$settingsDiv.append(this.$repoPublishedTo=y('<select class="createUpdateRepo-inputcolumn"></select>')),this.$repoPublishedTo.on("change",()=>{t.enableSaveButton()}),this.$settingsDiv.append(y('<div class="createUpdateRepo-settingsLabel">'+oe.owner()+"</div>")),this.$settingsDiv.append(this.$repoOwner=y('<select class="createUpdateRepo-inputcolumn"></select>')),this.$repoOwner.on("change",()=>{t.enableSaveButton()}),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${oe.codeForRepoReadAccess()}</div>`));let a=y('<div class="createUpdateRepo-settingsSecret"></div>');this.$settingsDiv.append(a),this.$settingsSecretRead=y('<div class="createUpdateRepo-settingsSecretSecret">---</div>'),a.append(this.$settingsSecretRead);let l=y(`<button class="jo_button jo_copy_secret_button jo_active">${oe.copy()}</button>`);a.append(l),l.on("pointerdown",()=>{Gl(this.$settingsSecretRead.text())});let h=y(`<button class="jo_button jo_set_secret_button jo_active">${oe.change()}</button>`);a.append(h),h.on("pointerdown",()=>{t.setSecret(!0,!1)}),this.$settingsDiv.append(y(`<div class="createUpdateRepo-settingsLabel">${oe.codeForRepoWriteAccess()}</div>`));let c=y('<div class="createUpdateRepo-settingsSecret"></div>');this.$settingsDiv.append(c),this.$settingsSecretWrite=y('<div class="createUpdateRepo-settingsSecretSecret">---</div>'),c.append(this.$settingsSecretWrite);let u=y(`<button class="jo_button jo_copy_secret_button jo_active">${oe.copy()}</button>`);c.append(u),u.on("pointerdown",()=>{Gl(this.$settingsSecretWrite.text())});let g=y(`<button class="jo_button jo_set_secret_button jo_active">${oe.change()}</button>`);c.append(g),g.on("pointerdown",()=>{t.setSecret(!1,!0)}),s.append(this.$userlistDiv=j("updateRepo-userlistDiv")),this.$userlistDiv.append(j(null,"updateRepo-userlistheading",oe.repositoryUsers(),{"grid-column":1})),this.$userlistDiv.append(j(null,"updateRepo-userlistheading",oe.writeAccess(),{"grid-column":2}));let f=j("updateRepo-buttonDiv");f.append(this.$saveButton=j("","jo_synchro_button",oe.saveChanges(),{"background-color":"var(--updateButtonBackground)",color:"var(--updateButtonColor)"})),this.$saveButton.on("click",()=>{t.saveButtonClicked()}),this.$saveButton.hide(),s.append(f)}setSecret(t,e){this.main.networkManager.sendSetSecret(this.repositoryInfo.id,t,e,i=>{let n=this.repositoryInfo.id+"T";this.$settingsSecretRead.text(n+i.secret_read),this.$settingsSecretWrite.text(n+i.secret_write)})}enableSaveButton(){this.$saveButton.show()}show(t){this.guiReady||this.initGUI(),y("#updateRepo-div").css("visibility","visible"),y("#main").css("visibility","hidden");let n=this.main.user,s=!(n.is_teacher||n.is_admin||n.is_schooladmin);this.publishedToItems=[{value:0,object:0,caption:et.privateRepository()},{value:1,object:1,caption:s?et.publishedToClassStudents():et.publishedToClasses()},{value:2,object:2,caption:et.publishedToSchool()}],no(this.$repoPublishedTo,this.publishedToItems,0),this.$saveButton.show(),this.showRepositoryList();let a=this;this.main.windowStateManager.registerOneTimeBackButtonListener(()=>{a.hide()})}deleteRepository(t){let e=this,i={repository_id:t.id};Re("deleteRepository",i,()=>{e.showRepositoryList();let n=e.main.workspaceList.filter(s=>s.repository_id==t.id);for(let s of n){s.repository_id=null;let a=this.main.projectExplorer.workspaceTreeview.findNodeByElement(s);a.iconClass="img_workspace-dark",s.renderSynchronizeButton(a)}})}showRepositoryList(){this.emptyRepositoryInfo();let t={onlyOwnRepositories:!0};this.$repoListDiv.empty();let e=this;Re("getRepositoryList",t,i=>{let n,s;if(i.repositories.length==0){alert(oe.noRepositoryPresent()),e.exitButtonClicked();return}i.repositories.forEach(a=>{let l=j("","updateRepo-repoListItem"),h=j("","",a.name),c=y(`<div class="img_delete jo_button jo_active" title="${oe.deleteRepository()}"></div>`);l.append(h,c),this.$repoListDiv.append(l),l.on("click",u=>{e.selectRepository(l,a)}),l.data("repoInfo",a),s==null&&(s=a,n=l),c.on("click",u=>{u.preventDefault(),Vn([{caption:oe.cancel(),callback:()=>{}},{caption:oe.sureDelete(),color:"#ff6060",callback:()=>{e.deleteRepository(a)}}],u.pageX+2,u.pageY+2),u.stopPropagation()})}),n!=null&&this.selectRepository(n,s)},i=>{console.log(i),alert(oe.noRepositoryPresent()),e.exitButtonClicked()})}selectRepository(t,e){if(this.repositoryInfo=e,this.emptyRepositoryInfo(),this.$saveButton.is(":visible")){let a=this.$repoListDiv.find(".active").first().data("repoInfo");a&&alert(oe.changesNotSaved(a.name))}this.$saveButton.hide(),this.$repoListDiv.find(".updateRepo-repoListItem").removeClass("active"),t.addClass("active"),this.$repoName.val(e.name),this.$repoDescription.val(e.description),this.$repoPublishedTo.val(e.published_to),this.$settingsSecretRead.text(e.secret_read==null?"--------":e.id+"T"+e.secret_read),this.$settingsSecretWrite.text(e.secret_write==null?"--------":e.id+"T"+e.secret_write),this.$repoOwner.empty(),this.$userlistDiv.children().not(".updateRepo-userlistheading").remove();let i={repository_id:e.id},n=this;Re("getRepositoryUserList",i,s=>{s.repositoryUserList.forEach(l=>{let h=j("","updateRepo-userDiv",`${l.firstName} ${l.lastName} (${l.username})`,{"grid-column":1}),c=j("","canWriteDiv","",{"grid-column":2}),u=y('<input type="checkbox">');c.append(u),u.attr("checked",l.canWrite),u.data("user",l),u.on("change",()=>{n.enableSaveButton()}),n.$userlistDiv.append(h,c)}),n.$repoOwner.empty();let a=s.repositoryUserList.map(l=>({caption:`${l.firstName} ${l.lastName} (${l.username})`,object:l,value:l.user_id+""}));s.repositoryUserList.some(l=>l.user_id==e.owner_id)||a.push({caption:`${e.owner_name} (${e.owner_username})`,object:{user_id:e.owner_id,username:e.owner_username,firstName:"",lastName:"",klasse:"",canWrite:!0},value:e.owner_id+""}),no(n.$repoOwner,a,e.owner_id+"")})}emptyRepositoryInfo(){this.$repoOwner.empty(),this.$repoName.val(""),this.$repoDescription.val(""),this.$userlistDiv.find(".updateRepo-userDiv").remove(),this.$userlistDiv.find(".canWriteDiv").remove()}hide(){y("#updateRepo-div").css("visibility","hidden"),y("#main").css("visibility","visible")}saveButtonClicked(){let t=this,i=this.$repoListDiv.find(".active").first().data("repoInfo"),n=this.$repoName.val(),s=ro(this.$repoOwner),a=ro(this.$repoPublishedTo),l={owner_id:s.user_id,description:this.$repoDescription.val(),published_to:a,repository_id:i.id,name:n},h=[];t.$userlistDiv.find("input").each((u,g)=>{let b=y(g).data("user");h.push({has_write_access:y(g).is(":checked"),user_id:b.user_id})});let c={repository_id:i.id,writeAccessList:h};i.owner_id==s.user_id||confirm(oe.transferOwnership(i.name,s.username))?Re("updateRepositoryUserWriteAccess",c,u=>{Re("updateRepository",l,g=>{i.name=n,i.owner_id=s.user_id,i.owner_name=s.firstName+" "+s.lastName,i.owner_username=s.username,i.published_to=a,i.description=l.description,alert(oe.changesSavedSuccessfully()),t.$saveButton.hide(),t.showRepositoryList()},g=>{alert(oe.error()+g),t.exitButtonClicked()})},u=>{alert(oe.error()+u),t.exitButtonClicked()}):alert(oe.notSaved())}exitButtonClicked(){window.history.back()}}class Ny{async loadFiles(t){if(t==null||t.length==0)return alert(tg.noFilesToImport()),null;let e=[];for await(let i of t)if(i.name.endsWith(".png"))try{e.push(await this.loadFile(i))}catch{}return e=e.sort((i,n)=>i.filename.localeCompare(n.filename)),e}async loadFile(t){let e=await this.readFileAsync(t),i=to.decode(e),n=to.toRGBA8(i)[0];return{image:new Uint8Array(n),width:i.width,height:i.height,filename:t.name}}async readFileAsync(t){return new Promise((e,i)=>{let n=new FileReader;n.onload=()=>{e(n.result)},n.onerror=i,n.readAsArrayBuffer(t)})}}function Ry(p,t){let e=0,i=0;for(let h of p)h.width+=2*t,h.height+=2*t;for(const h of p)e+=h.width*h.height,i=Math.max(i,h.width);p.sort((h,c)=>c.height-h.height);const s=[{x:0,y:0,width:Math.max(Math.ceil(Math.sqrt(e/.95)),i),height:1/0}];let a=0,l=0;for(const h of p)for(let c=s.length-1;c>=0;c--){const u=s[c];if(!(h.width>u.width||h.height>u.height)){if(h.x=u.x,h.y=u.y,l=Math.max(l,h.y+h.height),a=Math.max(a,h.x+h.width),h.width===u.width&&h.height===u.height){const g=s.pop();c<s.length&&(s[c]=g)}else h.height===u.height?(u.x+=h.width,u.width-=h.width):h.width===u.width?(u.y+=h.height,u.height-=h.height):(s.push({x:u.x+h.width,y:u.y,width:u.width-h.width,height:h.height}),u.y+=h.height,u.height-=h.height);break}}for(let h of p)h.width-=2*t,h.height-=2*t,h.x+=t,h.y+=t;return{w:a,h:l,fill:e/(a*l)||0}}class Gy{constructor(t){r(this,"spriteDataList",[]);this.spritesheet=t,this.spritesheet==null||t.pixiSpritesheetData==null?this.spritesheet=new As:this.extractImagesFromSheet()}extractImagesFromSheet(){let t=this.spritesheet.pixiSpritesheetData.meta.size.w;this.spriteDataList=[];for(let e in this.spritesheet.pixiSpritesheetData.frames){let i=this.spritesheet.pixiSpritesheetData.frames[e],n=e.indexOf("#"),s=e.substring(0,n),a=Number.parseInt(e.substring(n+1)),l=new Uint8Array(i.frame.w*i.frame.h*4),h={image:l,width:i.frame.w,height:i.frame.h,x:i.frame.x,y:i.frame.y,filename:"",series:s,index:a},c=(h.y*t+h.x)*4,u=0;for(let g=0;g<i.frame.h;g++){for(let f=0;f<i.frame.w*4;f++)l[u+f]=this.spritesheet.pngImageData[c+f];c+=t*4,u+=i.frame.w*4}this.spriteDataList.push(h)}}addSprite(t,e,i,n,s,a,l){let h=[];if(i>1||e>1){let c=Math.trunc((t.width-2*n+s)/i-s),u=Math.trunc((t.height-2*n+s)/e-s);for(let g=0;g<e;g++)for(let f=0;f<i;f++){let b=n+f*(c+s),A=n+g*(u+s),k=this.cut(t,b,A,c,u);k.series=a,k.index=l+g*i+f,this.spriteDataList.push(k),h.push(k)}}else t.series=a,t.index=l,this.spriteDataList.push(t),h.push(t);return h}cut(t,e,i,n,s){let a={height:s,width:n,image:new Uint8Array(n*s*4)},l=t.image,h=a.image;for(let c=0;c<n;c++)for(let u=0;u<s;u++){let g=(e+c+(i+u)*t.width)*4,f=(c+u*n)*4;h[f]=l[g],h[f+1]=l[g+1],h[f+2]=l[g+2],h[f+3]=l[g+3]}return a}async generateAndZipSpritesheet(t="spritesheet"){let e=Ry(this.spriteDataList,1);this.spritesheet.pngImageData=new Uint8Array(e.w*e.h*4),this.spritesheet.pixiSpritesheetData={frames:{},meta:{app:"",version:"1.0",image:"dummy.png",format:"RGBA8888",size:{w:e.w,h:e.h},scale:"1"}};for(let n of this.spriteDataList){let s=(n.y*e.w+n.x)*4,a=0;for(let c=0;c<n.height;c++){for(let u=0;u<n.width*4;u++)this.spritesheet.pngImageData[s+u]=n.image[a+u];s+=e.w*4,a+=n.width*4}s=((n.y-1)*e.w+n.x)*4,a=s+e.w*4,this.spritesheet.pngImageData.copyWithin(s,a,a+n.width*4),s=((n.y+n.height)*e.w+n.x)*4,a=s-e.w*4,this.spritesheet.pngImageData.copyWithin(s,a,a+n.width*4);let l=(n.y*e.w+n.x-1)*4,h=(n.y*e.w+n.x+n.width)*4;for(let c=0;c<n.height;c++)this.spritesheet.pngImageData[l]=this.spritesheet.pngImageData[l+4],this.spritesheet.pngImageData[l+1]=this.spritesheet.pngImageData[l+5],this.spritesheet.pngImageData[l+2]=this.spritesheet.pngImageData[l+6],this.spritesheet.pngImageData[l+3]=this.spritesheet.pngImageData[l+7],this.spritesheet.pngImageData[h]=this.spritesheet.pngImageData[h-4],this.spritesheet.pngImageData[h+1]=this.spritesheet.pngImageData[h-3],this.spritesheet.pngImageData[h+2]=this.spritesheet.pngImageData[h-2],this.spritesheet.pngImageData[h+3]=this.spritesheet.pngImageData[h-1],l+=e.w*4,h+=e.w*4;this.spritesheet.pixiSpritesheetData.frames[n.series+"#"+n.index]={frame:{x:n.x,y:n.y,w:n.width,h:n.height},rotated:!1,trimmed:!1,spriteSourceSize:{x:0,y:0,w:n.width,h:n.height},sourceSize:{w:n.width,h:n.height},pivot:{x:.5,y:.5}}}let i=to.encode([this.spritesheet.pngImageData.buffer],e.w,e.h,0);this.spritesheet.pngFile=new Uint8Array(i),await this.spritesheet.makeZip(t)}}class Cl{constructor(t){r(this,"guiReady",!1);r(this,"userSpritesheet");r(this,"$mainHeading");r(this,"$importDropZone");r(this,"$uploadRect");r(this,"$messagesDiv");r(this,"$zipSizeDiv");r(this,"$uploadButtonStart");r(this,"$uploadLinesCount");r(this,"$uploadColumnsCount");r(this,"$uploadMargin");r(this,"$uploadSpace");r(this,"$uploadSeries");r(this,"$uploadIndex");r(this,"$spriteListDiv");r(this,"$buttonDiv");r(this,"$buttonCancel");r(this,"$buttonOK");r(this,"$buttonImport");r(this,"$buttonFileImport");r(this,"fileList");r(this,"hasErrors",!1);r(this,"readonly",!1);this.main=t}initGUI(){this.guiReady=!0;let t=this,e=y("#spritemanager-div");e.append(this.$mainHeading=j(null,"jo_sm_mainHeading")),this.$mainHeading.append(j("","jo_sm_heading",U.heading()));let i=j(null,"jo_sm_importExportArea",null,null,e),n=j(null,"jo_sm_importExportLeft jo_sm_writeonly",null,null,i);this.$importDropZone=j(null,"jo_sm_importDropZone",null,null,n),j(null,null,U.stepOne(),{"font-weight":"bold"},this.$importDropZone),this.$buttonFileImport=y('<input type="file" multiple="multiple" style="cursor:pointer; margin-top: 30px" class="jo_sm_writeonly"></input>'),this.$importDropZone.append(this.$buttonFileImport),this.$buttonFileImport.on("change",C=>{var w=C.target.files;t.fileList=w,s.text(w.length!=1?w.length+U.filesSelected():U.fileSelected()),this.$buttonImport.addClass("jo_active")});let s=j(null,null,"",null,this.$importDropZone);this.$importDropZone.on("dragover",C=>{C.stopPropagation(),C.preventDefault(),C.originalEvent.dataTransfer.dropEffect="copy"}),this.$importDropZone.on("drop",C=>{C.stopPropagation(),C.preventDefault();var w=C.originalEvent.dataTransfer.files;t.fileList=w,s.text(w.length!=1?w.length+U.filesSelected():U.fileSelected()),this.$buttonImport.addClass("jo_active")});let a=j(null,"jo_sm_importExportCenter jo_sm_writeonly",null,null,i);j(null,"jo_sm_importParameters",U.stepTwo(),{"margin-bottom":"10px","font-weight":"bold"},a);let l=j(null,"jo_sm_importParameters",null,null,a);this.$uploadLinesCount=this.makeIntParameterInput(l,U.rows(),1),this.$uploadColumnsCount=this.makeIntParameterInput(l,U.columns(),1),this.$uploadMargin=this.makeIntParameterInput(l,U.margin(),0),this.$uploadSpace=this.makeIntParameterInput(l,U.distance(),0);let h=j(null,"jo_sm_importParameters",null,null,a);this.$uploadSeries=this.makeStringParameterInput(h,U.series(),"Test","10em"),this.$uploadIndex=this.makeIntParameterInput(h,U.fromIndex(),0),j(null,null,null,{"border-bottom":"2px solid var(--slider)","margin-bottom":"5px"},a),this.$buttonImport=j(null,"jo_active jo_sm_button jo_sm_importButton",U.stepThree(),{width:"fit-content"},a),this.$buttonImport.on("click",()=>{t.$buttonImport.hasClass("jo_active")&&(t.importFiles(t.fileList),s.text(""),t.$buttonFileImport.val(""))});let c=j(null,"jo_sm_importExportMessages jo_sm_writeonly",null,null,i);j(null,null,U.messages(),{"font-weight":"bold"},c);let u=j(null,"jo_sm_messagesOuter jo_scrollable",null,null,c);this.$messagesDiv=j(null,"jo_sm_messagesDiv jo_scrollable","Test",null,u),this.$zipSizeDiv=j(null,"jo_sm_pngSizeDiv",U.fileSize()+"0 kB",null,c);let g=j(null,"jo_sm_importExportRight",null,null,i);j(null,"jo_sm_writeonly",U.importWholeSpritesheet(),null,g);let f=y('<input type="file" style="cursor:pointer" class="jo_sm_writeonly"></input>');g.append(f);let b=j(null,"jo_sm_buttonExportAll jo_sm_button jo_active",U.exportWholeSpritesheet(),null,g);j(null,"jo_sm_buttonDeleteAll jo_sm_button jo_active jo_sm_writeonly",U.removeAllSprites(),null,g).on("click",C=>{C.preventDefault(),Vn([{caption:U.cancel(),callback:()=>{}},{caption:U.sureDelete(),color:"#ff6060",callback:()=>{t.$spriteListDiv.empty(),t.userSpritesheet.spriteDataList=[],t.generateZipAndPrintZipSize()}}],C.pageX+2,C.pageY+2),C.stopPropagation()}),b.on("click",()=>{t.exportSpritesheet()}),f.on("change",C=>{t.importSpritesheet(C.target.files)});let k=j(null,"jo_sm_spritelistOuter",null,null,e);this.$spriteListDiv=j(null,"jo_sm_spritelistDiv jo_scrollable",null,null,k),e.append(this.$buttonDiv=j(null,"jo_sm_buttonDiv")),this.$buttonDiv.append(this.$buttonCancel=j("","jo_active jo_sm_button",U.cancel(),{"background-color":"var(--speedcontrol-grip)",color:"var(--fontColorLight)","font-size":"10pt"})),this.$buttonCancel.on("click",()=>{t.exit()}),this.$buttonDiv.append(this.$buttonOK=j("","jo_active jo_sm_button jo_sm_writeonly",U.save(),{"background-color":"var(--updateButtonBackground)",color:"var(--fontColorLight)","font-size":"10pt"})),this.$buttonOK.on("click",()=>{t.$buttonOK.hasClass("jo_active")&&t.saveAndExit()})}async importSpritesheet(t){this.userSpritesheet&&(await this.userSpritesheet.spritesheet.unpackZip(t[0]),this.userSpritesheet.extractImagesFromSheet(),this.$spriteListDiv.empty(),this.userSpritesheet.spriteDataList.forEach(e=>this.renderImageInList(e)),this.checkSeriesAndIndexesAndSetNextSpriteIndex())}async exportSpritesheet(){let t=window.prompt(U.nameOfSpritesheet(),"Spritesheet");t.endsWith(".zip")&&(t=t.replace(".zip","")),await this.userSpritesheet.generateAndZipSpritesheet(t),Mr(new Blob([this.userSpritesheet.spritesheet.zipFile]),t+".zip",!0)}async importFiles(t){let e=Number.parseInt(this.$uploadLinesCount.val()),i=Number.parseInt(this.$uploadColumnsCount.val()),n=Number.parseInt(this.$uploadMargin.val()),s=Number.parseInt(this.$uploadSpace.val()),a=this.$uploadSeries.val(),l=Number.parseInt(this.$uploadIndex.val()),h=await new Ny().loadFiles(t);for(let c of h)this.userSpritesheet.addSprite(c,e,i,n,s,a,l++).forEach(g=>this.renderImageInList(g));this.$buttonImport.removeClass("jo_active"),this.checkSeriesAndIndexesAndSetNextSpriteIndex(),setTimeout(()=>{this.printMessage(h.length+U.imagesAdded()),this.generateZipAndPrintZipSize()},500)}async generateZipAndPrintZipSize(){await this.userSpritesheet.generateAndZipSpritesheet();let t=this.userSpritesheet.spritesheet.zipFile.length;this.$zipSizeDiv.text("Spritesheet: "+Math.round(t/1024*100)/100+" kB (Max: 4 MB)");let e=t>4*1024*1024?"red":"";this.$zipSizeDiv.css("color",e)}renderImageInList(t){let e=this,i=j(null,"jo_sm_spriteListLine",null,null,this.$spriteListDiv),n=y('<canvas width="'+t.width+'" height="'+t.height+'"></canvas>'),s=n[0].getContext("2d");const a=new ImageData(new Uint8ClampedArray(t.image),t.width,t.height);s.putImageData(a,0,0);let l=300,h=100,c=t.width,u=t.height;c/l>u/h?(c=Math.min(t.width,l),u=t.height/t.width*c):(u=Math.min(t.height,h),c=t.width/t.height*u),n.css("width",c+"px"),n.css("height",u+"px"),j(null,"jo_spritepreview-innerbox",null,{width:c+"px",height:u+"px","margin-right":l-c+"px"},i).append(n);let f=j(null,"jo_sm_inputInfoDiv",null,null,i),b=j(null,"jo_sm_inputDiv",null,null,f);if(!this.readonly){let C=this.makeStringParameterInput(b,U.series(),t.series?t.series:"","10em");C.addClass("jo_sm_series");let w=this.makeIntParameterInput(b,U.index(),t.index?t.index:0);w.addClass("jo_sm_index"),C.on("input",()=>{t.series=C.val(),e.checkSeriesAndIndexesAndSetNextSpriteIndex()}),w.on("input",()=>{t.index=w.val(),e.checkSeriesAndIndexesAndSetNextSpriteIndex()})}let A=j(null,"jo_sm_infoDiv",U.widthHeight(t.width,t.height),null,f),k=y('<span class="jo_sm_errorspan"></span>');A.append(k),this.readonly||j(null,"img_delete jo_button jo_active",null,null,i).on("pointerdown",w=>{w.preventDefault(),Vn([{caption:U.cancel(),callback:()=>{}},{caption:U.sureDelete(),color:"#ff6060",callback:()=>{let I=e.userSpritesheet.spriteDataList.indexOf(t);e.userSpritesheet.spriteDataList.splice(I,1),i.remove(),e.generateZipAndPrintZipSize(),e.checkSeriesAndIndexesAndSetNextSpriteIndex()}}],w.pageX+2,w.pageY+2),w.stopPropagation()}),this.$spriteListDiv.prepend(i)}makeIntParameterInput(t,e,i){let n=t.append(j(null,"jo_sm_parameterDiv"));j(null,"jo_sm_parameterCaption",e,null,n);let s=y('<input type="number" class="jo_sm_parameterInput" value="'+i+'" style="width: 3em"></input>');return n.append(s),s}makeStringParameterInput(t,e,i,n){let s=t.append(j(null,"jo_sm_parameterDiv"));j(null,"jo_sm_parameterCaption",e,null,s);let a=y('<input type="text" class="jo_sm_parameterInput" value="'+i+'" style="width: '+n+'"></input>');return s.append(a),a}async show(){let t=this;this.guiReady||this.initGUI(),this.$buttonFileImport.val("");let e=this.main.getCurrentWorkspace();if(e==null){alert(U.noWorkspaceSelected());return}e.repository_id!=null&&!e.has_write_permission_to_repository?(this.readonly=!0,y(".jo_sm_writeonly").hide()):(this.readonly=!1,y(".jo_sm_writeonly").show()),e.repository_id==null?this.$mainHeading.find(".jo_sm_heading").text(U.mangeWorkspaceSprites(e.name)):this.$mainHeading.find(".jo_sm_heading").text(U.mangeRepositorySprites(e.name)),this.$buttonImport.removeClass("jo_active"),this.fileList=null,y("#spritemanager-div").css("visibility","visible"),y("#main").css("visibility","hidden"),this.main.windowStateManager.registerOneTimeBackButtonListener(()=>{t.hide()});let s=new As;await s.load(e.spritesheetId),this.userSpritesheet=new Gy(s),this.$spriteListDiv.empty(),this.userSpritesheet.spriteDataList.forEach(a=>{this.renderImageInList(a)}),this.checkSeriesAndIndexesAndSetNextSpriteIndex()}setNextSpriteIndex(){let t=-1;this.userSpritesheet.spriteDataList.forEach(e=>{e.index>t&&(t=e.index)}),this.$uploadIndex.val(t+1),this.$uploadColumnsCount.val(1),this.$uploadLinesCount.val(1),this.$uploadMargin.val(0),this.$uploadSpace.val(0)}async saveAndExit(){await this.userSpritesheet.generateAndZipSpritesheet();let t=this,e=this.userSpritesheet.spriteDataList.length==0,i=this.main.getCurrentWorkspace();Cl.uploadSpritesheet(this.userSpritesheet.spritesheet.zipFile,i.id,e).then(n=>{i.spritesheetId=e?null:n,t.userSpritesheet.spritesheet.initializeSpritesheetForWorkspace(i,t.main,null).then(()=>{for(let s of i.getFiles())this.main.getCompiler().setFileDirty(s);this.main.getCompiler().triggerCompile()}),t.exit()}).catch(n=>{alert(n),t.exit()})}static async uploadSpritesheet(t,e,i){let n={"x-workspaceid":""+e,"x-filetype":i?"delete":"zip"};return He!=null&&(n["x-token-pm"]=He),new Promise((s,a)=>{y.ajax({type:"POST",async:!0,contentType:"application/octet-stream",data:t,processData:!1,headers:n,url:"servlet/uploadSprite",success:function(l){l.success?s(l.spriteFileId):a(l.message)},error:function(l,h){a(h)}})})}hide(){y("#spritemanager-div").css("visibility","hidden"),y("#main").css("visibility","visible")}exit(){window.history.back()}printMessage(t,e){let i=e==null?"":'style="color: '+e+'"';this.$messagesDiv.append(`<div ${i}>${t}</div>`);let n=this.$messagesDiv[0];n.scrollTop=n.scrollHeight}checkSeriesAndIndexesAndSetNextSpriteIndex(){if(this.readonly)return;this.hasErrors=!1;let t={};for(let n of Yo)t[n.name]=!0;let e={},i=this;this.$spriteListDiv.children().each((n,s)=>{let a=y(s).find(".jo_sm_series").val(),l=Number.parseInt(y(s).find(".jo_sm_index").val()),h=y(s).find(".jo_sm_errorspan");if(t[a]){h.text(U.identifierAlreadyUsed(a)),i.hasErrors=!0;return}if(e[a+"#"+l]){h.text(U.seriesIndexAlreadyUsed(a,l)),i.hasErrors=!0;return}h.text(""),e[a+"#"+l]=!0}),this.hasErrors?this.$buttonOK.removeClass("jo_active"):this.$buttonOK.addClass("jo_active"),this.setNextSpriteIndex()}}class Ky{start(t,e,i){}}class Hy{static addActions(t,e){t.addAction({id:"Find bracket",label:"Finde korrespondierende Klammer",keybindings:[km.CtrlCmd|yo.KeyK],precondition:void 0,keybindingContext:void 0,contextMenuGroupId:"navigation",contextMenuOrder:1.5,run:function(i){var n;(n=i.getAction("editor.action.jumpToBracket"))==null||n.run()}}),t.addAction({id:"Toggle line comment",label:"Zeilenkommentar ein-/ausschalten",keybindings:[km.CtrlCmd|yo.Comma],precondition:void 0,keybindingContext:void 0,contextMenuGroupId:"insert",contextMenuOrder:1.5,run:function(i){var n;console.log("Hier!"),(n=i.getAction("editor.action.commentLine"))==null||n.run()}}),e&&t.addAction({id:"Debugger Goto Cursor",label:"Führe Programm aus bis zu dieser Zeile",precondition:"Scheduler_running || Scheduler_paused",keybindingContext:void 0,contextMenuGroupId:"navigation",contextMenuOrder:1.5,run:i=>{e.getActionManager().trigger("interpreter.gotoCursor")}})}}class rg{constructor(t,e,i){r(this,"editor");r(this,"highlightCurrentMethod",!0);r(this,"cw",null);r(this,"lastPosition");r(this,"dontPushNextCursorMove",0);r(this,"debounceTimer",null);r(this,"lastMethodCallPosition");r(this,"lastPushTime",0);this.main=t,this.showMinimap=e,this.isEmbedded=i,i||new ResizeObserver(()=>{clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{var s,a;((s=this.editor)==null?void 0:s.getDomNode()).parentElement.style.width="100%",(a=this.editor)==null||a.layout()},200)}).observe(document.body)}currentlyEditedModuleIsJava(){var e;let t=(e=this.main.getCurrentWorkspace())==null?void 0:e.getCurrentlyEditedFile().name;return Ii.filenameToFileType(t).file_type==0}initGUI(t){let e=this.main.getSettings();this.editor=H.create(t[0],{language:"myJava","semanticHighlighting.enabled":!0,lightbulb:{enabled:H.ShowLightbulbIconMode.On},stickyScroll:{enabled:e.getValue("editor.stickyScroll")!=="off"},guides:{bracketPairs:e.getValue("editor.bracketPairLines")!=="off",highlightActiveBracketPair:e.getValue("editor.bracketPairLines")!=="off",bracketPairsHorizontal:e.getValue("editor.bracketPairLines")==="verticalAndUnderlined"},lineDecorationsWidth:0,peekWidgetDefaultFocus:"tree",fixedOverflowWidgets:!0,quickSuggestions:!0,quickSuggestionsDelay:10,fontSize:14,inlayHints:{enabled:"on"},fontFamily:window.javaOnlineFont==null?"Consolas, Roboto Mono":window.javaOnlineFont,fontWeight:"500",roundedSelection:!0,selectOnLineNumbers:!1,automaticLayout:!0,scrollBeyondLastLine:!1,occurrencesHighlight:"off",autoIndent:"advanced",dragAndDrop:!0,formatOnType:!0,formatOnPaste:!0,suggestFontSize:16,suggestLineHeight:22,suggest:{localityBonus:!0,insertMode:"replace"},bracketPairColorization:{enabled:!0,independentColorPoolPerBracketType:!1},autoClosingBrackets:e.getValue("editor.autoClosingBrackets"),autoClosingQuotes:e.getValue("editor.autoClosingQuotes"),autoClosingDelete:"auto",autoClosingOvertype:"auto",parameterHints:{enabled:e.getValue("editor.contextSensitiveHelp.ParameterHints")=="true",cycle:!0},mouseWheelZoom:!0,tabSize:3,insertSpaces:!0,detectIndentation:!1,minimap:{enabled:this.showMinimap},scrollbar:{vertical:"auto",horizontal:"auto"},theme:"myCustomThemeDark",wrappingIndent:"same"}),this.createContextKeys(),this.editor.onDidChangeModelContent(n=>{const s=this.main.getInterpreter().scheduler.state;[Q.stopped,Q.error,Q.not_initialized].includes(s)||this.main.getActionManager().trigger("interpreter.stop"),this.main.getCompiler().triggerCompile()});let i=this;if(this.editor.onDidChangeConfiguration(n=>{if(n.hasChanged(H.EditorOption.fontSize)){let s=this.editor.getOption(H.EditorOption.fontSize);this.setFontSize(s)}}),!this.isEmbedded){let n=this.main;n.windowStateManager.registerBackButtonListener(s=>{var c;let a=s.state;if(s.state==null)return;let l=n.workspaceList.find(u=>u.id==a.workspace_id);if(l==null)return;let h=l.findFileById(a.file_id);h!=null&&(l!=n.getCurrentWorkspace()&&(i.dontPushNextCursorMove++,n.projectExplorer.setWorkspaceActive(l),i.dontPushNextCursorMove--),h!=((c=n.getCurrentWorkspace())==null?void 0:c.getCurrentlyEditedFile())&&(i.dontPushNextCursorMove++,n.projectExplorer.setFileActive(h),i.dontPushNextCursorMove--),i.dontPushNextCursorMove++,i.editor.setPosition(a.position),i.editor.revealPosition(a.position),i.dontPushNextCursorMove--,i.pushHistoryState(!0,a))})}return this.editor.onDidChangeCursorPosition(n=>{var a,l,h;let s=(l=(a=this.main.getCurrentWorkspace())==null?void 0:a.getCurrentlyEditedFile())==null?void 0:l.id;s!=null&&((this.lastPosition==null||n.source=="api"||s!=this.lastPosition.file_id||Math.abs(this.lastPosition.position.lineNumber-n.position.lineNumber)>20)&&this.dontPushNextCursorMove==0?this.pushHistoryState(!1,this.getPositionForHistory()):s==((h=history.state)==null?void 0:h.module_id)&&this.pushHistoryState(!0,this.getPositionForHistory())),i.onEvaluateSelectedText(n),i.onShowSignatureHelp(n)}),this.editor.onDidChangeModel(n=>{if(this.main.getCurrentWorkspace()==null)return;let s=this.main.getCurrentWorkspace().getCurrentlyEditedFile();this.main instanceof Pd&&s!=null&&(this.main.projectExplorer.setActiveAfterExternalModelSet(s),(this.lastPosition==null||s.id!=this.lastPosition.file_id)&&this.dontPushNextCursorMove==0&&this.pushHistoryState(!1,this.getPositionForHistory()))}),setTimeout(()=>{H.remeasureFonts()},2e3),Hy.addActions(this.editor,this.main),this.editor}async onShowSignatureHelp(t){var l,h,c;let e=this.editor.getModel(),i,n=(l=this.main.getBottomDiv())==null?void 0:l.console;if(((h=n==null?void 0:n.editor)==null?void 0:h.getModel())!=e&&(i=(c=this.main.getCurrentWorkspace())==null?void 0:c.getModuleForMonacoModel(e)),!i)return;let s=i.methodCallPositions[t.position.lineNumber];if(!s)return;let a=s.filter(u=>u.identifierRange.endColumn<t.position.column&&u.rightBracketPosition.column>=t.position.column);if(a.length>0){let u=a[0];if(u){if(u!=this.lastMethodCallPosition){let g=0;if(Array.isArray(u.possibleMethods))for(let f of u.possibleMethods)f instanceof Pi&&f.parameters.length>g&&(g=f.parameters.length);else typeof u.possibleMethods=="string"&&(u.possibleMethods.indexOf("print")>=0&&(g=u.commaPositions.length+1),u.possibleMethods.indexOf("for")>=0&&(g=2));if(g>1&&this.main.getSettings().getValue("editor.contextSensitiveHelp.ParameterHints")=="true"){this.lastMethodCallPosition=u,setTimeout(()=>{this.editor.trigger("xy","editor.action.triggerParameterHints",{})},10);return}}}else this.lastMethodCallPosition=void 0}}createContextKeys(){Object.values(Q).filter(t=>typeof t=="string").forEach(t=>this.main.getActionManager().registerEditorContextKey("Scheduler_"+t,this.editor.createContextKey("Scheduler_"+t,!1)))}getPositionForHistory(){var e;let t=(e=this.main.getCurrentWorkspace())==null?void 0:e.getCurrentlyEditedFile();if(t!=null)return{position:this.editor.getPosition(),workspace_id:this.main.getCurrentWorkspace().id,file_id:t.id}}pushHistoryState(t,e){if(!(this.main.isEmbedded()||e==null)){if(t)history.replaceState(e,"");else{let i=new Date().getTime();i-this.lastPushTime>200?history.pushState(e,""):history.replaceState(e,""),this.lastPushTime=i}this.lastPosition=e}}setFontSize(t){let e=this.editor.getOptions().get(H.EditorOption.fontSize);this.main instanceof Pd&&this.main.viewModeController.saveFontSize(t),t!=e&&this.editor.updateOptions({fontSize:t});let i=this.main.getBottomDiv();i!=null&&i.console!=null&&(i.console.editor.updateOptions({fontSize:t}),i.$bottomDiv.find(".jo_commandline").css({height:t*1.1+4+"px","line-height":t*1.1+4+"px"}),i.console.editor.layout()),y(".jo_editorFontSize").css("font-size",t+"px"),y(".jo_editorFontSize").css("line-height",t+2+"px"),document.documentElement.style.setProperty("--breakpoint-size",t+"px"),document.documentElement.style.setProperty("--breakpoint-radius",t/2+"px")}async onEvaluateSelectedText(t){let e=this;if(e.cw!=null&&(e.editor.removeContentWidget(e.cw),e.cw=null),e.main.getInterpreter().scheduler.state==Q.paused){let n=e.editor.getModel().getValueInRange(e.editor.getSelection());if(n!=null&&n.length>0){let a=await this.main.getRepl().executeAsync(n,!0);typeof a<"u"&&H.colorize(n+": "+a.text,"myJava",{tabSize:3}).then(l=>{l.endsWith("<br/>")&&(l=l.substr(0,l.length-5)),e.cw={getId:function(){return"my.content.widget"},getDomNode:function(){return y('<div class="jo_editorTooltip jo_codeFont">'+l+"</div>")[0]},getPosition:function(){return{position:t.position,preference:[H.ContentWidgetPositionPreference.ABOVE,H.ContentWidgetPositionPreference.BELOW]}}},e.editor.addContentWidget(e.cw)})}}}dontDetectLastChange(){}}class Xu extends Bi{constructor(e,i){super(o.FileNotFoundExceptionComment(e),i);r(this,"stacktrace",[]);this.filename=e,this.cause=i}}r(Xu,"__javaDeclarations",[{type:"declaration",signature:"class FileNotFoundException extends Exception"},{type:"method",signature:"public FileNotFoundException()",native:Bi.prototype._constructor},{type:"method",signature:"public FileNotFoundException(String message)",native:xe.prototype._constructor_m},{type:"method",signature:"public FileNotFoundException(Throwable cause)",native:xe.prototype._constructor_c},{type:"method",signature:"public FileNotFoundException(String message, Throwable cause)",native:xe.prototype._constructor_m_c},{type:"method",signature:"public String toString()",native:xe.prototype._toString}]),r(Xu,"type");class sg{constructor(t){this.main=t}read(t){return this.getFile(t).getText()}write(t,e){this.getFile(t).setText(e)}append(t,e){let i=this.getFile(t);i.setText(i.getText()+e)}getFile(t){var i;let e=(i=this.main.getCurrentWorkspace())==null?void 0:i.getFiles().find(n=>n.name==t);if(!e)throw new Xu(t);return e}}class ag{constructor(t,e){r(this,"$input");this.$runDiv=t,this.main=e}waitForKey(t,e){var s;let i=(s=this.main.getInterpreter())==null?void 0:s.keyboardManager;if(i||e(void 0),t&&t.length>0){for(let a of t)if(i.isPressed(a)){e(a);return}}else if(i.isAnyKeyPressed()){e(i.getAnyPressedKey());return}let n={onKeyDown:(a,l,h,c)=>{if(!t||t.length==0){i.removeInternalKeyboardListener(n),e(a);return}if(t.indexOf(a)>=0){i.removeInternalKeyboardListener(n),e(a);return}},looseKeyboardFocus:()=>{}};i.addInternalKeyboardListener(n)}readInput(t,e,i,n){let s=this.main.getInterpreter().printManager;t!=null&&t!=""&&(s.beginOfLineState=!0,s.print(`
480
- `+t,!0,void 0),s.flush()),this.$input=y('<input class="jo_newInput" type="text"/>'),s.$outputDiv.append(this.$input);let l=e??"";this.$input.val(l),e&&(this.$input[0].selectionStart=0,this.$input[0].selectionEnd=(""+e).length);let h=this;this.$input.on("keydown",c=>{if(c.key=="Enter"){let u=this.$input.val()||"",g=i(u);if(g.errorMessage){this.$input.detach(),s.print(g.errorMessage,!0,16711680),s.flush(),s.$outputDiv.append(this.$input);let f=this.$input[0];f.scrollIntoView(),f.focus(),f.selectionStart=0,f.selectionEnd=(f.value||"").length}else s.$outputDiv.off("mousedown.inputmanager"),s.print(u,!0,16777215),this.$input.off("keydown"),this.hide(),n(g.convertedValue)}}),setTimeout(()=>{h.$input.focus()},200),s.$outputDiv.on("mousedown.inputmanager",c=>{setTimeout(()=>{var u;(u=h.$input)==null||u.focus()},200)})}hide(){this.$input!=null&&(this.$input.remove(),this.$input=null)}}const og="data:image/svg+xml,%3c!--%20By%20Sam%20Herbert%20(@sherb),%20for%20everyone.%20More%20@%20http://goo.gl/7AJzbL%20--%3e%3c!--%20Todo:%20add%20easing%20--%3e%3csvg%20width='57'%20height='57'%20viewBox='0%200%2057%2057'%20xmlns='http://www.w3.org/2000/svg'%20stroke='%23317c0e'%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cg%20transform='translate(1%201)'%20stroke-width='2'%3e%3ccircle%20cx='5'%20cy='50'%20r='5'%3e%3canimate%20attributeName='cy'%20begin='0s'%20dur='2.2s'%20values='50;5;50;50'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3canimate%20attributeName='cx'%20begin='0s'%20dur='2.2s'%20values='5;27;49;5'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3c/circle%3e%3ccircle%20cx='27'%20cy='5'%20r='5'%3e%3canimate%20attributeName='cy'%20begin='0s'%20dur='2.2s'%20from='5'%20to='5'%20values='5;50;50;5'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3canimate%20attributeName='cx'%20begin='0s'%20dur='2.2s'%20from='27'%20to='27'%20values='27;49;5;27'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3c/circle%3e%3ccircle%20cx='49'%20cy='50'%20r='5'%3e%3canimate%20attributeName='cy'%20begin='0s'%20dur='2.2s'%20values='50;50;5;50'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3canimate%20attributeName='cx'%20from='49'%20to='49'%20begin='0s'%20dur='2.2s'%20values='49;5;27;49'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3c/circle%3e%3c/g%3e%3c/g%3e%3c/svg%3e";class mo{constructor(){r(this,"$dialog");r(this,"$dialogMain");r(this,"$dialogFooter")}initAndOpen(){this.$dialog=y("#dialog"),this.$dialog.empty(),y("#main").css("visibility","hidden"),this.$dialog.append(y('<div style="height: 20px"></div><div class="dialog-main"></div><div class="dialog-footer"></div>')),this.$dialogMain=this.$dialog.find(".dialog-main"),this.$dialogFooter=this.$dialog.find(".dialog-footer"),this.$dialog.css("visibility","visible"),this.$dialogMain.empty(),this.$dialogFooter.empty()}heading(t){let e=y('<div class="dialog-heading">'+t+"</div>");return this.$dialogMain.append(e),e}addDiv(t){this.$dialogMain.append(t)}subHeading(t){let e=y('<div class="dialog-subheading">'+t+"</div>");return this.$dialogMain.append(e),e}description(t,e){let i=e==null?"":`style="color: ${e}"`,n=y(`<div class="dialog-description" ${i}>${t}</div>`);return this.$dialogMain.append(n),n}input(t,e){let i=y(`<input class="dialog-input" type="${t}" placeholder="${e}"></input>`);return this.$dialogMain.append(i),i}buttons(t){let e=y('<div class="dialog-buttonRow"></div>');this.$dialogMain.append(e);for(let i of t){let n=y(`<button style="background-color: ${i.color};margin-left: 20px">${i.caption}</button>`);n.on("click",()=>{i.callback()}),e.append(n)}}waitMessage(t){let e=y(`<div class="dialog-wait">${t}<img src="${og}"></div>`);return this.$dialogMain.append(e),i=>{let n=i?"visible":"hidden";e.css("visibility",n)}}close(){this.$dialog.css("visibility","hidden"),this.$dialog.empty(),y("#main").css("visibility","visible")}addCheckbox(t,e,i){let n='<input type="checkbox" name="'+i+'"'+(e?" checked":"")+">",s=y(n),a=y('<label for="'+i+'">'+t+"</label>"),l=y('<div class="jo_checkbox_div"></div>');return l.append(s,a),a.on("click",()=>{s.prop("checked",!s.prop("checked"))}),this.$dialogMain.append(l),()=>s.is(":checked")}}class Uy{constructor(t){this.main=t}init(){let t=y("#buttonUserSettings"),e=this;t.on("click",i=>{let n=[{caption:pt.changePassword()+"...",callback:()=>{new lg(e.main).show()}}];Vn(n,t.offset().left,t.offset().top+t.height())})}}class lg{constructor(t){r(this,"dialog");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(pt.changePassword()),this.dialog.description(pt.changePasswordDescription());let t=this.dialog.input("password",pt.oldPassword()),e=this.dialog.input("password",pt.newPassword()),i=this.dialog.input("password",pt.repeatNewPassword()),n=this.dialog.description("","red"),s=this.dialog.waitMessage(pt.pleaseWait());this.dialog.buttons([{caption:pt.cancel(),color:"#a00000",callback:()=>{this.dialog.close()}},{caption:pt.ok(),color:"green",callback:()=>{e.val()!=i.val()?n.text(pt.passwordsDontMatch()):(s(!0),Re("changePassword",{oldPassword:t.val(),newPassword:e.val()},()=>{s(!1),alert(pt.settingPasswordSuccessful()),this.dialog.close()},a=>{s(!1),n.text(a)}))}}])}}const ar=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"],Gm=[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,62,255,255,255,63,52,53,54,55,56,57,58,59,60,61,255,255,255,0,255,255,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,255,255,255,255,255,255,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];function Pl(p){if(p>=Gm.length)throw new Error("Unable to parse base64 string.");const t=Gm[p];if(t===255)throw new Error("Unable to parse base64 string.");return t}function dg(p){let t="",e,i=p.length;for(e=2;e<i;e+=3)t+=ar[p[e-2]>>2],t+=ar[(p[e-2]&3)<<4|p[e-1]>>4],t+=ar[(p[e-1]&15)<<2|p[e]>>6],t+=ar[p[e]&63];return e===i+1&&(t+=ar[p[e-2]>>2],t+=ar[(p[e-2]&3)<<4],t+="=="),e===i&&(t+=ar[p[e-2]>>2],t+=ar[(p[e-2]&3)<<4|p[e-1]>>4],t+=ar[(p[e-1]&15)<<2],t+="="),t}function fm(p){if(p.length%4!==0)throw new Error("Unable to parse base64 string.");const t=p.indexOf("=");if(t!==-1&&t<p.length-2)throw new Error("Unable to parse base64 string.");let e=p.endsWith("==")?2:p.endsWith("=")?1:0,i=p.length,n=new Uint8Array(3*(i/4)),s;for(let a=0,l=0;a<i;a+=4,l+=3)s=Pl(p.charCodeAt(a))<<18|Pl(p.charCodeAt(a+1))<<12|Pl(p.charCodeAt(a+2))<<6|Pl(p.charCodeAt(a+3)),n[l]=s>>16,n[l+1]=s>>8&255,n[l+2]=s&255;return n.subarray(0,n.length-e)}class ot{}r(ot,"confirmInput",t=>d({de:`Wollen Sie die ${t} ausgewählten Workspaces wirklich importieren?`,en:`Do you really want to import the ${t} selected workspaces?`,fr:`Voulez-vous vraiment importer les ${t} workspaces sélectionnés?`})),r(ot,"importWorkspace",()=>d({de:"Workspace importieren",en:"Import workspace"})),r(ot,"importWorkspaceDescription",()=>d({de:"1. Bitte klicken Sie auf den Button 'Datei auswählen...' oder ziehen Sie eine Datei auf das gestrichelt umrahmte Feld.",en:"1. Use button 'Choose file...' or drop file on dotted rectangle."})),r(ot,"wrongFileFormat",t=>d({de:"Das Format der Datei "+t+" passt nicht.",en:"File "+t+" has wrong file format."})),r(ot,"noJson",t=>d({de:"Die Datei "+t+" ist keine gültige JSON-Datei.",en:"File "+t+" doesn't contain JSON code."})),r(ot,"withFiles",t=>d({de:"mit "+t+" Dateien",en:"with "+t+" files"})),r(ot,"dragFilesHere",()=>d({de:"Dateien hierhin ziehen",en:"Drag files here."})),r(ot,"dragDropTutorial",()=>d({de:"2. In der linken Baumansicht sehen Sie die Workspaces der importierten Datei. Sie können mehrere Workspaces/Ordner durch <Strg> + Click bzw. <Shift> + Click markieren. Ziehen Sie die gewünschten Workspaces in die rechte Baumansicht, um sie zu importieren.",en:"2. The left tree view shows the workspaces of the imported file. You can select multiple workspaces/folders using <Ctrl> + Click or <Shift> + Click. Drag and drop the desired folders/workspaces to the right tree view to import them.",fr:"2. La vue arborescente de gauche affiche les workspaces du fichier importé. Vous pouvez sélectionner plusieurs workspaces/dossiers en utilisant <Ctrl> + Clic ou <Shift> + Clic. Faites glisser et déposez les dossiers/workspaces souhaités dans la vue arborescente de droite pour les importer."})),r(ot,"cancel",()=>d({de:"Abbrechen",en:"Cancel"})),r(ot,"ok",()=>d({de:"OK",en:"OK"})),r(ot,"import",()=>d({de:"Importieren",en:"Import"})),r(ot,"serverNotReachable",()=>d({de:"Der Server ist nicht erreichbar.",en:"Server not reachable."}));class Br{static async exportAllWorkspaces(t){let e=[];for(let i of t.projectExplorer.workspaceTreeview.rootNode.getOrderedNodeListRecursively().map(n=>n.externalObject)){let n=await Br.exportWorkspace(i);e.push(n)}return e}static async exportFolder(t,e){let i=e.findNodeByElement(t);if(!i)return[];let n=i.getOrderedNodeListRecursively().map(a=>a.externalObject);n.unshift(t);let s=[];for(let a of n){let l=await Br.exportWorkspace(a);a==t&&(l.parent_folder_id=null),s.push(l)}return s}static async exportWorkspace(t){let e;if(t.spritesheetId)try{let i=new As;await i.load(t.spritesheetId),i.zipFile!=null&&(e=dg(i.zipFile))}catch{console.log("Hier!")}return{name:t.name,id:t.id,modules:t.getFiles().map(i=>Br.exportFile(i)),settings:t.settings,spritesheetBase64:e,parent_folder_id:t.parent_folder_id,isFolder:t.isFolder}}static exportFile(t){return{name:t.name,text:t.getText(),identical_to_repository_version:t.identical_to_repository_version,is_copy_of_id:t.is_copy_of_id,repository_file_version:t.repository_file_version,isFolder:t.isFolder,parent_folder_id:t.parent_folder_id}}}class Qy{constructor(t,e){r(this,"networkManager",null);this.main=t,this.owner_id=e,this.networkManager=t.networkManager}async importWorkspaces(t,e,i){for(;!e.isFolder&&!e.isRootNode;)e=e.getParent();if(!confirm(ot.confirmInput(t.length)))return;let n=new Set(t.filter(g=>g.isFolder).map(g=>g.id));t.forEach(g=>{n.has(g.parent_folder_id)||(g.parent_folder_id=null)});let s=[],a=-1,l=new Set;for(;s.length>a;){a=s.length;for(let g of t)!l.has(g.id)&&(g.parent_folder_id==null||l.has(g.parent_folder_id))&&(s.push(g),l.add(g.id))}i&&(i.init(0,s.length),i.show());let h=0,c=new Map,u=[];for(let g of s){i&&i.set(h++);let f=g.parent_folder_id==null?e:c.get(g.parent_folder_id),b=f.isRootNode()?null:f.externalObject.id,A=await this.importWorkspaceWithoutSpritesheet(g,b);if(await this.importSpritesheet(g,A),A){let k=A.repository_id==null?"img_workspace-dark":"img_workspace-dark-repository",C=f.treeview.addNode(A.isFolder,A.name,k,A);u.push(C),A.isFolder&&c.set(g.id,C)}}i&&i.hide(),u.forEach(g=>g.setCaptionColor("#00b000"))}async importSpritesheet(t,e){if(this.networkManager&&!t.isFolder&&t.spritesheetBase64&&e!=null){let i=fm(t.spritesheetBase64);try{let n=await Cl.uploadSpritesheet(i,e.id,!1);e.spritesheetId=n}catch{}}}async importWorkspaceWithoutSpritesheet(t,e=null){let i=new yi(t.name,this.main,this.owner_id);i.isFolder=t.isFolder||!1,i.settings=t.settings,i.parent_folder_id=e;let n=!0;if(this.networkManager&&(n=await this.networkManager.sendCreateWorkspace(i,this.owner_id)),n){this.main.addWorkspace(i);for(let s of t.modules){let a=await this.importFile(s,i);a&&i.addFile(a)}return i}return null}async importFile(t,e){let i=new Ue(this.main,t.name);return i.setText(t.text),i.identical_to_repository_version=t.identical_to_repository_version,i.is_copy_of_id=t.is_copy_of_id,i.repository_file_version=t.repository_file_version,i.isFolder=t.isFolder||!1,i.parent_folder_id=t.parent_folder_id||null,this.networkManager&&(this.networkManager.sendCreateFile(i,e,this.owner_id)||(i=null)),i}}class Yy{constructor(){r(this,"elementOuter");r(this,"elementInner");r(this,"parent");r(this,"min");r(this,"max");this.parent=document.getElementById("bitteWarten"),this.elementOuter=R.makeDiv(this.parent,"jo_progressBar"),this.elementInner=R.makeDiv(this.elementOuter,"jo_progressBarInner")}show(){this.parent.style.display="flex"}hide(){this.parent.style.display="none"}init(t,e){this.min=t,this.max=e}set(t,e){let i=(t-this.min)/(this.max-this.min)*100;this.elementInner.style.width=i+"%"}}class Zy{constructor(t){r(this,"dialog");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(ot.importWorkspace()),this.dialog.description(ot.importWorkspaceDescription());let t=y('<input type="file" id="file" name="file" multiple />');this.dialog.addDiv(t);let e=y('<div class="jo_importDragDropDiv" style="flex-basis: 20px; flex-grow: 1; overflow: auto"></div>'),i=R.makeDiv(e[0],"jo_importLeft","jo_scrollable"),n=R.makeDiv(e[0],"jo_importRight","jo_scrollable"),s=new di(i,{captionLine:{enabled:!0,text:"Inhalt der importierten Datei:"},withSelection:!0,selectMultiple:!0,selectWholeFolders:!0,isDragAndDropSource:!0,buttonAddElements:!1,buttonAddFolders:!1,withDeleteButtons:!1,withFolders:!0,keyExtractor:h=>h.id,parentKeyExtractor:h=>h.parent_folder_id,orderBy:"comparator"}),a=new di(n,{captionLine:{enabled:!0,text:"Ihre Workspaces:"},withSelection:!1,selectMultiple:!1,isDragAndDropSource:!1,buttonAddElements:!1,buttonAddFolders:!1,withDeleteButtons:!1,withFolders:!0,comparator:(h,c)=>h.name>c.name?1:h.name<c.name?-1:0,keyExtractor:h=>h.id,parentKeyExtractor:h=>h.parent_folder_id,orderBy:"comparator"});a.addDragDropSource({treeview:s,defaultDragKind:"copy",dropInsertKind:"asElement"}),a.dropEventCallback=(h,c)=>{this.dropEventCallback(s,a,c)},t.on("change",h=>{var c=h.originalEvent.target.files;this.fillSourceTreeview(c,s)});let l=y(`<div class="jo_workspaceimport_dropzone">${ot.dragFilesHere()}</div>`);this.dialog.addDiv(l),this.dialog.description("").text(ot.dragDropTutorial()),l.on("dragover",h=>{h.stopPropagation(),h.preventDefault(),h.originalEvent.dataTransfer.dropEffect="copy"}),l.on("drop",h=>{h.stopPropagation(),h.preventDefault();var c=h.originalEvent.dataTransfer.files;this.fillSourceTreeview(c,s)}),this.dialog.addDiv(e),this.fillDestTreeview(a),this.dialog.buttons([{caption:ot.ok(),color:"#18a000ff",callback:()=>{this.main.workspaceList=a.getOrderedNodeListRecursively().map(h=>h.externalObject),this.main.projectExplorer.renderWorkspaces(this.main.workspaceList),this.dialog.close()}}])}async dropEventCallback(t,e,i){let n=t.getOrderedListOfCurrentlySelectedNodes().map(l=>l.externalObject),s=this.main.user.id;this.main.workspacesOwnerId!=null&&(s=this.main.workspacesOwnerId);let a=new Yy;await new Qy(this.main,s).importWorkspaces(n,i,a)}fillSourceTreeview(t,e){e.clear();for(let n=0;n<t.length;n++){let s=t[n];var i=new FileReader;i.onload=a=>{let l=a.target.result;if(!(l.startsWith("{")||l.startsWith("["))){alert(ot.wrongFileFormat(s.name));return}let h=[];try{h=JSON.parse(l),Array.isArray(h)||(h=[h])}catch{alert(ot.noJson(s.name));return}for(let c of h)if(c.modules==null||c.name==null||c.settings==null){alert(ot.wrongFileFormat(s.name));return}else e.addNode(c.isFolder,c.name,c.isFolder?void 0:"img_workspace-dark",c)},i.readAsText(s)}}fillDestTreeview(t){t.clear();let e=this.main.workspaceList;for(let i of e)t.addNode(i.isFolder,i.name,"img_workspace-dark",i)}}class Xy{constructor(t){r(this,"dialog");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(Wt.reportBug()),this.dialog.description(Wt.bugReport()+":");let t=R.makeElement(this.dialog.$dialogMain[0],"textarea","jo_issuereporterr_textfield"),e=this.dialog.addCheckbox(Wt.sendCopyOfWorkspace(),!0,"jo_cbIssueAddWorkspace"),i=this.dialog.input("text",Wt.email()),n=this.dialog.input("text",Wt.firstName()),s=this.dialog.input("text",Wt.lastName());this.dialog.buttons([{caption:Wt.cancel(),color:"#a00000",callback:()=>{this.dialog.close()}},{caption:Wt.send(),color:"green",callback:async()=>{let a={workspace_id:e()?this.main.getCurrentWorkspace().id:null,description:t.value,mail:i.val(),rufname:n.val(),familienname:s.val()};(await dt("/servlet/reportIssue",a)).success&&alert(Wt.thanks()),this.dialog.close()}}])}}class x{}r(x,"Saving",()=>d({de:"Speichere...",en:"saving...",fr:"enregistrement..."})),r(x,"Saved",()=>d({de:"Gespeichert",en:"saved",fr:"enregistré"})),r(x,"OptionDefault",()=>d({de:"Standard",en:"default",fr:"par défaut"})),r(x,"OptionTrue",()=>d({de:"Ja",en:"true",fr:"Oui"})),r(x,"OptionFalse",()=>d({de:"Nein",en:"false",fr:"Non"})),r(x,"CloseButton",()=>d({de:"Schließen",en:"Close",fr:"Fermer"})),r(x,"SettingsHeading",()=>d({de:"Einstellungen",en:"Settings",fr:"Paramètres"})),r(x,"UserSettingsTabHeading",()=>d({de:"Meine Einstellungen",en:"My Settings",fr:"Mes paramètres"})),r(x,"ClassSettingsTabHeading",()=>d({de:"Klassen-Einstellungen für ",en:"Class Settings for ",fr:"Paramètres de la classe pour "})),r(x,"SchoolSettingsTabHeading",()=>d({de:"Schul-Einstellungen",en:"School Settings",fr:"Paramètres de l'école"})),r(x,"ScopeUser",()=>d({de:"Benutzer",en:"User",fr:"Utilisateur"})),r(x,"ScopeClass",()=>d({de:"Klasse",en:"Class",fr:"Classe"})),r(x,"ScopeSchool",()=>d({de:"Schule",en:"School",fr:"École"})),r(x,"EditorSettingsName",()=>d({de:"Editoreinstellungen",en:"Editor Settings",fr:"Paramètres de l'éditeur"})),r(x,"EditorSettingsDescription",()=>d({de:"Hier können Sie die Einstellungen des Editors anpassen.",en:"Here you can adjust the editor settings.",fr:"Ici, vous pouvez ajuster les paramètres de l'éditeur."})),r(x,"HoverVerbosityName",()=>d({de:"Texte beim Hovern über Code",en:"Hover-Verbosity",fr:"Verbosité des infobulles"})),r(x,"HoverVerbosityDescription",()=>d({de:"Menge an Informationen, die in Hover-Infoballons angezeigt werden.",en:"Information amount displayed in hover tooltips.",fr:"Quantité d'informations affichées dans les infobulles."})),r(x,"ShowHelpOnKeywordsAndOperators",()=>d({de:"Hilfstexte für Schlüsselwörter und Operatoren anzeigen",en:"Show help texts for keywords and operators",fr:"Afficher les textes d'aide pour les mots-clés et les opérateurs"})),r(x,"ShowMethodDeclaration",()=>d({de:"Methodendeklarationen anzeigen",en:"Show method declarations",fr:"Afficher les déclarations de méthodes"})),r(x,"None",()=>d({de:"Keine",en:"None",fr:"Aucun"})),r(x,"Declarations",()=>d({de:"Deklarationen",en:"Declarations",fr:"Déclarations"})),r(x,"DeclarationsAndComments",()=>d({de:"Deklarationen und Kommentare",en:"Declarations and Comments",fr:"Déclarations et commentaires"})),r(x,"ShowClassDeclaration",()=>d({de:"Klassendeklarationen anzeigen",en:"Show class declaration",fr:"Afficher la déclarations de la classes"})),r(x,"ShowStructureStatementHelp",()=>d({de:"Hilfe für Strukturanweisungen anzeigen",en:"Show help for structure statements",fr:"Afficher l'aide pour les instructions de structure"})),r(x,"TypingAssistanceName",()=>d({de:"Unterstützung bei der Eingabe von Code",en:"Typing Assistance",fr:"Assistance à la saisie de code"})),r(x,"EditorViewSettings",()=>d({de:"Anzeigeeinstellungen des Editors",en:"Editor View Settings",fr:"Paramètres d'affichage de l'éditeur"})),r(x,"EditorViewSettingsDescription",()=>d({de:"Hier können Sie die Anzeigeeinstellungen des Editors anpassen.",en:"You can adjust the editor view settings here.",fr:"Vous pouvez ajuster les paramètres d'affichage de l'éditeur ici."})),r(x,"TypingAssistanceDescription",()=>d({de:"Hier können Sie die Eingabeunterstützung des Editors anpassen.",en:"Here you can adjust the typing assistance of the editor.",fr:"Ici, vous pouvez ajuster l'assistance à la saisie de l'éditeur."})),r(x,"AutoClosingBracketsName",()=>d({de:"Automatisches Schließen von Klammern",en:"Auto Closing Brackets",fr:"Fermeture automatique des parenthèses"})),r(x,"BracketPairLines",()=>d({de:"Linien zwischen Klammerpaaren anzeigen",en:"Display lines between bracket pairs",fr:"Afficher les lignes entre les paires de parenthèses"})),r(x,"StickyScroll",()=>d({de:"Sticky Scroll",en:"Sticky Scroll",fr:"Défilement fixe"})),r(x,"StickyScrollDescription",()=>d({de:"Zeigt die aktuellen Blocküberschriften (z.B. Methoden- oder Klassennamen) immer oben im Editor an, auch wenn diese nicht mehr im sichtbaren Bereich sind.",en:"Always displays the current block headers (e.g., method or class names) at the top of the editor, even when they are no longer in the visible area.",fr:"Affiche toujours les en-têtes de bloc actuels (par exemple, les noms de méthodes ou de classes) en haut de l'éditeur, même lorsqu'ils ne sont plus dans la zone visible."})),r(x,"BracketPairLinesDescription",()=>d({de:"Vertikale Linien zwischen passenden Klammerpaaren anzeigen, gegebenfalls um Unterstreichung des Scope-Beginns.",en:"Display vertical lines between matching bracket pairs, possibly with underlined scope-start.",fr:"Afficher des lignes verticales entre les paires de parenthèses correspondantes, éventuellement avec le début du scope souligné."})),r(x,"BracketPairLinesOff",()=>d({de:"Keine Linien anzeigen",en:"Do not display lines",fr:"Ne pas afficher de lignes"})),r(x,"BracketPairLinesVertical",()=>d({de:"Vertikale Linien anzeigen (entspricht Scope)",en:"Display vertical lines (according to scope)",fr:"Afficher des lignes verticales (selon le scope)"})),r(x,"BracketPairLinesVerticalAndUnderlined",()=>d({de:"Vertikale Linien und Unterstreichung anzeigen",en:"Display vertical lines and underline",fr:"Afficher des lignes verticales et souligner"})),r(x,"AutoSemicolonsName",()=>d({de:"Automatisches Ergänzen von Strichpunkten",en:"Auto Semicolons",fr:"Point-virgules automatiques"})),r(x,"AutoSemicolonsDescription",()=>d({de:"Fehlende Strichpunkte am Ende der Zeile werden in den meisten Fällen automatisch ergänzt.",en:"Missing semicolons at the end of the line are automatically added in most cases.",fr:"Les points-virgules manquants à la fin de la ligne sont automatiquement ajoutés dans la plupart des cas."})),r(x,"On",()=>d({de:"Ein",en:"On",fr:"Activé"})),r(x,"Off",()=>d({de:"Aus",en:"Off",fr:"Désactivé"})),r(x,"AutoClosingQuotesName",()=>d({de:"Automatisches Schließen von Anführungszeichen",en:"Auto Closing Quotes",fr:"Fermeture automatique des guillemets"})),r(x,"AutoClosingBracketsDescription",()=>d({de:"Bei Eingabe von öffnenden Klammern wird automatisch die schließende Klammer hinzugefügt.",en:"Automatically add closing brackets when typing opening brackets.",fr:"Ajoute automatiquement les parenthèses fermantes lors de la saisie des parenthèses ouvrantes."})),r(x,"AutoClosingQuotesDescription",()=>d({de:"Bei Eingabe eines Anführungszeichens wird automatisch ein zweites hinter dem Cursor hinzugefügt.",en:"Automatically add a second quote behind the cursor when typing a quote.",fr:"Ajoute automatiquement un deuxième guillemet derrière le curseur lors de la saisie d'un guillemet."})),r(x,"AutoClosingBracketsAlways",()=>d({de:"Immer",en:"Always",fr:"Toujours"})),r(x,"AutoClosingBracketsNever",()=>d({de:"Nie",en:"Never",fr:"Jamais"})),r(x,"AutoClosingBracketsBeforeWhitespace",()=>d({de:"Nur vor Leerzeichen",en:"Only before whitespace",fr:"Seulement avant les espaces"})),r(x,"ClassDiagramSettingsName",()=>d({de:"Klassendiagramm",en:"Class Diagram",fr:"Diagramme de classes"})),r(x,"ClassDiagramSettingsDescription",()=>d({de:"Hier können Sie die Einstellungen für das Klassendiagramm anpassen.",en:"Here you can adjust the settings for the class diagram.",fr:"Ici, vous pouvez ajuster les paramètres du diagramme de classes."})),r(x,"ClassDiagramTypeConventionName",()=>d({de:"Darstellungsweise von Datentypen",en:"Type Representation",fr:"Représentation des types"})),r(x,"ClassDiagramBackground",()=>d({de:"Hintergrund beim Exportieren als png-Datei",en:"Background when exporting as png file",fr:"Arrière-plan lors de l'exportation en fichier png"})),r(x,"classDiagramOmitVoidReturnType",()=>d({de:'Rückgabetyp "void" im Klassendiagramm weglassen',en:'Omit "void" return type in class diagram',fr:'Omettre le type de retour "void" dans le diagramme de classes'})),r(x,"ClassDiagramOmitVoidReturnTypeDescription",()=>d({de:'Legt fest, ob im Klassendiagramm bei Methoden der Rückgabetyp "void" weggelassen werden soll.',en:'Determines whether the return type "void" should be omitted in the class diagram for methods.',fr:'Détermine si le type de retour "void" doit être omis dans le diagramme de classes pour les méthodes.'})),r(x,"show",()=>d({de:"anzeigen",en:"show",fr:"afficher"})),r(x,"omit",()=>d({de:"weglassen",en:"omit",fr:"omettre"})),r(x,"ClassDiagramBackgroundDescription",()=>d({de:"Legt fest, ob der Hintergrund des Klassendiagramms beim Exportieren als png-Datei transparent oder weiß sein soll.",en:"Determines whether the background of the class diagram should be transparent or white when exporting as a png file.",fr:"Détermine si l'arrière-plan du diagramme de classes doit"})),r(x,"ClassDiagramTypeConventionDescription",()=>d({de:"Wenn Datentypen im Klassendiagramm angezeigt werden, kann dies entweder in der Art von Java (z.B. String name) erfolgen oder in der Art von Pascal (name: String).",en:"If data types are displayed in the class diagram, they can be shown in either Java style (e.g., String name) or Pascal style (name: String).",fr:"Si les types de données sont affichés dans le diagramme de classes, ils peuvent être présentés dans le style Java (par exemple, String name) ou dans le style Pascal (name: String)."})),r(x,"ClassDiagramTypeConventionJava",()=>d({de:"Java-Stil (z.B. String name)",en:"Java Style (e.g., String name)",fr:"Style Java (par exemple, String name)"})),r(x,"ClassDiagramTypeConventionPascal",()=>d({de:"Pascal-Stil (name: String)",en:"Pascal Style (name: String)",fr:"Style Pascal (name: String)"})),r(x,"ClassDiagramBackgroundTransparent",()=>d({de:"durchsichtig",en:"transparent",fr:"transparent"})),r(x,"ClassDiagramBackgroundWhite",()=>d({de:"weiß",en:"white",fr:"blanc"})),r(x,"CompilerSettingsName",()=>d({de:"Compiler-Einstellungen",en:"Compiler settings"})),r(x,"CompilerSettingsDescription",()=>d({de:"Hier können Sie die Einstellungen des Compilers vornehmen.",en:"Here you can adjust the compiler settings."})),r(x,"ExplorerSettingsName",()=>d({de:"Explorer-Einstellungen",en:"Explorer settings"})),r(x,"ExplorerSettingsDescription",()=>d({de:"Einstellungen für den Datei- und Workspaceexplorer (im Hauptfenster links).",en:"Settings for file- and workspace explorer (in the main window on the left)."})),r(x,"CompilerShadowedSymbolErrorLevelName",()=>d({de:"Errorlevel bei verdeckten Symbolen",en:"Error level for shadowed symbols"})),r(x,"CompilerShadowedSymbolErrorLevelDescription",()=>d({de:"Welches Errorlevel soll der Fehler haben, wenn eine Variable in einem inneren Scope eine andere gleichnamige Variable in einem äußeren Scope verdeckt?",en:"What error level should the error have if a variable in an inner scope shadows another variable with the same name in an outer scope?"})),r(x,"ExplorerFileOrderName",()=>d({de:"Sortierung des Dateibaums",en:"Order of file treeview"})),r(x,"ExplorerFileOrderDescription",()=>d({de:"Hier können Sie einstellen, ob der Dateibaum grundsätzlich alphabetisch sortiert werden soll oder der Nutzer durch drag and drop eine davon abweichende Sortierung festlegen kann.",en:"You can set here whether the file tree should be sorted alphabetically by default or whether the user can define a different sorting by drag and drop."})),r(x,"ExplorerWorkspaceOrderName",()=>d({de:"Sortierung des Workspacebaums",en:"Order of workspace treeview"})),r(x,"ExplorerWorkspaceOrderDescription",()=>d({de:"Hier können Sie einstellen, ob der Workspacebaum grundsätzlich alphabetisch sortiert werden soll oder der Nutzer durch drag and drop eine davon abweichende Sortierung festlegen kann.",en:"You can set here whether the workspace tree should be sorted alphabetically by default or whether the user can define a different sorting by drag and drop."})),r(x,"ExplorerOrderComparator",()=>d({de:"Immer alphabetisch",en:"Always alphabetical",fr:"Toujours alphabétique"})),r(x,"ExplorerOrderUserDefined",()=>d({de:"Nutzerdefinierte Sortierung",en:"User-defined order",fr:"Ordre défini par l'utilisateur"})),r(x,"ErrorLevelIgnore",()=>d({de:"Ignorieren",en:"Ignore",fr:"Ignorer"})),r(x,"ErrorLevelWarning",()=>d({de:"Warnung",en:"Warning",fr:"Avertissement"})),r(x,"ErrorLevelError",()=>d({de:"Fehler",en:"Error",fr:"Erreur"})),r(x,"ErrorLevelInfo",()=>d({de:"Info",en:"Info",fr:"Info"})),r(x,"ContextSensitiveHelpName",()=>d({de:"Kontextsensitive Hilfe",en:"Context-sensitive help"})),r(x,"ContextSensitiveHelpDescription",()=>d({de:"Hier können Sie einstellen, ob in bestimmten Bereichen der Anwendung kontextsensitive Hilfetexte angezeigt werden sollen.",en:"Here you can set whether context-sensitive help texts should be displayed in certain areas of the application."})),r(x,"ContextSensitiveHelpParameterHintsName",()=>d({de:"Parameterhinweise",en:"Parameter hints"})),r(x,"ContextSensitiveHelpParameterHintsDescription",()=>d({de:"Hier können Sie einstellen, ob dann, wenn sich der Cursor in einem Methodenaufruf befindet, Hinweise zu den Parametern dieser Methode angezeigt werden sollen. <br>",en:"Here you can set whether hints about the parameters of a method should be displayed whenever the cursor is inside a method call."}));const Jy="data:image/png;base64,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",ev="data:image/png;base64,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",tv="data:image/png;base64,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",iv="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASoAAACPCAIAAADC/gGRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAABGESURBVHhe7Z3fa11VFsfnn5ARcTJFkIwaR4hCbWxhKHVoFRWaKCKlkaaZSaMjffDBh2QCFptJiSZ96FNCi+VWiKhtUUszBV+EodFy6YPkoUT/B+cPcGat/XPtffY599zk3rtv2u/ig5yz7777nLP3/py1z03x/G4AgUBkCuiHQGQL6IdAZAvoh0Bkizb0e2pm88gqc3Bq3BQhKuLY7N6NawfWJs3u7oknz25MfffT6LTZbTumr9PXNeNnj5tCRCrazn4kYa/0Ozx069qBW7OP6b3Z5QMb14Zn9U4iBteuHdhYHtQ7aurvvXBY73Ux6KzcGUbRln4V7fQ8tH47NUdJ2EP9jh+6SsJff97sth/hnAmmU9ein/WbHN64vPeW6YLBNdqu0I9cpQqXh47xzmMXeDuzfm1FP+nXmdh1+vEQXN5rbpeTw7SdTb+jX+t1ZnGpmdBPVB45asoGBsafXTSFR1a/fsoUUpwZsZWPLH76uClMBum3PHThslJucnhtkm5IbBR1k+wXs8v6DV1YVsodHlqbHbxw2WUedSfTGD91anUyk64iTdFxbX2pBB8oaqRUG3fE+BbgG7Ef6SQZ4K7On4lvh1pYm+QTjsr1VcQt8JlQHfdRxfKBI7VufH7lp6mV66NcuHHorK6gZvnLl8ZpjXqW/+sLXaT003lVsXHoZSpgZ8ZXrqsWrh/Sn1699KSuLU7GrYT5ZK5eOkT/VeW6fdGsZeVDXV+fpC2vlJM7dnZI3+5nl4dn+e5vBlqOkZsnwdCLysFAyA5PjGZKP9bpx2f3mb0oCvqdGZk5Yzb5i8a0x6d+POLKRbSTPOl0lwfpyumCuTvMTNKX4a6KJzr3iNLvGN20Zh87NjusJ5zqKd6w3aT6RU/NUv3sUcLgAbD9ywrZ+R2MQRyFpoJBCiLRDp+h/bq4ZD66nQTRmdhtecncP7a+LK+K0Bye8WyLSi/khraOfDAzW4v0IfvpJj1FQT/5SKnaJBlcyrJf52+pBsXX1Rf1UfQXzYFsIzqS2a9wVhVBHajua2qmUU+6wZLzjbfNoARDJkaWp4odFB/p0Szqx1mrwpBKfyizGW9ZvyDpmaCvt0p6Nsxl0HkvD3N3+NksbJF9xBu0RqXKtGHr+EtV4ayr0q84R6mCEEl8NxiDOFL6RSU2iu3Q5YsSf4Ylo07HEpcZlPv66ZlRiKJ+nJFUpqLCUD9brTD7Y/2svXpPfTo6rQpZD/aE27T6BWqJA8lytW20rNLP16kK08PURWs03/TM4T7kcjk0rv+r9JNjoaJkNIv68eJQrCHjKOrHRrn1pEibrjys7xelFUfhsHPFnSttmLnrphF1gZ6U7vpl74hOtNFaP/2RXiS4CjyJ7coh+CgYgzgK+pmxUS2EGhTboRJxOEafYVDTXZ0/Z4u56sQ5tIzt6BcKQxHrp00IKNdPuxSwLf3MaVgKn4qwc0DOEO7DcG6I/k8PhAo3dq5CyWims199/cIs57OfCPY5kTD3fXqw2sDwhkEhOsL0kbjl0/UnJzSVe4tUNde5vjzuYh1KFV2ndBIHYxBHxdTnI8oTLrZT1nJQHugnLtNHr/RTs98lN4pYv0IFDlXYMvuJaFs/G6qyPJ84aETCjjJdyiMlBsLvpgciCOr8VGUfiWe/snWjjoR+djGp0l1Rv7LVbIs0W6mfvp7LokKZfqILZN+pzjXdTTXt3SgMoS7XSfRvWbfqqJr63KA4YVY9ap+Pnvh6cEQ/6nxpUQ+o6JF+sWyJEvnsZ6NUv0SDKsr1i3fjKGnQBXVgUj95Fy5MCd3hXDM5PcR8S49m6qcXY2C0dGRbXGGy/ODUpzb7yZ89N8VvMEEjKSdFFGZ2oF90PdxHaf0o2ECT9KMZrwpvyZ9JuVlbOewv7m73kW0nKHSeB40Qpp2gcjxayh/9kTvJoB0/6in9KEQL/o7Tln7FnxBJiWr9XE03s4uNuI+UIQ6yqFy/uB1TWKFfsL7lNuMzNIUlUegosaBwUyWcEm5eyZ9Jg1EI5mRiNNP67YYIZh4iQ8jsh9hW7Fb9+MaTWC4iehjQb8ex+/QzGT9clyIyBPTbcezexScCsesj1u/EGw8BAHpDQj+zhUAguhzQD4HIFtAPgcgW0A+ByBbQD4HIFtAPgcgW0A+ByBbQD4HIFtAPgcgW0A+ByBbQD4HIFtAPgcgW0A+ByBbQD4HIFtAPgcgW0A+ByBbQD4HIFtAPgcgW0A+ByBaxfm+++qc9e54BAPQA6AdANqAfANmAfgBkoy/0G5r/Yeq7H158JVlu3o8x+k706QK/T+NqYygo7C6Dp+4cWd0cGY3LNU/PbB48NR0VghTnbpy+03g6KiSmn1ss7d5KSr9Ig2Le59NHQ+PPtq/102gJ0/p9981IUNhdeq3fwtLW1uc3F/Tu0SvNz7e2luZlhc4zfXOLjmJZ78aUnW5MbjZfSrbcef00fXZnvB/06zs6PsYTjYvkwN3GUd5dWLrbvLjVnJsI63SYk3N3veFKxU4beOKlO/cmPztRKFdAv87ox6lpfL5h37dm1XqlwS/lmD/ltqdWFmjb6Df/jV5n6kJHQb9TL/J7TDVR9tMpMflRyOiNI6s3nk7uvvDZQfcSwplzpsKec/bNhHeee8F+i+GuNJVrrXB0ElM4l/Sk5//Kcqp58UpjSQlw9Mr63DzZaGRINcK2XLxyUm8/M79uvbUaG6ROKrsq7BepRBrOFayNvrJNyHTC4e2AD8Tt6zNxiVRm7OSy0/Ut4yzSa41EoRsUHik9anpCu3bEyCqK+onG48oxCz+vbv02Y9YgH081f1tt3t4vK9QlcZld1M86o2zRD2lV+tk677CEMteVZD8toXSsradB7ovUoMpy3g6HjUoC/Whc3WyocYvlGWmtYIVcZhPT1FlEG8pJmtALSzTjaXKr+iWNBImLy40kUiGBctKU87YSyfpjq9nvysq+QdqQlZ3z5j6ir0KcCbH/RiH1sTm230QSkzdE3jbdXqGfqyMHRRMPjWicG1z8bNB9lGJ/49fVrZ/H9MY23UtfZjf1s0lshN9CqhJgdfYTGVImwJr6lVQrRQwkdYcYXTkYNE7B2IT6+eFnWuoXTW6/yxPaJS6rn5nc0zebSzfX2Q2a3FrC0kZcLmIBbIPOFomsoFrWjcicSXDj3Ka7I2iiM3S3AGua0s8qF+jHK883AzHCHnbzUk5WxvVthX7uZhqoq4iGhnZ95cItNcnY+m+LjdszW79O+X5oh5LL7IV+3q46+oXftZ/W1M81UgM3eLRhuyYYXaKT+oV5QMz1wChrERUGc5o3aNKXNuIUYkLluH25aDQV9MpQYbzlvCoa52Nx4/aUTLlNs+YMF+auLKgUbcuD+q5QcfbNzfr6CUPa1C8cFyIcGq7sFoGK1vrt2fPlzBYZ+HGhvB4Z9VPZT3lSO/uZOop29Gsj+7leoBF1YxNlv2h3Z/pFk9ulFDvLVblVMdZM1ad5XNWILeftQBiNyHiB8KkKDCvKu1xZtOa+q/SbpodSTo9N/2ga3wjEd7eb/fxuLf3im2ZCP1+5FvzIN7PABtqHwDbJpp/QTGxreRL6+ZWqba2mfqbxdv4SqMQ799yiuFPyiLqxIdmicYoWKr4CT4sWP71IzZQhZo46hRibzYJChtzgeVzWCG9r/Xj2U0JzAjhkImK1fFIySFW4gvVZVuZt4bCpwzeF5MNe7Hnx2Y873HQpSUJ9KPrTjgvNXbstbojc+bZcGuVddUR3xqDxGvhHPv4Zhh8C3Ufz61sU7npLKbnM7v70YtDuKbRLxPj8Avvj9XP1vXtKxQAlYdg44ZTTBhrqLETVEMrVJqEM1MsSP2Y8A0yhwkroymfOKZkLk17CApj1nkt3gRVu7koTFD4FJRuxMuhCtyLVFlkCn42lGtWya0ERyCkq+3JVqHfljSB5NzG71OE3Tm/e2O92GX3nIqj3aGq6+50rDxeHbJcpHA2yn60sTdOKJj4SjW9GqTJC/e7iHvnUL5/SwIVbpN/dxrtmt5zkZfZi8QmAo/LvfruQk5/frZP9SoB+oMdU/KuX3cW7V5r1Vp7lQD/Qe8r+zecDR5f0AwC0piv6/XviPwCAlnRLv6gEAFAE+gGQDegHQDagHwDZgH4AZAP6AZAN6AdANqAfANmAfgBkA/oBkA3oB0A2oB8A2YB+AGQD+gGQDegHQDagHwDZgH4AZAP6AZAN6AdANmL9jo/9+Yknnt8hpF9U0ld8dfVLIioEoPdAPwCykdYvSpHt0ueLT61fVAhA74F+AGTjPtRPvfojfD1QSGv91GtMwneDtGLsl98vbfzR7h4/8V7z/MTcnmfm3v+geeb1465akn2vf3/+gybDX0l89P7hoDAFH7HlgboGH92f5MjKGX3Oh784/8H3J0ZctX7ntYnm+fdW9vnhiyvUwl61GrsvXos+Dbj/9FNv26mtn3hNj0C+XqsO+zcevvTfR8WLe8r1U1NTyxZJxaPVB/rRFGy3HZ618syh34OrX2uEfsrV8FVeRNrJUj5+dOl/D78TvvfUTuIwLfDA+N3XJoKxSepXm3z68UVFk4xuOso69rB6/vUXbgi2cQ/yuKumnmGZCxU8/a2feZmjfnujUILLl+b9m+7EW+Z4N0x9hUa0fnbXY9NdysmyMyHCZWcFLQwp6MeZU+XJQgIRKdR+RTauv9hq3qt7gUbfEXSmDWh9OwjvL9vmk5u1XhWkXq+n33RJ8Msu67xutmbjGeh//WiuK53E85h9EaQqV3W4fGEuqpZoRG377Oe+6yozyrHo7bCFRtxwDvyzkPrSsDNVK7GS7GcziStxSztXwjj9CsvdNHPvu2OF6au9G3+n8lt9Q9w71uu/6hn6bQutmdFD5zplRVAeKVQwqljZ6ac+UkbZykzqd5diI3Y4eeX5yJivWU6H9OPnk0Q1rd9KPfcigkO0p1/r9VU92jHk5O3FrZ+nGr+urlf+fuaBftsieAYTVlT8tlk0SjaiP3X61f/dpdiIPcRXj1zqqX5lK1guVyvGqkNIWGO/ztymfnzOO9JPvxs9jFvxiBRQL3wO3rGeZHuN95BP+lm/4BlM5x9lRfr3Ek3BqKCy/tTql24n5WSiEVuhfvZrtSysn/3K9KNybqTGajCstsuyHz3yNW+PkYHuIbAFyH7bQTyDiZVnsB2jPFFuTDTmlCHyQc5sW/3Ublo/k9zm1/VGohFXv/azn5n0cqIHntTUTz2qhSWMz4qc1lopwceydVQa9A3Kj1qT59lPPfLxzzDqIVB+mqQT+qle6sSPTAF9rJ9aBDr8w1hqcejQSdLXl5Xt8tXq5ysH61VxXPPFVCOmMjH2y+8v/TLgdqtRBpolnx1Lt260aAnFL5MKoZz8yBgrF6W6waKiEk7FugX1xCgri/NJ3A4i5HF3QE1D2D3/yKd++axhYEeyn+rzDlxpQP/qFz5idRKnX4dI/d3vAYLnZScSYJ+T/sF5h/SvfqlnsM7Qaf0S/+rlwYIXZq3z5O7FLAc67R7Rt/pV/b6yQzqvH1H7j+/3JTxBuzA773vS+u0Q0i8q6Su0flEhAL0H+nWex//6DwDqEOuH/9cLAD0D+gGQDegHQDagHwDZgH4AZAP6AZAN6AdANqAfANmAfgBkA/oBkA3oB0A2oB8A2YB+AGQD+gGQDegHQDagHwDZgH4AZAP6AZAN6AdANrqi379KIqoGwANOt/T7w+CTEdAPgAjoB0A2oB8A2eiWfm+/eufe6c17f2u8Df0AKKG72e+jtzabr/4d+gGQpMuLz798e+8tsw39AIiAfgBkA/oBkI0u6/dso3n624+gHwApuqyfMXCTciD0AyCi+4tP+7cH6AdABJ79AMgG9AMgG9APgGx0Vz/8qxcAKuiWfubffNq/OkA/AIp0efEpgH4ARHRLv2RE1QB4wIn1O/HGQ2YLgUB0OaAfApEtoB8CkS2gHwKRLaAfApEtoB8CkS2gHwKRLaAfApEtoB8CkS2gHwKRKQYG/g8AxhGcE/ckYwAAAABJRU5ErkJggg==",nv="data:image/png;base64,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",rv=""+new URL("assets/explorer-B4AQnIGl.png",import.meta.url).href,sv="data:image/png;base64,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",av="data:image/png;base64,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",ov="data:image/png;base64,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";var hg=[{settingType:"group",name:x.EditorSettingsName,description:x.EditorSettingsDescription,settings:[{settingType:"group",name:x.HoverVerbosityName,description:x.HoverVerbosityDescription,settings:[{key:"editor.hoverVerbosity.showHelpOnKeywordsAndOperators",settingType:"setting",name:x.ShowHelpOnKeywordsAndOperators,description:void 0,type:"boolean",image:Jy},{key:"editor.hoverVerbosity.showMethodDeclaration",settingType:"setting",name:x.ShowMethodDeclaration,description:void 0,type:"enumeration",optionValues:["none","declarations","declarationsAndComments"],optionTexts:[x.None,x.Declarations,x.DeclarationsAndComments],image:ev},{key:"editor.hoverVerbosity.showClassDeclaration",settingType:"setting",name:x.ShowClassDeclaration,description:void 0,type:"enumeration",optionValues:["none","declarations","declarationsAndComments"],optionTexts:[x.None,x.Declarations,x.DeclarationsAndComments],image:tv}]},{settingType:"group",name:x.ContextSensitiveHelpName,description:x.ContextSensitiveHelpDescription,settings:[{key:"editor.contextSensitiveHelp.StructureStatements",settingType:"setting",name:x.ShowStructureStatementHelp,description:void 0,type:"enumeration",optionValues:["false","true"],optionTexts:[x.OptionFalse,x.OptionTrue],image:av},{key:"editor.contextSensitiveHelp.ParameterHints",settingType:"setting",name:x.ContextSensitiveHelpParameterHintsName,description:x.ContextSensitiveHelpParameterHintsDescription,type:"enumeration",optionValues:["false","true"],optionTexts:[x.OptionFalse,x.OptionTrue],image:sv,action:(p,t)=>{p.getMainEditor().updateOptions({parameterHints:{enabled:t==="true",cycle:!0}})}}]},{settingType:"group",name:x.TypingAssistanceName,description:x.TypingAssistanceDescription,settings:[{key:"editor.autoClosingBrackets",settingType:"setting",name:x.AutoClosingBracketsName,description:x.AutoClosingBracketsDescription,type:"enumeration",optionValues:["always","beforeWhitespace","never"],optionTexts:[x.AutoClosingBracketsAlways,x.AutoClosingBracketsBeforeWhitespace,x.AutoClosingBracketsNever],action:(p,t)=>{p.getMainEditor().updateOptions({autoClosingBrackets:t})}},{key:"editor.autoClosingQuotes",settingType:"setting",name:x.AutoClosingQuotesName,description:x.AutoClosingQuotesDescription,type:"enumeration",optionValues:["always","beforeWhitespace","never"],optionTexts:[x.AutoClosingBracketsAlways,x.AutoClosingBracketsBeforeWhitespace,x.AutoClosingBracketsNever],action:(p,t)=>{p.getMainEditor().updateOptions({autoClosingQuotes:t})}},{key:"editor.autoSemicolons",settingType:"setting",name:x.AutoSemicolonsName,description:x.AutoSemicolonsDescription,type:"boolean",optionTexts:[x.On,x.Off]}]},{settingType:"group",name:x.EditorViewSettings,description:x.EditorViewSettingsDescription,settings:[{key:"editor.bracketPairLines",settingType:"setting",name:x.BracketPairLines,description:x.BracketPairLinesDescription,type:"enumeration",optionValues:["off","vertical","verticalAndUnderlined"],optionTexts:[x.BracketPairLinesOff,x.BracketPairLinesVertical,x.BracketPairLinesVerticalAndUnderlined],action:(p,t)=>{p.getMainEditor().updateOptions({guides:{bracketPairs:t!=="off",highlightActiveBracketPair:t!=="off",bracketPairsHorizontal:t==="verticalAndUnderlined"}})},image:iv},{key:"editor.stickyScroll",settingType:"setting",name:x.StickyScroll,description:x.StickyScrollDescription,type:"enumeration",optionValues:["off","on"],optionTexts:[x.Off,x.On],action:(p,t)=>{p.getMainEditor().updateOptions({stickyScroll:{enabled:t!=="off"}})}}]}]},{settingType:"group",name:x.ClassDiagramSettingsName,description:x.ClassDiagramSettingsDescription,image:nv,settings:[{key:"classDiagram.typeConvention",settingType:"setting",name:x.ClassDiagramTypeConventionName,description:x.ClassDiagramTypeConventionDescription,type:"enumeration",optionValues:["java","pascal"],optionTexts:[x.ClassDiagramTypeConventionJava,x.ClassDiagramTypeConventionPascal],action:(p,t)=>{p.drawClassDiagrams(!1)}},{key:"classDiagram.background",settingType:"setting",name:x.ClassDiagramBackground,description:x.ClassDiagramBackgroundDescription,type:"enumeration",optionValues:["transparent","white"],optionTexts:[x.ClassDiagramBackgroundTransparent,x.ClassDiagramBackgroundWhite]},{key:"classDiagram.omitVoidReturnType",settingType:"setting",name:x.classDiagramOmitVoidReturnType,description:x.ClassDiagramOmitVoidReturnTypeDescription,type:"enumeration",optionValues:["show","omit"],optionTexts:[x.show,x.omit],action:(p,t)=>{p.drawClassDiagrams(!1)}}]},{settingType:"group",name:x.ExplorerSettingsName,description:x.ExplorerSettingsDescription,image:rv,settings:[{key:"explorer.fileOrder",settingType:"setting",name:x.ExplorerFileOrderName,description:x.ExplorerFileOrderDescription,type:"enumeration",optionValues:["comparator","user-defined"],optionTexts:[x.ExplorerOrderComparator,x.ExplorerOrderUserDefined],action:(p,t)=>{let e=p.projectExplorer.fileTreeview;e.config.orderBy=t,e.sort()}},{key:"explorer.workspaceOrder",settingType:"setting",name:x.ExplorerWorkspaceOrderName,description:x.ExplorerWorkspaceOrderDescription,type:"enumeration",optionValues:["comparator","user-defined"],optionTexts:[x.ExplorerOrderComparator,x.ExplorerOrderUserDefined],action:(p,t)=>{let e=p.projectExplorer.workspaceTreeview;e.config.orderBy=t,e.sort()}}]},{settingType:"group",name:x.CompilerSettingsName,description:x.CompilerSettingsDescription,settings:[{key:"compiler.shadowedSymbolErrorLevel",settingType:"setting",name:x.CompilerShadowedSymbolErrorLevelName,description:x.CompilerShadowedSymbolErrorLevelDescription,type:"enumeration",optionValues:["ignore","info","warning","error"],optionTexts:[x.ErrorLevelIgnore,x.ErrorLevelInfo,x.ErrorLevelWarning,x.ErrorLevelError],action:(p,t)=>{p.getCompiler().forceRecompililation()},image:ov}]}];class lv{constructor(t){r(this,"userSettings");r(this,"ownClassSettings");r(this,"classSettings");r(this,"schoolSettings");r(this,"currentScope","user");r(this,"currentSettingsGroup",null);r(this,"currentSettings",null);r(this,"currentClassId",null);r(this,"$settingsLeftMenuDiv");r(this,"$settingsMainDiv");r(this,"settingsExplorer");this.main=t,this.userSettings=t.settings.values.user||{},this.ownClassSettings=t.settings.values.class,this.schoolSettings=t.settings.values.school}async open(){await this.getSettingsFromServer();let t=new mo;t.initAndOpen(),this.main.windowStateManager.registerOneTimeBackButtonListener(()=>{t.close()}),t.heading(x.SettingsHeading());let e=y("<div></div>");t.addDiv(e);let i=y('<div class="jo_settingsTabBody"></div>');t.addDiv(i),this.$settingsLeftMenuDiv=y('<div class="jo_settingsLeftMenu"></div>'),i.append(this.$settingsLeftMenuDiv),this.$settingsMainDiv=y('<div class="jo_settingsMain jo_scrollable"></div>'),i.append(this.$settingsMainDiv);let n=new gm(e[0],!0),s=new vn(x.UserSettingsTabHeading(),[]);if(s.onShow=()=>{this.showSettingsData("user")},n.addTab(s),n.setActive(s),this.main.user.is_teacher&&this.classSettings&&this.classSettings.length>0){let a=new vn(x.ClassSettingsTabHeading(),[]);a.onShow=()=>{this.showSettingsData("class")},n.addTab(a);let l=y('<select class="jo_settingsSelect"></select>');a.headingDiv.append(l[0]),no(l,this.classSettings.map(h=>({value:h.classId,object:h,caption:h.className})).sort((h,c)=>h.caption.localeCompare(c.caption))),this.currentClassId=this.classSettings[0].classId,l.on("change",()=>{let h=ro(l);this.currentClassId=h.classId,this.currentScope=="class"&&this.showSettingsData()})}if(this.main.user.is_schooladmin&&this.schoolSettings){let a=new vn(x.SchoolSettingsTabHeading(),[]);a.onShow=()=>{this.showSettingsData("school")},n.addTab(a)}t.buttons([{caption:x.CloseButton(),color:"green",callback:()=>{window.history.back()}}]),this.initSettingsExplorer()}async getSettingsFromServer(){let t=await dt("/servlet/getSettings",{});t.success&&(this.classSettings=t.classSettings,this.schoolSettings=t.schoolSettings)}showSettingsData(t){if(t&&(this.currentScope=t),this.$settingsMainDiv.empty(),!!this.currentSettingsGroup){if(this.currentSettingsGroup.image){let e=y(`<img class="jo_settingImage" src="${this.currentSettingsGroup.image}">`);this.$settingsMainDiv.append(e)}this.$settingsMainDiv.append(y(`<div class="jo_settingsGroupCaption">${this.currentSettingsGroup.name()}</div>`)),this.currentSettingsGroup.description&&this.$settingsMainDiv.append(y(`<div class="jo_settingsGroupDescription">${this.currentSettingsGroup.description()}</div>`));for(let e of this.currentSettingsGroup.settings.filter(i=>i.settingType=="setting")){let i=y('<div class="jo_settingDiv"></div>');this.$settingsMainDiv.append(i),this.renderSetting(e,i)}}}renderSetting(t,e){if(t.image){e.append(y('<div class="jo_settingClearBoth"></div>'));let a=y(`<img class="jo_settingImage" src="${t.image}">`);e.append(a)}e.append(y(`<div class="jo_settingCaption">${t.name()}</div>`)),t.description&&e.append(y(`<div class="jo_settingDescription">${t.description()}</div>`));let i=t.key,n=this.getCurrentSettingValues()[i],s=this.getDefaultSettingValue(i);switch(t.type){case"boolean":let a=[x.OptionTrue(),x.OptionFalse()];t.optionTexts&&(a=t.optionTexts.map(g=>g())),a.push(x.OptionDefault()+": "+(s?a[0]:a[1]));let l=[!0,!1,void 0];this.appendSelectElement(e,a,l,n,async(g,f)=>{await this.storeAndSave(t,t.key,g,f)});break;case"string":this.appendInputElement(e,n,s,async(g,f)=>{await this.storeAndSave(t,t.key,g,f)});break;case"enumeration":let h=t.optionTexts.map(g=>g()),c=t.optionValues.indexOf(s);c==-1&&(c=0),h.push(x.OptionDefault()+": "+h[c]);let u=t.optionValues.slice();u.push(void 0),this.appendSelectElement(e,h,u,n,async(g,f)=>{await this.storeAndSave(t,t.key,g,f)});break}t.image&&e.append(y('<div class="jo_settingClearBoth"></div>'))}async storeAndSave(t,e,i,n){if(this.getCurrentSettingValues()[e]!==i){this.getCurrentSettingValues()[e]=i,t.action&&t.action(this.main,i);let a={userId:this.currentScope=="user"?this.main.user.id:void 0,klasseId:this.currentScope=="class"?this.currentClassId:void 0,schuleId:this.currentScope=="school"?this.main.user.schule_id:void 0,settings:this.getCurrentSettingValues()};n.text(x.Saving()+"..."),n.css("color","var(--loginMessageColor)"),n.show(),await dt("/servlet/updateSettings",a),n.text(`-> ${x.Saved()} ✓`),n.css("color","var(--loginButtonBackground)")}}wrapWithSavingMessageAndAppendToParent(t,e){let i=y("<div class='jo_settingsWrapper'></div>");i.append(t);let n=y("<div class='jo_settingsSavingMessage'></div>");return i.append(n),n.hide(),e.append(i),t.on("click",()=>{n.text("")}),n}appendInputElement(t,e,i,n){let s=y(`<input type='text' placeholder='default: ${i}' class='jo_settingsInput'>`);typeof e<"u"&&s.val(e);let a=this.wrapWithSavingMessageAndAppendToParent(s,t);s.on("focusout",async()=>{let l=s.val();l==""&&(l=void 0),await n(l,a)}),s.on("change",()=>{a.hide()})}appendSelectElement(t,e,i,n,s){let a=y('<select class="jo_settingsSelect"></select>'),l=this.wrapWithSavingMessageAndAppendToParent(a,t),h=[];for(let u=0;u<i.length;u++)h.push({value:""+i[u],caption:e[u],object:i[u]});no(a,h);let c=h.findIndex(u=>u.object===n);a[0].selectedIndex=c,a.on("change",async()=>{await s(ro(a),l)})}getDefaultSettingValue(t){let e;return this.currentScope=="user"&&this.ownClassSettings&&(e=this.ownClassSettings[t]),typeof e>"u"&&(e=this.schoolSettings[t]),typeof e>"u"&&(e=this.main.settings.values.default[t]),e}getCurrentSettingValues(){var t;switch(this.currentScope){case"user":return this.userSettings;case"class":return this.main.user.is_schooladmin||this.main.user.is_admin||this.main.user.is_teacher?((t=this.classSettings.find(e=>e.classId==this.currentClassId))==null?void 0:t.settings)||{}:this.ownClassSettings;case"school":return this.schoolSettings}return{}}initSettingsExplorer(){this.settingsExplorer=new di(this.$settingsLeftMenuDiv[0],{withSelection:!0,selectMultiple:!1,captionLine:{enabled:!1},buttonAddElements:!1,buttonAddFolders:!1,withFolders:!0,withDeleteButtons:!1,isDragAndDropSource:!1,orderBy:"comparator"});for(let t of hg.filter(e=>e.settingType==="group"))this.addSettingsToExplorer(t);this.settingsExplorer.nodeClickedCallback=t=>{this.currentSettingsGroup=t,this.showSettingsData()}}addSettingsToExplorer(t,e=null){this.settingsExplorer.addNode(t.settings.find(i=>i.settingType==="group")!=null,t.name(),void 0,t,e),t.settings.filter(i=>i.settingType==="group").forEach(i=>{this.addSettingsToExplorer(i,t)})}}class Je{}r(Je,"importRepository",()=>d({de:"Repository importieren",en:"Import repository"})),r(Je,"importRepositoryDescription",()=>d({de:"1. Wählen Sie eine Datei aus, die das exportierte Repository enthält, das Sie importieren möchten, oder ziehen Sie sie in das gestrichelte Rechteck.",en:"1. Select a file that contains the exported repository you want to import or drag them into the dashed rectangle."})),r(Je,"renameDescription",()=>d({de:"2. Optional: Geben Sie einen neuen Namen für das Repository ein. Wenn Sie keinen Namen angeben, wird der Name aus der Exportdatei verwendet.",en:"2. Optional: Enter a new name for the repository. If you do not provide a name, the name from the export file will be used."})),r(Je,"filesSelected",()=>d({de:"Dateien ausgewählt",en:"files selected"})),r(Je,"newName",()=>d({de:"Neuer Name",en:"New name"})),r(Je,"import",()=>d({de:"Importieren",en:"Import"})),r(Je,"cancel",()=>d({de:"Abbrechen",en:"Cancel"})),r(Je,"noFilesSelected",()=>d({de:"Es wurden keine Dateien ausgewählt. Bitte wählen Sie eine Datei aus.",en:"No files selected. Please select a file."})),r(Je,"wrongFileFormat",t=>d({de:`Die Datei "${t}" ist keine gültige Exportdatei für ein Repository. Bitte wählen Sie eine gültige Datei aus.`,en:`The file "${t}" is not a valid export file for a repository. Please select a valid file.`})),r(Je,"importSuccessfully",t=>d({de:`Das Repository aus der Datei "${t}" wurde erfolgreich importiert.`,en:`The repository from the file "${t}" has been successfully imported.`})),r(Je,"exportTipp",()=>d({de:'<strong>Tipp:</strong> Sie können ein Repository als Datei exportieren, indem Sie in der Workspace-Liste auf einen Workspace rechtsklicken, der mit dem Repository verbunden ist, und dann "Repository als Datei Exportieren" auswählen.',en:'<strong>Hint:</strong> To export a repository as a file right-click on a workspace in the workspace list that is connected to the repository and select "Export repository as file".'}));class dv{static async exportRepository(t,e){let n=await dt("/servlet/getRepository",{repository_id:t,workspace_id:e});if(!n.success)return;let s=n.repository,a;if(s.spritesheet_id)try{let l=new As;await l.load(s.spritesheet_id),l.zipFile!=null&&(a=dg(l.zipFile))}catch{console.log("Fehler beim Laden des Spritesheets.")}return{name:s.name,files:s.files,history:s.history,description:s.description,spritesheetBase64:a}}}class hv{constructor(t){this.main=t}async importRepository(t){if(t.spritesheetBase64){let e=fm(t.spritesheetBase64);try{let i=await Cl.uploadSpritesheet(e,null,!1);t.spritesheet_id=i,t.spritesheetBase64=void 0}catch{}}await dt("/servlet/importRepository",t)}}const cv=""+new URL("assets/lightbulb-CnOCH59Y.png",import.meta.url).href;class uv{constructor(t){r(this,"dialog");r(this,"files");r(this,"$newNameInput");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(Je.importRepository()),this.dialog.description(Je.importRepositoryDescription());let t=y('<input type="file" id="file" name="file" multiple />');this.dialog.addDiv(t),t.on("change",n=>{this.files=n.originalEvent.target.files});let e=y(`<div class="jo_workspaceimport_dropzone"><div>${ot.dragFilesHere()}</div></div>`);this.dialog.addDiv(e);let i=y('<div class="jo_workspaceimport_dropzone_inner"></div>');e.append(i),this.dialog.description("").text(Je.renameDescription()),this.$newNameInput=this.dialog.input("text",Je.newName()),e.on("dragover",n=>{n.stopPropagation(),n.preventDefault(),n.originalEvent.dataTransfer.dropEffect="copy"}),e.on("drop",n=>{n.stopPropagation(),n.preventDefault(),this.files=n.originalEvent.dataTransfer.files,i.text(this.files.length+" "+Je.filesSelected())}),this.dialog.buttons([{caption:Je.import(),color:"#18a000ff",callback:()=>{this.importFiles()}},{caption:Je.cancel(),color:"#caaf17ff",callback:()=>{this.dialog.close()}}]),this.dialog.addDiv(y('<div style="height:20px"></div>')),this.dialog.addDiv(y("")),this.dialog.description(`<img src="${cv}" style="width:32px; margin-right: 5px;">`+Je.exportTipp())}async importFiles(){if(!this.files||this.files.length===0){alert(Je.noFilesSelected());return}let t=this.files[0];var e=new FileReader;e.onload=async i=>{var h,c;let n=i.target.result;if(!n.startsWith("{")){alert(Je.wrongFileFormat(t.name));return}let s;try{s=JSON.parse(n)}catch{alert(Je.wrongFileFormat(t.name));return}let a=(c=(h=this.$newNameInput.val())==null?void 0:h.toString())==null?void 0:c.trim();a&&a.length>0&&(s.name=a);var l=new hv(this.main);await l.importRepository(s),alert(Je.importSuccessfully(t.name)),this.dialog.close()},e.readAsText(t)}}class mv{constructor(t){r(this,"currentSubmenu",{});r(this,"openSubmenusOnMousemove",!1);this.main=t}initGUI(t,e){let i=this,n=this.main.getMainEditor(),s={items:[{identifier:T.File(),subMenu:{items:[{identifier:T.ImportWorkspace(),action:()=>{new Zy(this.main).show()}},{identifier:T.ExportCurrentWorkspace(),action:async()=>{var u;let a=this.main.currentWorkspace;a==null&&alert(T.NoWorkspaceSelected());let l=a.name.replace(/\//g,"_"),h=(u=this.main.pruefungManagerForStudents)==null?void 0:u.pruefung,c=this.main.user;h!=null&&(l=h.name.replace(/\//g,"_")+" ("+c.familienname+" "+c.rufname+"; "+c.username+")"),Mr(await Br.exportWorkspace(a),l+".json")}},{identifier:T.ExportAllWorkspaces(),action:async()=>{let a="all_workspaces";this.main.user;let l=await Br.exportAllWorkspaces(this.main);Mr(l,a+".json")}}]}},{identifier:T.Edit(),subMenu:{items:[{identifier:T.Undo(),action:()=>{n.trigger(".","undo",{})}},{identifier:T.Redo(),action:()=>{n.trigger(".","redo",{})}},{identifier:"-"},{identifier:T.Copy(),action:()=>{n.getAction("editor.action.clipboardCopyAction").run()}},{identifier:T.Cut(),action:()=>{n.getAction("editor.action.clipboardCutAction").run()}},{identifier:T.CopyToTop(),action:()=>{n.getAction("editor.action.copyLinesUpAction").run()}},{identifier:T.CopyToBottom(),action:()=>{n.getAction("editor.action.copyLinesDownAction").run()}},{identifier:T.MoveToTop(),action:()=>{n.getAction("editor.action.moveLinesUpAction").run()}},{identifier:T.MoveToBottom(),action:()=>{n.getAction("editor.action.moveLinesDownAction").run()}},{identifier:"-"},{identifier:T.Find(),action:()=>{n.getAction("actions.find").run()}},{identifier:T.Replace(),action:()=>{n.getAction("editor.action.startFindReplaceAction").run()}},{identifier:"-"},{identifier:T.ToggleComment(),action:()=>{n.getAction("editor.action.commentLine").run()}},{identifier:T.AutoFormat(),action:()=>{n.getAction("editor.action.formatDocument").run()}},{identifier:"-"},{identifier:T.FindCorrespondingBracket(),action:()=>{n.getAction("editor.action.jumpToBracket").run()}},{identifier:"-"},{identifier:T.FoldAll(),action:()=>{n.getAction("editor.foldAll").run()}},{identifier:T.UnfoldAll(),action:()=>{n.getAction("editor.unfoldAll").run()}},{identifier:"-"},{identifier:T.TriggerSuggest(),action:()=>{n.focus(),setTimeout(()=>{n.getAction("editor.action.triggerSuggest").run()},200)}},{identifier:T.TriggerParameterHint(),action:()=>{n.getAction("editor.action.triggerParameterHints").run()}},{identifier:T.GoToDefinition(),action:()=>{n.focus(),setTimeout(()=>{n.getAction("editor.action.revealDefinition").run()},200)}}]}},{identifier:T.View(),subMenu:{items:[{identifier:T.Theme(),subMenu:{items:[{identifier:T.Dark(),action:()=>{i.switchTheme("dark")}},{identifier:T.Light(),action:()=>{i.switchTheme("light")}}]}},{identifier:"-"},{identifier:T.HighContrastOnOff(),action:()=>{n.getAction("editor.action.toggleHighContrast").run()}},{identifier:"-"},{identifier:T.LinebreakOnOff(),action:()=>{let a=this.main.editor.editor.getOption(H.EditorOption.wordWrap);a=a=="on"?"off":"on",this.main.editor.editor.updateOptions({wordWrap:a})}}]}},{identifier:T.Repository(),subMenu:{items:[{identifier:T.ConfigureOwnRepositories(),action:()=>{this.main.repositoryUpdateManager.show(null)}},{identifier:T.Checkout(),action:()=>{this.main.repositoryCheckoutManager.show(null)}},{identifier:T.importRepository(),action:()=>{new uv(this.main).show()}}]}},{identifier:T.Sprites(),subMenu:{items:[{identifier:T.AddOwnSprites(),action:()=>{this.main.spriteManager.show()}},{identifier:"-"},{identifier:T.SpriteCatalogue(),link:e+"spriteLibrary.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")}]}},{identifier:T.Help(),subMenu:{items:[{identifier:T.VideoTutorials(),link:"https://www.learnj.de/doku.php?id=api:ide_manual:start"},{identifier:T.JavaTutorial(),link:"https://www.learnj.de/doku.php"},{identifier:"-"},{identifier:T.APIDoc(),link:"https://www.learnj.de/doku.php?id=api:documentation:start"},{identifier:T.APIReference(),link:e+"api_documentation.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")},{identifier:"-"},{identifier:T.Shortcuts(),link:e+"shortcuts.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")},{identifier:"-"},{identifier:T.Changelog(),link:"https://www.learnj.de/doku.php?id=javaonline:changelog"},{identifier:T.Roadmap(),link:"https://www.learnj.de/doku.php?id=javaonline:roadmap"},{identifier:"-"},{identifier:T.EditorCommandPalette(),action:()=>{setTimeout(()=>{i.main.getMainEditor().focus(),n.getAction("editor.action.quickCommand").run()},500)}},{identifier:"-"},{identifier:T.ChangePassword(),action:()=>{new lg(i.main).show()}},{identifier:"-"},{identifier:T.BugReport(),action:()=>{new Xy(this.main).show()}},{identifier:"-"},{identifier:T.About(),link:"https://www.learnj.de/doku.php?id=javaonline:ueber"},{identifier:T.Imprint(),link:"https://www.learnj.de/doku.php?id=ide:impressum"},{identifier:T.PrivacyPolicy(),link:"https://www.learnj.de/doku.php?id=ide:datenschutzerklaerung"},{identifier:"<div class='jo_menu_version'>"+T.Version()+" 2.2.1 (13.2.2026, 16:51 Uhr)</div>",noHoverAnimation:!0}]}}]};t!=null&&(t.is_admin||t.is_schooladmin||t.is_teacher)&&s.items[0].subMenu.items.push({identifier:T.ClassesUserTests(),link:e+"administration_mc.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")}),t!=null&&t.is_admin&&s.items[0].subMenu.items.push({identifier:T.ServerStatistics(),link:e+"statistics.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")},{identifier:T.ShutdownServer(),action:()=>{confirm(T.ReallyShutdownServer())&&Re("shutdown",{},()=>{alert(T.ServerShutdownDone())},a=>{alert(a)})}}),s.items[0].subMenu.items.push({identifier:T.Settings(),action:()=>{new lv(i.main).open()}},{identifier:T.SaveAndExit(),action:()=>{y("#buttonLogout").trigger("click")}}),y("#mainmenu").empty(),this.initMenu(s,0)}switchTheme(t){this.main.viewModeController.setTheme(t)}initMenu(t,e){t.level=e,e==0?t.$element=y("#mainmenu"):(t.$element=y('<div class="jo_submenu"></div>'),y("body").append(t.$element)),t.$element.data("model",t);for(let n of t.items){if(n.identifier=="-")n.$element=y('<div class="jo_menuitemdivider"></div>');else{let s=n.noHoverAnimation?' class="jo_menuitem_nohover"':"";if(n.$element=y(`<div${s}>${n.identifier}</div>`),n.link!=null){let a=y('<a href="'+n.link+'" target="_blank" class="jo_menulink"></a>');a.attr("style","color: var(--fontColorNormal) !important"),a.on("pointerdown",l=>{l.stopPropagation()}),a.on("pointerup",l=>{l.stopPropagation(),setTimeout(()=>{t.$element.hide()},500)}),a.append(n.$element),n.$element=a}n.subMenu!=null&&this.initMenu(n.subMenu,e+1),this.initMenuitemCallbacks(t,n),e==0&&n.$element.addClass("jo_mainmenuitem")}t.$element.append(n.$element),n.$element.data("model",n)}let i=this;y(document).on("pointerdown",()=>{for(let n=0;n<5;n++)i.currentSubmenu[n]!=null&&(i.currentSubmenu[n].hide(),i.currentSubmenu[n]=null);i.openSubmenusOnMousemove=!1})}initMenuitemCallbacks(t,e){let i=this;e.action!=null&&(e.$element.on("pointerdown",n=>{n.stopPropagation()}),e.$element.on("pointerup",n=>{n.stopPropagation(),e.action(e.identifier);for(let s=0;s<5;s++)i.currentSubmenu[s]!=null&&(i.currentSubmenu[s].hide(),i.currentSubmenu[s]=null);i.openSubmenusOnMousemove=!1})),e.subMenu!=null?(e.$element.on("pointerdown",n=>{i.opensubmenu(e),i.openSubmenusOnMousemove=!0,n.stopPropagation()}),e.$element.on("mousemove.mainmenu",()=>{i.openSubmenusOnMousemove?i.opensubmenu(e):i.currentSubmenu[t.level+1]!=null&&(i.currentSubmenu[t.level+1].hide(),i.currentSubmenu[t.level+1]=null)})):e.$element.on("mousemove.mainmenu",()=>{i.currentSubmenu[t.level+1]!=null&&(i.currentSubmenu[t.level+1].hide(),i.currentSubmenu[t.level+1]=null)})}opensubmenu(t){let e=t.subMenu,i,n;e.level==1?(i=t.$element.position().left,n=30):(i=t.$element.offset().left+t.$element.width(),n=t.$element.offset().top),e.$element.css({top:""+n+"px",left:""+i+"px"}),this.currentSubmenu[e.level]!=null&&this.currentSubmenu[e.level].hide(),e.$element.show(),this.currentSubmenu[e.level]=e.$element}}class cg{constructor(t,e){r(this,"color","");r(this,"lastSpan","");r(this,"$lastSpan");r(this,"$lastDiv");r(this,"$outputDiv");r(this,"maxLines",2e3);r(this,"$lines",[]);r(this,"newLines",0);r(this,"printCommands",[]);r(this,"currentLinelength",0);r(this,"beginOfLineState",!0);this.$runDiv=t,this.main=e,y(()=>{this.$outputDiv=t.find(".jo_output"),this.clear();let i=this,n=0,s=!1,a=performance.now();setInterval(()=>{i.printCommands.length>0&&(i.flush(),performance.now()-a>200?i.$outputDiv[0].scrollTop=i.$outputDiv[0].scrollHeight:s=!0,a=performance.now()),n++%20==0&&s&&setTimeout(()=>{i.$outputDiv[0].scrollTop=i.$outputDiv[0].scrollHeight,s=!1},200)},50)})}isTestPrintManager(){return!1}showProgramEnd(){let t=this.$runDiv.find(".jo_run-programend");t.show(),t.addClass("jo_programendkf"),setTimeout(()=>{t.removeClass("jo_programendkf"),t.hide()},3e3)}flush(){if(this.newLines>=this.maxLines){this.$outputDiv.empty();let t=this.printCommands.length-1,e=0;for(;t>=0;){if(this.printCommands[t].newLine&&(e++,e>=this.maxLines)){this.printCommands.splice(0,t+1);break}t--}}this.newLines=0,this.$lastSpan!=null&&(this.$lastSpan.remove(),this.lastSpan.endsWith("</span>")&&(this.lastSpan=this.lastSpan.substring(0,this.lastSpan.length-7)));for(let t of this.printCommands)if(this.beginOfLineState&&t.text.startsWith(" ")?t.text.match(/^( *)(.*)$/)[2].length>0&&(this.beginOfLineState=!1):t.text.length>0&&(this.beginOfLineState=!1),t.text=t.text.replace(/</g,"&lt;").replace(/>/g,"&gt;"),t.color==null&&(t.color="var(--defaultOutputColor)"),(this.lastSpan==""||this.color!=t.color)&&(this.lastSpan!=""&&(this.lastSpan+="</span>"),this.lastSpan+='<span style="color: '+t.color+'">',t.newLine&&t.text==""&&(this.lastSpan+="​"),this.color=t.color),this.currentLinelength<=1e4&&(this.lastSpan+=t.text,this.currentLinelength+=t.text.length),t.newLine){this.beginOfLineState=!0,this.lastSpan.endsWith("</span>")||(this.lastSpan+="</span>"),this.$lastSpan=y(this.lastSpan),this.$lastDiv.append(this.$lastSpan),this.lastSpan="",this.$lastSpan=null,this.$lastDiv=y("<div></div>");let e=this.main.getInterpreter().inputManager.$input;e!=null?this.$lastDiv.insertBefore(e):this.$outputDiv.append(this.$lastDiv),this.$lines.push(this.$lastDiv),this.currentLinelength=0}if(this.lastSpan!=""&&(this.lastSpan.endsWith("</span>")||(this.lastSpan+="</span>"),this.$lastSpan=y(this.lastSpan),this.$lastDiv.append(this.$lastSpan)),this.$lines.length>this.maxLines*1.5){let t=this,e=t.$lines.length-t.maxLines,i=t.$lines.splice(0,e);for(let n of i)n.remove()}this.printCommands=[]}clear(){this.$outputDiv.empty(),this.$lastDiv=y("<div></div>"),this.$lines.push(this.$lastDiv),this.$outputDiv.append(this.$lastDiv),this.currentLinelength=0,this.color="",this.lastSpan="",this.printCommands=[]}print(t,e,i){if(t==null&&(t=""),e&&(t+=`
480
+ `+t,!0,void 0),s.flush()),this.$input=y('<input class="jo_newInput" type="text"/>'),s.$outputDiv.append(this.$input);let l=e??"";this.$input.val(l),e&&(this.$input[0].selectionStart=0,this.$input[0].selectionEnd=(""+e).length);let h=this;this.$input.on("keydown",c=>{if(c.key=="Enter"){let u=this.$input.val()||"",g=i(u);if(g.errorMessage){this.$input.detach(),s.print(g.errorMessage,!0,16711680),s.flush(),s.$outputDiv.append(this.$input);let f=this.$input[0];f.scrollIntoView(),f.focus(),f.selectionStart=0,f.selectionEnd=(f.value||"").length}else s.$outputDiv.off("mousedown.inputmanager"),s.print(u,!0,16777215),this.$input.off("keydown"),this.hide(),n(g.convertedValue)}}),setTimeout(()=>{h.$input.focus()},200),s.$outputDiv.on("mousedown.inputmanager",c=>{setTimeout(()=>{var u;(u=h.$input)==null||u.focus()},200)})}hide(){this.$input!=null&&(this.$input.remove(),this.$input=null)}}const og="data:image/svg+xml,%3c!--%20By%20Sam%20Herbert%20(@sherb),%20for%20everyone.%20More%20@%20http://goo.gl/7AJzbL%20--%3e%3c!--%20Todo:%20add%20easing%20--%3e%3csvg%20width='57'%20height='57'%20viewBox='0%200%2057%2057'%20xmlns='http://www.w3.org/2000/svg'%20stroke='%23317c0e'%3e%3cg%20fill='none'%20fill-rule='evenodd'%3e%3cg%20transform='translate(1%201)'%20stroke-width='2'%3e%3ccircle%20cx='5'%20cy='50'%20r='5'%3e%3canimate%20attributeName='cy'%20begin='0s'%20dur='2.2s'%20values='50;5;50;50'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3canimate%20attributeName='cx'%20begin='0s'%20dur='2.2s'%20values='5;27;49;5'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3c/circle%3e%3ccircle%20cx='27'%20cy='5'%20r='5'%3e%3canimate%20attributeName='cy'%20begin='0s'%20dur='2.2s'%20from='5'%20to='5'%20values='5;50;50;5'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3canimate%20attributeName='cx'%20begin='0s'%20dur='2.2s'%20from='27'%20to='27'%20values='27;49;5;27'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3c/circle%3e%3ccircle%20cx='49'%20cy='50'%20r='5'%3e%3canimate%20attributeName='cy'%20begin='0s'%20dur='2.2s'%20values='50;50;5;50'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3canimate%20attributeName='cx'%20from='49'%20to='49'%20begin='0s'%20dur='2.2s'%20values='49;5;27;49'%20calcMode='linear'%20repeatCount='indefinite'%20/%3e%3c/circle%3e%3c/g%3e%3c/g%3e%3c/svg%3e";class mo{constructor(){r(this,"$dialog");r(this,"$dialogMain");r(this,"$dialogFooter")}initAndOpen(){this.$dialog=y("#dialog"),this.$dialog.empty(),y("#main").css("visibility","hidden"),this.$dialog.append(y('<div style="height: 20px"></div><div class="dialog-main"></div><div class="dialog-footer"></div>')),this.$dialogMain=this.$dialog.find(".dialog-main"),this.$dialogFooter=this.$dialog.find(".dialog-footer"),this.$dialog.css("visibility","visible"),this.$dialogMain.empty(),this.$dialogFooter.empty()}heading(t){let e=y('<div class="dialog-heading">'+t+"</div>");return this.$dialogMain.append(e),e}addDiv(t){this.$dialogMain.append(t)}subHeading(t){let e=y('<div class="dialog-subheading">'+t+"</div>");return this.$dialogMain.append(e),e}description(t,e){let i=e==null?"":`style="color: ${e}"`,n=y(`<div class="dialog-description" ${i}>${t}</div>`);return this.$dialogMain.append(n),n}input(t,e){let i=y(`<input class="dialog-input" type="${t}" placeholder="${e}"></input>`);return this.$dialogMain.append(i),i}buttons(t){let e=y('<div class="dialog-buttonRow"></div>');this.$dialogMain.append(e);for(let i of t){let n=y(`<button style="background-color: ${i.color};margin-left: 20px">${i.caption}</button>`);n.on("click",()=>{i.callback()}),e.append(n)}}waitMessage(t){let e=y(`<div class="dialog-wait">${t}<img src="${og}"></div>`);return this.$dialogMain.append(e),i=>{let n=i?"visible":"hidden";e.css("visibility",n)}}close(){this.$dialog.css("visibility","hidden"),this.$dialog.empty(),y("#main").css("visibility","visible")}addCheckbox(t,e,i){let n='<input type="checkbox" name="'+i+'"'+(e?" checked":"")+">",s=y(n),a=y('<label for="'+i+'">'+t+"</label>"),l=y('<div class="jo_checkbox_div"></div>');return l.append(s,a),a.on("click",()=>{s.prop("checked",!s.prop("checked"))}),this.$dialogMain.append(l),()=>s.is(":checked")}}class Uy{constructor(t){this.main=t}init(){let t=y("#buttonUserSettings"),e=this;t.on("click",i=>{let n=[{caption:pt.changePassword()+"...",callback:()=>{new lg(e.main).show()}}];Vn(n,t.offset().left,t.offset().top+t.height())})}}class lg{constructor(t){r(this,"dialog");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(pt.changePassword()),this.dialog.description(pt.changePasswordDescription());let t=this.dialog.input("password",pt.oldPassword()),e=this.dialog.input("password",pt.newPassword()),i=this.dialog.input("password",pt.repeatNewPassword()),n=this.dialog.description("","red"),s=this.dialog.waitMessage(pt.pleaseWait());this.dialog.buttons([{caption:pt.cancel(),color:"#a00000",callback:()=>{this.dialog.close()}},{caption:pt.ok(),color:"green",callback:()=>{e.val()!=i.val()?n.text(pt.passwordsDontMatch()):(s(!0),Re("changePassword",{oldPassword:t.val(),newPassword:e.val()},()=>{s(!1),alert(pt.settingPasswordSuccessful()),this.dialog.close()},a=>{s(!1),n.text(a)}))}}])}}const ar=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"],Gm=[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,62,255,255,255,63,52,53,54,55,56,57,58,59,60,61,255,255,255,0,255,255,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,255,255,255,255,255,255,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];function Pl(p){if(p>=Gm.length)throw new Error("Unable to parse base64 string.");const t=Gm[p];if(t===255)throw new Error("Unable to parse base64 string.");return t}function dg(p){let t="",e,i=p.length;for(e=2;e<i;e+=3)t+=ar[p[e-2]>>2],t+=ar[(p[e-2]&3)<<4|p[e-1]>>4],t+=ar[(p[e-1]&15)<<2|p[e]>>6],t+=ar[p[e]&63];return e===i+1&&(t+=ar[p[e-2]>>2],t+=ar[(p[e-2]&3)<<4],t+="=="),e===i&&(t+=ar[p[e-2]>>2],t+=ar[(p[e-2]&3)<<4|p[e-1]>>4],t+=ar[(p[e-1]&15)<<2],t+="="),t}function fm(p){if(p.length%4!==0)throw new Error("Unable to parse base64 string.");const t=p.indexOf("=");if(t!==-1&&t<p.length-2)throw new Error("Unable to parse base64 string.");let e=p.endsWith("==")?2:p.endsWith("=")?1:0,i=p.length,n=new Uint8Array(3*(i/4)),s;for(let a=0,l=0;a<i;a+=4,l+=3)s=Pl(p.charCodeAt(a))<<18|Pl(p.charCodeAt(a+1))<<12|Pl(p.charCodeAt(a+2))<<6|Pl(p.charCodeAt(a+3)),n[l]=s>>16,n[l+1]=s>>8&255,n[l+2]=s&255;return n.subarray(0,n.length-e)}class ot{}r(ot,"confirmInput",t=>d({de:`Wollen Sie die ${t} ausgewählten Workspaces wirklich importieren?`,en:`Do you really want to import the ${t} selected workspaces?`,fr:`Voulez-vous vraiment importer les ${t} workspaces sélectionnés?`})),r(ot,"importWorkspace",()=>d({de:"Workspace importieren",en:"Import workspace"})),r(ot,"importWorkspaceDescription",()=>d({de:"1. Bitte klicken Sie auf den Button 'Datei auswählen...' oder ziehen Sie eine Datei auf das gestrichelt umrahmte Feld.",en:"1. Use button 'Choose file...' or drop file on dotted rectangle."})),r(ot,"wrongFileFormat",t=>d({de:"Das Format der Datei "+t+" passt nicht.",en:"File "+t+" has wrong file format."})),r(ot,"noJson",t=>d({de:"Die Datei "+t+" ist keine gültige JSON-Datei.",en:"File "+t+" doesn't contain JSON code."})),r(ot,"withFiles",t=>d({de:"mit "+t+" Dateien",en:"with "+t+" files"})),r(ot,"dragFilesHere",()=>d({de:"Dateien hierhin ziehen",en:"Drag files here."})),r(ot,"dragDropTutorial",()=>d({de:"2. In der linken Baumansicht sehen Sie die Workspaces der importierten Datei. Sie können mehrere Workspaces/Ordner durch <Strg> + Click bzw. <Shift> + Click markieren. Ziehen Sie die gewünschten Workspaces in die rechte Baumansicht, um sie zu importieren.",en:"2. The left tree view shows the workspaces of the imported file. You can select multiple workspaces/folders using <Ctrl> + Click or <Shift> + Click. Drag and drop the desired folders/workspaces to the right tree view to import them.",fr:"2. La vue arborescente de gauche affiche les workspaces du fichier importé. Vous pouvez sélectionner plusieurs workspaces/dossiers en utilisant <Ctrl> + Clic ou <Shift> + Clic. Faites glisser et déposez les dossiers/workspaces souhaités dans la vue arborescente de droite pour les importer."})),r(ot,"cancel",()=>d({de:"Abbrechen",en:"Cancel"})),r(ot,"ok",()=>d({de:"OK",en:"OK"})),r(ot,"import",()=>d({de:"Importieren",en:"Import"})),r(ot,"serverNotReachable",()=>d({de:"Der Server ist nicht erreichbar.",en:"Server not reachable."}));class Br{static async exportAllWorkspaces(t){let e=[];for(let i of t.projectExplorer.workspaceTreeview.rootNode.getOrderedNodeListRecursively().map(n=>n.externalObject)){let n=await Br.exportWorkspace(i);e.push(n)}return e}static async exportFolder(t,e){let i=e.findNodeByElement(t);if(!i)return[];let n=i.getOrderedNodeListRecursively().map(a=>a.externalObject);n.unshift(t);let s=[];for(let a of n){let l=await Br.exportWorkspace(a);a==t&&(l.parent_folder_id=null),s.push(l)}return s}static async exportWorkspace(t){let e;if(t.spritesheetId)try{let i=new As;await i.load(t.spritesheetId),i.zipFile!=null&&(e=dg(i.zipFile))}catch{console.log("Hier!")}return{name:t.name,id:t.id,modules:t.getFiles().map(i=>Br.exportFile(i)),settings:t.settings,spritesheetBase64:e,parent_folder_id:t.parent_folder_id,isFolder:t.isFolder}}static exportFile(t){return{name:t.name,text:t.getText(),identical_to_repository_version:t.identical_to_repository_version,is_copy_of_id:t.is_copy_of_id,repository_file_version:t.repository_file_version,isFolder:t.isFolder,parent_folder_id:t.parent_folder_id}}}class Qy{constructor(t,e){r(this,"networkManager",null);this.main=t,this.owner_id=e,this.networkManager=t.networkManager}async importWorkspaces(t,e,i){for(;!e.isFolder&&!e.isRootNode;)e=e.getParent();if(!confirm(ot.confirmInput(t.length)))return;let n=new Set(t.filter(g=>g.isFolder).map(g=>g.id));t.forEach(g=>{n.has(g.parent_folder_id)||(g.parent_folder_id=null)});let s=[],a=-1,l=new Set;for(;s.length>a;){a=s.length;for(let g of t)!l.has(g.id)&&(g.parent_folder_id==null||l.has(g.parent_folder_id))&&(s.push(g),l.add(g.id))}i&&(i.init(0,s.length),i.show());let h=0,c=new Map,u=[];for(let g of s){i&&i.set(h++);let f=g.parent_folder_id==null?e:c.get(g.parent_folder_id),b=f.isRootNode()?null:f.externalObject.id,A=await this.importWorkspaceWithoutSpritesheet(g,b);if(await this.importSpritesheet(g,A),A){let k=A.repository_id==null?"img_workspace-dark":"img_workspace-dark-repository",C=f.treeview.addNode(A.isFolder,A.name,k,A);u.push(C),A.isFolder&&c.set(g.id,C)}}i&&i.hide(),u.forEach(g=>g.setCaptionColor("#00b000"))}async importSpritesheet(t,e){if(this.networkManager&&!t.isFolder&&t.spritesheetBase64&&e!=null){let i=fm(t.spritesheetBase64);try{let n=await Cl.uploadSpritesheet(i,e.id,!1);e.spritesheetId=n}catch{}}}async importWorkspaceWithoutSpritesheet(t,e=null){let i=new yi(t.name,this.main,this.owner_id);i.isFolder=t.isFolder||!1,i.settings=t.settings,i.parent_folder_id=e;let n=!0;if(this.networkManager&&(n=await this.networkManager.sendCreateWorkspace(i,this.owner_id)),n){this.main.addWorkspace(i);for(let s of t.modules){let a=await this.importFile(s,i);a&&i.addFile(a)}return i}return null}async importFile(t,e){let i=new Ue(this.main,t.name);return i.setText(t.text),i.identical_to_repository_version=t.identical_to_repository_version,i.is_copy_of_id=t.is_copy_of_id,i.repository_file_version=t.repository_file_version,i.isFolder=t.isFolder||!1,i.parent_folder_id=t.parent_folder_id||null,this.networkManager&&(this.networkManager.sendCreateFile(i,e,this.owner_id)||(i=null)),i}}class Yy{constructor(){r(this,"elementOuter");r(this,"elementInner");r(this,"parent");r(this,"min");r(this,"max");this.parent=document.getElementById("bitteWarten"),this.elementOuter=R.makeDiv(this.parent,"jo_progressBar"),this.elementInner=R.makeDiv(this.elementOuter,"jo_progressBarInner")}show(){this.parent.style.display="flex"}hide(){this.parent.style.display="none"}init(t,e){this.min=t,this.max=e}set(t,e){let i=(t-this.min)/(this.max-this.min)*100;this.elementInner.style.width=i+"%"}}class Zy{constructor(t){r(this,"dialog");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(ot.importWorkspace()),this.dialog.description(ot.importWorkspaceDescription());let t=y('<input type="file" id="file" name="file" multiple />');this.dialog.addDiv(t);let e=y('<div class="jo_importDragDropDiv" style="flex-basis: 20px; flex-grow: 1; overflow: auto"></div>'),i=R.makeDiv(e[0],"jo_importLeft","jo_scrollable"),n=R.makeDiv(e[0],"jo_importRight","jo_scrollable"),s=new di(i,{captionLine:{enabled:!0,text:"Inhalt der importierten Datei:"},withSelection:!0,selectMultiple:!0,selectWholeFolders:!0,isDragAndDropSource:!0,buttonAddElements:!1,buttonAddFolders:!1,withDeleteButtons:!1,withFolders:!0,keyExtractor:h=>h.id,parentKeyExtractor:h=>h.parent_folder_id,orderBy:"comparator"}),a=new di(n,{captionLine:{enabled:!0,text:"Ihre Workspaces:"},withSelection:!1,selectMultiple:!1,isDragAndDropSource:!1,buttonAddElements:!1,buttonAddFolders:!1,withDeleteButtons:!1,withFolders:!0,comparator:(h,c)=>h.name>c.name?1:h.name<c.name?-1:0,keyExtractor:h=>h.id,parentKeyExtractor:h=>h.parent_folder_id,orderBy:"comparator"});a.addDragDropSource({treeview:s,defaultDragKind:"copy",dropInsertKind:"asElement"}),a.dropEventCallback=(h,c)=>{this.dropEventCallback(s,a,c)},t.on("change",h=>{var c=h.originalEvent.target.files;this.fillSourceTreeview(c,s)});let l=y(`<div class="jo_workspaceimport_dropzone">${ot.dragFilesHere()}</div>`);this.dialog.addDiv(l),this.dialog.description("").text(ot.dragDropTutorial()),l.on("dragover",h=>{h.stopPropagation(),h.preventDefault(),h.originalEvent.dataTransfer.dropEffect="copy"}),l.on("drop",h=>{h.stopPropagation(),h.preventDefault();var c=h.originalEvent.dataTransfer.files;this.fillSourceTreeview(c,s)}),this.dialog.addDiv(e),this.fillDestTreeview(a),this.dialog.buttons([{caption:ot.ok(),color:"#18a000ff",callback:()=>{this.main.workspaceList=a.getOrderedNodeListRecursively().map(h=>h.externalObject),this.main.projectExplorer.renderWorkspaces(this.main.workspaceList),this.dialog.close()}}])}async dropEventCallback(t,e,i){let n=t.getOrderedListOfCurrentlySelectedNodes().map(l=>l.externalObject),s=this.main.user.id;this.main.workspacesOwnerId!=null&&(s=this.main.workspacesOwnerId);let a=new Yy;await new Qy(this.main,s).importWorkspaces(n,i,a)}fillSourceTreeview(t,e){e.clear();for(let n=0;n<t.length;n++){let s=t[n];var i=new FileReader;i.onload=a=>{let l=a.target.result;if(!(l.startsWith("{")||l.startsWith("["))){alert(ot.wrongFileFormat(s.name));return}let h=[];try{h=JSON.parse(l),Array.isArray(h)||(h=[h])}catch{alert(ot.noJson(s.name));return}for(let c of h)if(c.modules==null||c.name==null||c.settings==null){alert(ot.wrongFileFormat(s.name));return}else e.addNode(c.isFolder,c.name,c.isFolder?void 0:"img_workspace-dark",c)},i.readAsText(s)}}fillDestTreeview(t){t.clear();let e=this.main.workspaceList;for(let i of e)t.addNode(i.isFolder,i.name,"img_workspace-dark",i)}}class Xy{constructor(t){r(this,"dialog");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(Wt.reportBug()),this.dialog.description(Wt.bugReport()+":");let t=R.makeElement(this.dialog.$dialogMain[0],"textarea","jo_issuereporterr_textfield"),e=this.dialog.addCheckbox(Wt.sendCopyOfWorkspace(),!0,"jo_cbIssueAddWorkspace"),i=this.dialog.input("text",Wt.email()),n=this.dialog.input("text",Wt.firstName()),s=this.dialog.input("text",Wt.lastName());this.dialog.buttons([{caption:Wt.cancel(),color:"#a00000",callback:()=>{this.dialog.close()}},{caption:Wt.send(),color:"green",callback:async()=>{let a={workspace_id:e()?this.main.getCurrentWorkspace().id:null,description:t.value,mail:i.val(),rufname:n.val(),familienname:s.val()};(await dt("/servlet/reportIssue",a)).success&&alert(Wt.thanks()),this.dialog.close()}}])}}class x{}r(x,"Saving",()=>d({de:"Speichere...",en:"saving...",fr:"enregistrement..."})),r(x,"Saved",()=>d({de:"Gespeichert",en:"saved",fr:"enregistré"})),r(x,"OptionDefault",()=>d({de:"Standard",en:"default",fr:"par défaut"})),r(x,"OptionTrue",()=>d({de:"Ja",en:"true",fr:"Oui"})),r(x,"OptionFalse",()=>d({de:"Nein",en:"false",fr:"Non"})),r(x,"CloseButton",()=>d({de:"Schließen",en:"Close",fr:"Fermer"})),r(x,"SettingsHeading",()=>d({de:"Einstellungen",en:"Settings",fr:"Paramètres"})),r(x,"UserSettingsTabHeading",()=>d({de:"Meine Einstellungen",en:"My Settings",fr:"Mes paramètres"})),r(x,"ClassSettingsTabHeading",()=>d({de:"Klassen-Einstellungen für ",en:"Class Settings for ",fr:"Paramètres de la classe pour "})),r(x,"SchoolSettingsTabHeading",()=>d({de:"Schul-Einstellungen",en:"School Settings",fr:"Paramètres de l'école"})),r(x,"ScopeUser",()=>d({de:"Benutzer",en:"User",fr:"Utilisateur"})),r(x,"ScopeClass",()=>d({de:"Klasse",en:"Class",fr:"Classe"})),r(x,"ScopeSchool",()=>d({de:"Schule",en:"School",fr:"École"})),r(x,"EditorSettingsName",()=>d({de:"Editoreinstellungen",en:"Editor Settings",fr:"Paramètres de l'éditeur"})),r(x,"EditorSettingsDescription",()=>d({de:"Hier können Sie die Einstellungen des Editors anpassen.",en:"Here you can adjust the editor settings.",fr:"Ici, vous pouvez ajuster les paramètres de l'éditeur."})),r(x,"HoverVerbosityName",()=>d({de:"Texte beim Hovern über Code",en:"Hover-Verbosity",fr:"Verbosité des infobulles"})),r(x,"HoverVerbosityDescription",()=>d({de:"Menge an Informationen, die in Hover-Infoballons angezeigt werden.",en:"Information amount displayed in hover tooltips.",fr:"Quantité d'informations affichées dans les infobulles."})),r(x,"ShowHelpOnKeywordsAndOperators",()=>d({de:"Hilfstexte für Schlüsselwörter und Operatoren anzeigen",en:"Show help texts for keywords and operators",fr:"Afficher les textes d'aide pour les mots-clés et les opérateurs"})),r(x,"ShowMethodDeclaration",()=>d({de:"Methodendeklarationen anzeigen",en:"Show method declarations",fr:"Afficher les déclarations de méthodes"})),r(x,"None",()=>d({de:"Keine",en:"None",fr:"Aucun"})),r(x,"Declarations",()=>d({de:"Deklarationen",en:"Declarations",fr:"Déclarations"})),r(x,"DeclarationsAndComments",()=>d({de:"Deklarationen und Kommentare",en:"Declarations and Comments",fr:"Déclarations et commentaires"})),r(x,"ShowClassDeclaration",()=>d({de:"Klassendeklarationen anzeigen",en:"Show class declaration",fr:"Afficher la déclarations de la classes"})),r(x,"ShowStructureStatementHelp",()=>d({de:"Hilfe für Strukturanweisungen anzeigen",en:"Show help for structure statements",fr:"Afficher l'aide pour les instructions de structure"})),r(x,"TypingAssistanceName",()=>d({de:"Unterstützung bei der Eingabe von Code",en:"Typing Assistance",fr:"Assistance à la saisie de code"})),r(x,"EditorViewSettings",()=>d({de:"Anzeigeeinstellungen des Editors",en:"Editor View Settings",fr:"Paramètres d'affichage de l'éditeur"})),r(x,"EditorViewSettingsDescription",()=>d({de:"Hier können Sie die Anzeigeeinstellungen des Editors anpassen.",en:"You can adjust the editor view settings here.",fr:"Vous pouvez ajuster les paramètres d'affichage de l'éditeur ici."})),r(x,"TypingAssistanceDescription",()=>d({de:"Hier können Sie die Eingabeunterstützung des Editors anpassen.",en:"Here you can adjust the typing assistance of the editor.",fr:"Ici, vous pouvez ajuster l'assistance à la saisie de l'éditeur."})),r(x,"AutoClosingBracketsName",()=>d({de:"Automatisches Schließen von Klammern",en:"Auto Closing Brackets",fr:"Fermeture automatique des parenthèses"})),r(x,"BracketPairLines",()=>d({de:"Linien zwischen Klammerpaaren anzeigen",en:"Display lines between bracket pairs",fr:"Afficher les lignes entre les paires de parenthèses"})),r(x,"StickyScroll",()=>d({de:"Sticky Scroll",en:"Sticky Scroll",fr:"Défilement fixe"})),r(x,"StickyScrollDescription",()=>d({de:"Zeigt die aktuellen Blocküberschriften (z.B. Methoden- oder Klassennamen) immer oben im Editor an, auch wenn diese nicht mehr im sichtbaren Bereich sind.",en:"Always displays the current block headers (e.g., method or class names) at the top of the editor, even when they are no longer in the visible area.",fr:"Affiche toujours les en-têtes de bloc actuels (par exemple, les noms de méthodes ou de classes) en haut de l'éditeur, même lorsqu'ils ne sont plus dans la zone visible."})),r(x,"BracketPairLinesDescription",()=>d({de:"Vertikale Linien zwischen passenden Klammerpaaren anzeigen, gegebenfalls um Unterstreichung des Scope-Beginns.",en:"Display vertical lines between matching bracket pairs, possibly with underlined scope-start.",fr:"Afficher des lignes verticales entre les paires de parenthèses correspondantes, éventuellement avec le début du scope souligné."})),r(x,"BracketPairLinesOff",()=>d({de:"Keine Linien anzeigen",en:"Do not display lines",fr:"Ne pas afficher de lignes"})),r(x,"BracketPairLinesVertical",()=>d({de:"Vertikale Linien anzeigen (entspricht Scope)",en:"Display vertical lines (according to scope)",fr:"Afficher des lignes verticales (selon le scope)"})),r(x,"BracketPairLinesVerticalAndUnderlined",()=>d({de:"Vertikale Linien und Unterstreichung anzeigen",en:"Display vertical lines and underline",fr:"Afficher des lignes verticales et souligner"})),r(x,"AutoSemicolonsName",()=>d({de:"Automatisches Ergänzen von Strichpunkten",en:"Auto Semicolons",fr:"Point-virgules automatiques"})),r(x,"AutoSemicolonsDescription",()=>d({de:"Fehlende Strichpunkte am Ende der Zeile werden in den meisten Fällen automatisch ergänzt.",en:"Missing semicolons at the end of the line are automatically added in most cases.",fr:"Les points-virgules manquants à la fin de la ligne sont automatiquement ajoutés dans la plupart des cas."})),r(x,"On",()=>d({de:"Ein",en:"On",fr:"Activé"})),r(x,"Off",()=>d({de:"Aus",en:"Off",fr:"Désactivé"})),r(x,"AutoClosingQuotesName",()=>d({de:"Automatisches Schließen von Anführungszeichen",en:"Auto Closing Quotes",fr:"Fermeture automatique des guillemets"})),r(x,"AutoClosingBracketsDescription",()=>d({de:"Bei Eingabe von öffnenden Klammern wird automatisch die schließende Klammer hinzugefügt.",en:"Automatically add closing brackets when typing opening brackets.",fr:"Ajoute automatiquement les parenthèses fermantes lors de la saisie des parenthèses ouvrantes."})),r(x,"AutoClosingQuotesDescription",()=>d({de:"Bei Eingabe eines Anführungszeichens wird automatisch ein zweites hinter dem Cursor hinzugefügt.",en:"Automatically add a second quote behind the cursor when typing a quote.",fr:"Ajoute automatiquement un deuxième guillemet derrière le curseur lors de la saisie d'un guillemet."})),r(x,"AutoClosingBracketsAlways",()=>d({de:"Immer",en:"Always",fr:"Toujours"})),r(x,"AutoClosingBracketsNever",()=>d({de:"Nie",en:"Never",fr:"Jamais"})),r(x,"AutoClosingBracketsBeforeWhitespace",()=>d({de:"Nur vor Leerzeichen",en:"Only before whitespace",fr:"Seulement avant les espaces"})),r(x,"ClassDiagramSettingsName",()=>d({de:"Klassendiagramm",en:"Class Diagram",fr:"Diagramme de classes"})),r(x,"ClassDiagramSettingsDescription",()=>d({de:"Hier können Sie die Einstellungen für das Klassendiagramm anpassen.",en:"Here you can adjust the settings for the class diagram.",fr:"Ici, vous pouvez ajuster les paramètres du diagramme de classes."})),r(x,"ClassDiagramTypeConventionName",()=>d({de:"Darstellungsweise von Datentypen",en:"Type Representation",fr:"Représentation des types"})),r(x,"ClassDiagramBackground",()=>d({de:"Hintergrund beim Exportieren als png-Datei",en:"Background when exporting as png file",fr:"Arrière-plan lors de l'exportation en fichier png"})),r(x,"classDiagramOmitVoidReturnType",()=>d({de:'Rückgabetyp "void" im Klassendiagramm weglassen',en:'Omit "void" return type in class diagram',fr:'Omettre le type de retour "void" dans le diagramme de classes'})),r(x,"ClassDiagramOmitVoidReturnTypeDescription",()=>d({de:'Legt fest, ob im Klassendiagramm bei Methoden der Rückgabetyp "void" weggelassen werden soll.',en:'Determines whether the return type "void" should be omitted in the class diagram for methods.',fr:'Détermine si le type de retour "void" doit être omis dans le diagramme de classes pour les méthodes.'})),r(x,"show",()=>d({de:"anzeigen",en:"show",fr:"afficher"})),r(x,"omit",()=>d({de:"weglassen",en:"omit",fr:"omettre"})),r(x,"ClassDiagramBackgroundDescription",()=>d({de:"Legt fest, ob der Hintergrund des Klassendiagramms beim Exportieren als png-Datei transparent oder weiß sein soll.",en:"Determines whether the background of the class diagram should be transparent or white when exporting as a png file.",fr:"Détermine si l'arrière-plan du diagramme de classes doit"})),r(x,"ClassDiagramTypeConventionDescription",()=>d({de:"Wenn Datentypen im Klassendiagramm angezeigt werden, kann dies entweder in der Art von Java (z.B. String name) erfolgen oder in der Art von Pascal (name: String).",en:"If data types are displayed in the class diagram, they can be shown in either Java style (e.g., String name) or Pascal style (name: String).",fr:"Si les types de données sont affichés dans le diagramme de classes, ils peuvent être présentés dans le style Java (par exemple, String name) ou dans le style Pascal (name: String)."})),r(x,"ClassDiagramTypeConventionJava",()=>d({de:"Java-Stil (z.B. String name)",en:"Java Style (e.g., String name)",fr:"Style Java (par exemple, String name)"})),r(x,"ClassDiagramTypeConventionPascal",()=>d({de:"Pascal-Stil (name: String)",en:"Pascal Style (name: String)",fr:"Style Pascal (name: String)"})),r(x,"ClassDiagramBackgroundTransparent",()=>d({de:"durchsichtig",en:"transparent",fr:"transparent"})),r(x,"ClassDiagramBackgroundWhite",()=>d({de:"weiß",en:"white",fr:"blanc"})),r(x,"CompilerSettingsName",()=>d({de:"Compiler-Einstellungen",en:"Compiler settings"})),r(x,"CompilerSettingsDescription",()=>d({de:"Hier können Sie die Einstellungen des Compilers vornehmen.",en:"Here you can adjust the compiler settings."})),r(x,"ExplorerSettingsName",()=>d({de:"Explorer-Einstellungen",en:"Explorer settings"})),r(x,"ExplorerSettingsDescription",()=>d({de:"Einstellungen für den Datei- und Workspaceexplorer (im Hauptfenster links).",en:"Settings for file- and workspace explorer (in the main window on the left)."})),r(x,"CompilerShadowedSymbolErrorLevelName",()=>d({de:"Errorlevel bei verdeckten Symbolen",en:"Error level for shadowed symbols"})),r(x,"CompilerShadowedSymbolErrorLevelDescription",()=>d({de:"Welches Errorlevel soll der Fehler haben, wenn eine Variable in einem inneren Scope eine andere gleichnamige Variable in einem äußeren Scope verdeckt?",en:"What error level should the error have if a variable in an inner scope shadows another variable with the same name in an outer scope?"})),r(x,"ExplorerFileOrderName",()=>d({de:"Sortierung des Dateibaums",en:"Order of file treeview"})),r(x,"ExplorerFileOrderDescription",()=>d({de:"Hier können Sie einstellen, ob der Dateibaum grundsätzlich alphabetisch sortiert werden soll oder der Nutzer durch drag and drop eine davon abweichende Sortierung festlegen kann.",en:"You can set here whether the file tree should be sorted alphabetically by default or whether the user can define a different sorting by drag and drop."})),r(x,"ExplorerWorkspaceOrderName",()=>d({de:"Sortierung des Workspacebaums",en:"Order of workspace treeview"})),r(x,"ExplorerWorkspaceOrderDescription",()=>d({de:"Hier können Sie einstellen, ob der Workspacebaum grundsätzlich alphabetisch sortiert werden soll oder der Nutzer durch drag and drop eine davon abweichende Sortierung festlegen kann.",en:"You can set here whether the workspace tree should be sorted alphabetically by default or whether the user can define a different sorting by drag and drop."})),r(x,"ExplorerOrderComparator",()=>d({de:"Immer alphabetisch",en:"Always alphabetical",fr:"Toujours alphabétique"})),r(x,"ExplorerOrderUserDefined",()=>d({de:"Nutzerdefinierte Sortierung",en:"User-defined order",fr:"Ordre défini par l'utilisateur"})),r(x,"ErrorLevelIgnore",()=>d({de:"Ignorieren",en:"Ignore",fr:"Ignorer"})),r(x,"ErrorLevelWarning",()=>d({de:"Warnung",en:"Warning",fr:"Avertissement"})),r(x,"ErrorLevelError",()=>d({de:"Fehler",en:"Error",fr:"Erreur"})),r(x,"ErrorLevelInfo",()=>d({de:"Info",en:"Info",fr:"Info"})),r(x,"ContextSensitiveHelpName",()=>d({de:"Kontextsensitive Hilfe",en:"Context-sensitive help"})),r(x,"ContextSensitiveHelpDescription",()=>d({de:"Hier können Sie einstellen, ob in bestimmten Bereichen der Anwendung kontextsensitive Hilfetexte angezeigt werden sollen.",en:"Here you can set whether context-sensitive help texts should be displayed in certain areas of the application."})),r(x,"ContextSensitiveHelpParameterHintsName",()=>d({de:"Parameterhinweise",en:"Parameter hints"})),r(x,"ContextSensitiveHelpParameterHintsDescription",()=>d({de:"Hier können Sie einstellen, ob dann, wenn sich der Cursor in einem Methodenaufruf befindet, Hinweise zu den Parametern dieser Methode angezeigt werden sollen. <br>",en:"Here you can set whether hints about the parameters of a method should be displayed whenever the cursor is inside a method call."}));const Jy="data:image/png;base64,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",ev="data:image/png;base64,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",tv="data:image/png;base64,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",iv="data:image/png;base64,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",nv="data:image/png;base64,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",rv=""+new URL("assets/explorer-B4AQnIGl.png",import.meta.url).href,sv="data:image/png;base64,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",av="data:image/png;base64,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",ov="data:image/png;base64,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";var hg=[{settingType:"group",name:x.EditorSettingsName,description:x.EditorSettingsDescription,settings:[{settingType:"group",name:x.HoverVerbosityName,description:x.HoverVerbosityDescription,settings:[{key:"editor.hoverVerbosity.showHelpOnKeywordsAndOperators",settingType:"setting",name:x.ShowHelpOnKeywordsAndOperators,description:void 0,type:"boolean",image:Jy},{key:"editor.hoverVerbosity.showMethodDeclaration",settingType:"setting",name:x.ShowMethodDeclaration,description:void 0,type:"enumeration",optionValues:["none","declarations","declarationsAndComments"],optionTexts:[x.None,x.Declarations,x.DeclarationsAndComments],image:ev},{key:"editor.hoverVerbosity.showClassDeclaration",settingType:"setting",name:x.ShowClassDeclaration,description:void 0,type:"enumeration",optionValues:["none","declarations","declarationsAndComments"],optionTexts:[x.None,x.Declarations,x.DeclarationsAndComments],image:tv}]},{settingType:"group",name:x.ContextSensitiveHelpName,description:x.ContextSensitiveHelpDescription,settings:[{key:"editor.contextSensitiveHelp.StructureStatements",settingType:"setting",name:x.ShowStructureStatementHelp,description:void 0,type:"enumeration",optionValues:["false","true"],optionTexts:[x.OptionFalse,x.OptionTrue],image:av},{key:"editor.contextSensitiveHelp.ParameterHints",settingType:"setting",name:x.ContextSensitiveHelpParameterHintsName,description:x.ContextSensitiveHelpParameterHintsDescription,type:"enumeration",optionValues:["false","true"],optionTexts:[x.OptionFalse,x.OptionTrue],image:sv,action:(p,t)=>{p.getMainEditor().updateOptions({parameterHints:{enabled:t==="true",cycle:!0}})}}]},{settingType:"group",name:x.TypingAssistanceName,description:x.TypingAssistanceDescription,settings:[{key:"editor.autoClosingBrackets",settingType:"setting",name:x.AutoClosingBracketsName,description:x.AutoClosingBracketsDescription,type:"enumeration",optionValues:["always","beforeWhitespace","never"],optionTexts:[x.AutoClosingBracketsAlways,x.AutoClosingBracketsBeforeWhitespace,x.AutoClosingBracketsNever],action:(p,t)=>{p.getMainEditor().updateOptions({autoClosingBrackets:t})}},{key:"editor.autoClosingQuotes",settingType:"setting",name:x.AutoClosingQuotesName,description:x.AutoClosingQuotesDescription,type:"enumeration",optionValues:["always","beforeWhitespace","never"],optionTexts:[x.AutoClosingBracketsAlways,x.AutoClosingBracketsBeforeWhitespace,x.AutoClosingBracketsNever],action:(p,t)=>{p.getMainEditor().updateOptions({autoClosingQuotes:t})}},{key:"editor.autoSemicolons",settingType:"setting",name:x.AutoSemicolonsName,description:x.AutoSemicolonsDescription,type:"boolean",optionTexts:[x.On,x.Off]}]},{settingType:"group",name:x.EditorViewSettings,description:x.EditorViewSettingsDescription,settings:[{key:"editor.bracketPairLines",settingType:"setting",name:x.BracketPairLines,description:x.BracketPairLinesDescription,type:"enumeration",optionValues:["off","vertical","verticalAndUnderlined"],optionTexts:[x.BracketPairLinesOff,x.BracketPairLinesVertical,x.BracketPairLinesVerticalAndUnderlined],action:(p,t)=>{p.getMainEditor().updateOptions({guides:{bracketPairs:t!=="off",highlightActiveBracketPair:t!=="off",bracketPairsHorizontal:t==="verticalAndUnderlined"}})},image:iv},{key:"editor.stickyScroll",settingType:"setting",name:x.StickyScroll,description:x.StickyScrollDescription,type:"enumeration",optionValues:["off","on"],optionTexts:[x.Off,x.On],action:(p,t)=>{p.getMainEditor().updateOptions({stickyScroll:{enabled:t!=="off"}})}}]}]},{settingType:"group",name:x.ClassDiagramSettingsName,description:x.ClassDiagramSettingsDescription,image:nv,settings:[{key:"classDiagram.typeConvention",settingType:"setting",name:x.ClassDiagramTypeConventionName,description:x.ClassDiagramTypeConventionDescription,type:"enumeration",optionValues:["java","pascal"],optionTexts:[x.ClassDiagramTypeConventionJava,x.ClassDiagramTypeConventionPascal],action:(p,t)=>{p.drawClassDiagrams(!1)}},{key:"classDiagram.background",settingType:"setting",name:x.ClassDiagramBackground,description:x.ClassDiagramBackgroundDescription,type:"enumeration",optionValues:["transparent","white"],optionTexts:[x.ClassDiagramBackgroundTransparent,x.ClassDiagramBackgroundWhite]},{key:"classDiagram.omitVoidReturnType",settingType:"setting",name:x.classDiagramOmitVoidReturnType,description:x.ClassDiagramOmitVoidReturnTypeDescription,type:"enumeration",optionValues:["show","omit"],optionTexts:[x.show,x.omit],action:(p,t)=>{p.drawClassDiagrams(!1)}}]},{settingType:"group",name:x.ExplorerSettingsName,description:x.ExplorerSettingsDescription,image:rv,settings:[{key:"explorer.fileOrder",settingType:"setting",name:x.ExplorerFileOrderName,description:x.ExplorerFileOrderDescription,type:"enumeration",optionValues:["comparator","user-defined"],optionTexts:[x.ExplorerOrderComparator,x.ExplorerOrderUserDefined],action:(p,t)=>{let e=p.projectExplorer.fileTreeview;e.config.orderBy=t,e.sort()}},{key:"explorer.workspaceOrder",settingType:"setting",name:x.ExplorerWorkspaceOrderName,description:x.ExplorerWorkspaceOrderDescription,type:"enumeration",optionValues:["comparator","user-defined"],optionTexts:[x.ExplorerOrderComparator,x.ExplorerOrderUserDefined],action:(p,t)=>{let e=p.projectExplorer.workspaceTreeview;e.config.orderBy=t,e.sort()}}]},{settingType:"group",name:x.CompilerSettingsName,description:x.CompilerSettingsDescription,settings:[{key:"compiler.shadowedSymbolErrorLevel",settingType:"setting",name:x.CompilerShadowedSymbolErrorLevelName,description:x.CompilerShadowedSymbolErrorLevelDescription,type:"enumeration",optionValues:["ignore","info","warning","error"],optionTexts:[x.ErrorLevelIgnore,x.ErrorLevelInfo,x.ErrorLevelWarning,x.ErrorLevelError],action:(p,t)=>{p.getCompiler().forceRecompililation()},image:ov}]}];class lv{constructor(t){r(this,"userSettings");r(this,"ownClassSettings");r(this,"classSettings");r(this,"schoolSettings");r(this,"currentScope","user");r(this,"currentSettingsGroup",null);r(this,"currentSettings",null);r(this,"currentClassId",null);r(this,"$settingsLeftMenuDiv");r(this,"$settingsMainDiv");r(this,"settingsExplorer");this.main=t,this.userSettings=t.settings.values.user||{},this.ownClassSettings=t.settings.values.class,this.schoolSettings=t.settings.values.school}async open(){await this.getSettingsFromServer();let t=new mo;t.initAndOpen(),this.main.windowStateManager.registerOneTimeBackButtonListener(()=>{t.close()}),t.heading(x.SettingsHeading());let e=y("<div></div>");t.addDiv(e);let i=y('<div class="jo_settingsTabBody"></div>');t.addDiv(i),this.$settingsLeftMenuDiv=y('<div class="jo_settingsLeftMenu"></div>'),i.append(this.$settingsLeftMenuDiv),this.$settingsMainDiv=y('<div class="jo_settingsMain jo_scrollable"></div>'),i.append(this.$settingsMainDiv);let n=new gm(e[0],!0),s=new vn(x.UserSettingsTabHeading(),[]);if(s.onShow=()=>{this.showSettingsData("user")},n.addTab(s),n.setActive(s),this.main.user.is_teacher&&this.classSettings&&this.classSettings.length>0){let a=new vn(x.ClassSettingsTabHeading(),[]);a.onShow=()=>{this.showSettingsData("class")},n.addTab(a);let l=y('<select class="jo_settingsSelect"></select>');a.headingDiv.append(l[0]),no(l,this.classSettings.map(h=>({value:h.classId,object:h,caption:h.className})).sort((h,c)=>h.caption.localeCompare(c.caption))),this.currentClassId=this.classSettings[0].classId,l.on("change",()=>{let h=ro(l);this.currentClassId=h.classId,this.currentScope=="class"&&this.showSettingsData()})}if(this.main.user.is_schooladmin&&this.schoolSettings){let a=new vn(x.SchoolSettingsTabHeading(),[]);a.onShow=()=>{this.showSettingsData("school")},n.addTab(a)}t.buttons([{caption:x.CloseButton(),color:"green",callback:()=>{window.history.back()}}]),this.initSettingsExplorer()}async getSettingsFromServer(){let t=await dt("/servlet/getSettings",{});t.success&&(this.classSettings=t.classSettings,this.schoolSettings=t.schoolSettings)}showSettingsData(t){if(t&&(this.currentScope=t),this.$settingsMainDiv.empty(),!!this.currentSettingsGroup){if(this.currentSettingsGroup.image){let e=y(`<img class="jo_settingImage" src="${this.currentSettingsGroup.image}">`);this.$settingsMainDiv.append(e)}this.$settingsMainDiv.append(y(`<div class="jo_settingsGroupCaption">${this.currentSettingsGroup.name()}</div>`)),this.currentSettingsGroup.description&&this.$settingsMainDiv.append(y(`<div class="jo_settingsGroupDescription">${this.currentSettingsGroup.description()}</div>`));for(let e of this.currentSettingsGroup.settings.filter(i=>i.settingType=="setting")){let i=y('<div class="jo_settingDiv"></div>');this.$settingsMainDiv.append(i),this.renderSetting(e,i)}}}renderSetting(t,e){if(t.image){e.append(y('<div class="jo_settingClearBoth"></div>'));let a=y(`<img class="jo_settingImage" src="${t.image}">`);e.append(a)}e.append(y(`<div class="jo_settingCaption">${t.name()}</div>`)),t.description&&e.append(y(`<div class="jo_settingDescription">${t.description()}</div>`));let i=t.key,n=this.getCurrentSettingValues()[i],s=this.getDefaultSettingValue(i);switch(t.type){case"boolean":let a=[x.OptionTrue(),x.OptionFalse()];t.optionTexts&&(a=t.optionTexts.map(g=>g())),a.push(x.OptionDefault()+": "+(s?a[0]:a[1]));let l=[!0,!1,void 0];this.appendSelectElement(e,a,l,n,async(g,f)=>{await this.storeAndSave(t,t.key,g,f)});break;case"string":this.appendInputElement(e,n,s,async(g,f)=>{await this.storeAndSave(t,t.key,g,f)});break;case"enumeration":let h=t.optionTexts.map(g=>g()),c=t.optionValues.indexOf(s);c==-1&&(c=0),h.push(x.OptionDefault()+": "+h[c]);let u=t.optionValues.slice();u.push(void 0),this.appendSelectElement(e,h,u,n,async(g,f)=>{await this.storeAndSave(t,t.key,g,f)});break}t.image&&e.append(y('<div class="jo_settingClearBoth"></div>'))}async storeAndSave(t,e,i,n){if(this.getCurrentSettingValues()[e]!==i){this.getCurrentSettingValues()[e]=i,t.action&&t.action(this.main,i);let a={userId:this.currentScope=="user"?this.main.user.id:void 0,klasseId:this.currentScope=="class"?this.currentClassId:void 0,schuleId:this.currentScope=="school"?this.main.user.schule_id:void 0,settings:this.getCurrentSettingValues()};n.text(x.Saving()+"..."),n.css("color","var(--loginMessageColor)"),n.show(),await dt("/servlet/updateSettings",a),n.text(`-> ${x.Saved()} ✓`),n.css("color","var(--loginButtonBackground)")}}wrapWithSavingMessageAndAppendToParent(t,e){let i=y("<div class='jo_settingsWrapper'></div>");i.append(t);let n=y("<div class='jo_settingsSavingMessage'></div>");return i.append(n),n.hide(),e.append(i),t.on("click",()=>{n.text("")}),n}appendInputElement(t,e,i,n){let s=y(`<input type='text' placeholder='default: ${i}' class='jo_settingsInput'>`);typeof e<"u"&&s.val(e);let a=this.wrapWithSavingMessageAndAppendToParent(s,t);s.on("focusout",async()=>{let l=s.val();l==""&&(l=void 0),await n(l,a)}),s.on("change",()=>{a.hide()})}appendSelectElement(t,e,i,n,s){let a=y('<select class="jo_settingsSelect"></select>'),l=this.wrapWithSavingMessageAndAppendToParent(a,t),h=[];for(let u=0;u<i.length;u++)h.push({value:""+i[u],caption:e[u],object:i[u]});no(a,h);let c=h.findIndex(u=>u.object===n);a[0].selectedIndex=c,a.on("change",async()=>{await s(ro(a),l)})}getDefaultSettingValue(t){let e;return this.currentScope=="user"&&this.ownClassSettings&&(e=this.ownClassSettings[t]),typeof e>"u"&&(e=this.schoolSettings[t]),typeof e>"u"&&(e=this.main.settings.values.default[t]),e}getCurrentSettingValues(){var t;switch(this.currentScope){case"user":return this.userSettings;case"class":return this.main.user.is_schooladmin||this.main.user.is_admin||this.main.user.is_teacher?((t=this.classSettings.find(e=>e.classId==this.currentClassId))==null?void 0:t.settings)||{}:this.ownClassSettings;case"school":return this.schoolSettings}return{}}initSettingsExplorer(){this.settingsExplorer=new di(this.$settingsLeftMenuDiv[0],{withSelection:!0,selectMultiple:!1,captionLine:{enabled:!1},buttonAddElements:!1,buttonAddFolders:!1,withFolders:!0,withDeleteButtons:!1,isDragAndDropSource:!1,orderBy:"comparator"});for(let t of hg.filter(e=>e.settingType==="group"))this.addSettingsToExplorer(t);this.settingsExplorer.nodeClickedCallback=t=>{this.currentSettingsGroup=t,this.showSettingsData()}}addSettingsToExplorer(t,e=null){this.settingsExplorer.addNode(t.settings.find(i=>i.settingType==="group")!=null,t.name(),void 0,t,e),t.settings.filter(i=>i.settingType==="group").forEach(i=>{this.addSettingsToExplorer(i,t)})}}class Je{}r(Je,"importRepository",()=>d({de:"Repository importieren",en:"Import repository"})),r(Je,"importRepositoryDescription",()=>d({de:"1. Wählen Sie eine Datei aus, die das exportierte Repository enthält, das Sie importieren möchten, oder ziehen Sie sie in das gestrichelte Rechteck.",en:"1. Select a file that contains the exported repository you want to import or drag them into the dashed rectangle."})),r(Je,"renameDescription",()=>d({de:"2. Optional: Geben Sie einen neuen Namen für das Repository ein. Wenn Sie keinen Namen angeben, wird der Name aus der Exportdatei verwendet.",en:"2. Optional: Enter a new name for the repository. If you do not provide a name, the name from the export file will be used."})),r(Je,"filesSelected",()=>d({de:"Dateien ausgewählt",en:"files selected"})),r(Je,"newName",()=>d({de:"Neuer Name",en:"New name"})),r(Je,"import",()=>d({de:"Importieren",en:"Import"})),r(Je,"cancel",()=>d({de:"Abbrechen",en:"Cancel"})),r(Je,"noFilesSelected",()=>d({de:"Es wurden keine Dateien ausgewählt. Bitte wählen Sie eine Datei aus.",en:"No files selected. Please select a file."})),r(Je,"wrongFileFormat",t=>d({de:`Die Datei "${t}" ist keine gültige Exportdatei für ein Repository. Bitte wählen Sie eine gültige Datei aus.`,en:`The file "${t}" is not a valid export file for a repository. Please select a valid file.`})),r(Je,"importSuccessfully",t=>d({de:`Das Repository aus der Datei "${t}" wurde erfolgreich importiert.`,en:`The repository from the file "${t}" has been successfully imported.`})),r(Je,"exportTipp",()=>d({de:'<strong>Tipp:</strong> Sie können ein Repository als Datei exportieren, indem Sie in der Workspace-Liste auf einen Workspace rechtsklicken, der mit dem Repository verbunden ist, und dann "Repository als Datei Exportieren" auswählen.',en:'<strong>Hint:</strong> To export a repository as a file right-click on a workspace in the workspace list that is connected to the repository and select "Export repository as file".'}));class dv{static async exportRepository(t,e){let n=await dt("/servlet/getRepository",{repository_id:t,workspace_id:e});if(!n.success)return;let s=n.repository,a;if(s.spritesheet_id)try{let l=new As;await l.load(s.spritesheet_id),l.zipFile!=null&&(a=dg(l.zipFile))}catch{console.log("Fehler beim Laden des Spritesheets.")}return{name:s.name,files:s.files,history:s.history,description:s.description,spritesheetBase64:a}}}class hv{constructor(t){this.main=t}async importRepository(t){if(t.spritesheetBase64){let e=fm(t.spritesheetBase64);try{let i=await Cl.uploadSpritesheet(e,null,!1);t.spritesheet_id=i,t.spritesheetBase64=void 0}catch{}}await dt("/servlet/importRepository",t)}}const cv=""+new URL("assets/lightbulb-CnOCH59Y.png",import.meta.url).href;class uv{constructor(t){r(this,"dialog");r(this,"files");r(this,"$newNameInput");this.main=t,this.dialog=new mo}show(){this.dialog.initAndOpen(),this.dialog.heading(Je.importRepository()),this.dialog.description(Je.importRepositoryDescription());let t=y('<input type="file" id="file" name="file" multiple />');this.dialog.addDiv(t),t.on("change",n=>{this.files=n.originalEvent.target.files});let e=y(`<div class="jo_workspaceimport_dropzone"><div>${ot.dragFilesHere()}</div></div>`);this.dialog.addDiv(e);let i=y('<div class="jo_workspaceimport_dropzone_inner"></div>');e.append(i),this.dialog.description("").text(Je.renameDescription()),this.$newNameInput=this.dialog.input("text",Je.newName()),e.on("dragover",n=>{n.stopPropagation(),n.preventDefault(),n.originalEvent.dataTransfer.dropEffect="copy"}),e.on("drop",n=>{n.stopPropagation(),n.preventDefault(),this.files=n.originalEvent.dataTransfer.files,i.text(this.files.length+" "+Je.filesSelected())}),this.dialog.buttons([{caption:Je.import(),color:"#18a000ff",callback:()=>{this.importFiles()}},{caption:Je.cancel(),color:"#caaf17ff",callback:()=>{this.dialog.close()}}]),this.dialog.addDiv(y('<div style="height:20px"></div>')),this.dialog.addDiv(y("")),this.dialog.description(`<img src="${cv}" style="width:32px; margin-right: 5px;">`+Je.exportTipp())}async importFiles(){if(!this.files||this.files.length===0){alert(Je.noFilesSelected());return}let t=this.files[0];var e=new FileReader;e.onload=async i=>{var h,c;let n=i.target.result;if(!n.startsWith("{")){alert(Je.wrongFileFormat(t.name));return}let s;try{s=JSON.parse(n)}catch{alert(Je.wrongFileFormat(t.name));return}let a=(c=(h=this.$newNameInput.val())==null?void 0:h.toString())==null?void 0:c.trim();a&&a.length>0&&(s.name=a);var l=new hv(this.main);await l.importRepository(s),alert(Je.importSuccessfully(t.name)),this.dialog.close()},e.readAsText(t)}}class mv{constructor(t){r(this,"currentSubmenu",{});r(this,"openSubmenusOnMousemove",!1);this.main=t}initGUI(t,e){let i=this,n=this.main.getMainEditor(),s={items:[{identifier:T.File(),subMenu:{items:[{identifier:T.ImportWorkspace(),action:()=>{new Zy(this.main).show()}},{identifier:T.ExportCurrentWorkspace(),action:async()=>{var u;let a=this.main.currentWorkspace;a==null&&alert(T.NoWorkspaceSelected());let l=a.name.replace(/\//g,"_"),h=(u=this.main.pruefungManagerForStudents)==null?void 0:u.pruefung,c=this.main.user;h!=null&&(l=h.name.replace(/\//g,"_")+" ("+c.familienname+" "+c.rufname+"; "+c.username+")"),Mr(await Br.exportWorkspace(a),l+".json")}},{identifier:T.ExportAllWorkspaces(),action:async()=>{let a="all_workspaces";this.main.user;let l=await Br.exportAllWorkspaces(this.main);Mr(l,a+".json")}}]}},{identifier:T.Edit(),subMenu:{items:[{identifier:T.Undo(),action:()=>{n.trigger(".","undo",{})}},{identifier:T.Redo(),action:()=>{n.trigger(".","redo",{})}},{identifier:"-"},{identifier:T.Copy(),action:()=>{n.getAction("editor.action.clipboardCopyAction").run()}},{identifier:T.Cut(),action:()=>{n.getAction("editor.action.clipboardCutAction").run()}},{identifier:T.CopyToTop(),action:()=>{n.getAction("editor.action.copyLinesUpAction").run()}},{identifier:T.CopyToBottom(),action:()=>{n.getAction("editor.action.copyLinesDownAction").run()}},{identifier:T.MoveToTop(),action:()=>{n.getAction("editor.action.moveLinesUpAction").run()}},{identifier:T.MoveToBottom(),action:()=>{n.getAction("editor.action.moveLinesDownAction").run()}},{identifier:"-"},{identifier:T.Find(),action:()=>{n.getAction("actions.find").run()}},{identifier:T.Replace(),action:()=>{n.getAction("editor.action.startFindReplaceAction").run()}},{identifier:"-"},{identifier:T.ToggleComment(),action:()=>{n.getAction("editor.action.commentLine").run()}},{identifier:T.AutoFormat(),action:()=>{n.getAction("editor.action.formatDocument").run()}},{identifier:"-"},{identifier:T.FindCorrespondingBracket(),action:()=>{n.getAction("editor.action.jumpToBracket").run()}},{identifier:"-"},{identifier:T.FoldAll(),action:()=>{n.getAction("editor.foldAll").run()}},{identifier:T.UnfoldAll(),action:()=>{n.getAction("editor.unfoldAll").run()}},{identifier:"-"},{identifier:T.TriggerSuggest(),action:()=>{n.focus(),setTimeout(()=>{n.getAction("editor.action.triggerSuggest").run()},200)}},{identifier:T.TriggerParameterHint(),action:()=>{n.getAction("editor.action.triggerParameterHints").run()}},{identifier:T.GoToDefinition(),action:()=>{n.focus(),setTimeout(()=>{n.getAction("editor.action.revealDefinition").run()},200)}}]}},{identifier:T.View(),subMenu:{items:[{identifier:T.Theme(),subMenu:{items:[{identifier:T.Dark(),action:()=>{i.switchTheme("dark")}},{identifier:T.Light(),action:()=>{i.switchTheme("light")}}]}},{identifier:"-"},{identifier:T.HighContrastOnOff(),action:()=>{n.getAction("editor.action.toggleHighContrast").run()}},{identifier:"-"},{identifier:T.LinebreakOnOff(),action:()=>{let a=this.main.editor.editor.getOption(H.EditorOption.wordWrap);a=a=="on"?"off":"on",this.main.editor.editor.updateOptions({wordWrap:a})}}]}},{identifier:T.Repository(),subMenu:{items:[{identifier:T.ConfigureOwnRepositories(),action:()=>{this.main.repositoryUpdateManager.show(null)}},{identifier:T.Checkout(),action:()=>{this.main.repositoryCheckoutManager.show(null)}},{identifier:T.importRepository(),action:()=>{new uv(this.main).show()}}]}},{identifier:T.Sprites(),subMenu:{items:[{identifier:T.AddOwnSprites(),action:()=>{this.main.spriteManager.show()}},{identifier:"-"},{identifier:T.SpriteCatalogue(),link:e+"spriteLibrary.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")}]}},{identifier:T.Help(),subMenu:{items:[{identifier:T.VideoTutorials(),link:"https://www.learnj.de/doku.php?id=api:ide_manual:start"},{identifier:T.JavaTutorial(),link:"https://www.learnj.de/doku.php"},{identifier:"-"},{identifier:T.APIDoc(),link:"https://www.learnj.de/doku.php?id=api:documentation:start"},{identifier:T.APIReference(),link:e+"api_documentation.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")},{identifier:"-"},{identifier:T.Shortcuts(),link:e+"shortcuts.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")},{identifier:"-"},{identifier:T.Changelog(),link:"https://www.learnj.de/doku.php?id=javaonline:changelog"},{identifier:T.Roadmap(),link:"https://www.learnj.de/doku.php?id=javaonline:roadmap"},{identifier:"-"},{identifier:T.EditorCommandPalette(),action:()=>{setTimeout(()=>{i.main.getMainEditor().focus(),n.getAction("editor.action.quickCommand").run()},500)}},{identifier:"-"},{identifier:T.ChangePassword(),action:()=>{new lg(i.main).show()}},{identifier:"-"},{identifier:T.BugReport(),action:()=>{new Xy(this.main).show()}},{identifier:"-"},{identifier:T.About(),link:"https://www.learnj.de/doku.php?id=javaonline:ueber"},{identifier:T.Imprint(),link:"https://www.learnj.de/doku.php?id=ide:impressum"},{identifier:T.PrivacyPolicy(),link:"https://www.learnj.de/doku.php?id=ide:datenschutzerklaerung"},{identifier:"<div class='jo_menu_version'>"+T.Version()+" 2.2.1 (18.3.2026, 08:04 Uhr)</div>",noHoverAnimation:!0}]}}]};t!=null&&(t.is_admin||t.is_schooladmin||t.is_teacher)&&s.items[0].subMenu.items.push({identifier:T.ClassesUserTests(),link:e+"administration_mc.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")}),t!=null&&t.is_admin&&s.items[0].subMenu.items.push({identifier:T.ServerStatistics(),link:e+"statistics.html?csrfToken="+He+"&lang="+(t.gui_state.language??"de")},{identifier:T.ShutdownServer(),action:()=>{confirm(T.ReallyShutdownServer())&&Re("shutdown",{},()=>{alert(T.ServerShutdownDone())},a=>{alert(a)})}}),s.items[0].subMenu.items.push({identifier:T.Settings(),action:()=>{new lv(i.main).open()}},{identifier:T.SaveAndExit(),action:()=>{y("#buttonLogout").trigger("click")}}),y("#mainmenu").empty(),this.initMenu(s,0)}switchTheme(t){this.main.viewModeController.setTheme(t)}initMenu(t,e){t.level=e,e==0?t.$element=y("#mainmenu"):(t.$element=y('<div class="jo_submenu"></div>'),y("body").append(t.$element)),t.$element.data("model",t);for(let n of t.items){if(n.identifier=="-")n.$element=y('<div class="jo_menuitemdivider"></div>');else{let s=n.noHoverAnimation?' class="jo_menuitem_nohover"':"";if(n.$element=y(`<div${s}>${n.identifier}</div>`),n.link!=null){let a=y('<a href="'+n.link+'" target="_blank" class="jo_menulink"></a>');a.attr("style","color: var(--fontColorNormal) !important"),a.on("pointerdown",l=>{l.stopPropagation()}),a.on("pointerup",l=>{l.stopPropagation(),setTimeout(()=>{t.$element.hide()},500)}),a.append(n.$element),n.$element=a}n.subMenu!=null&&this.initMenu(n.subMenu,e+1),this.initMenuitemCallbacks(t,n),e==0&&n.$element.addClass("jo_mainmenuitem")}t.$element.append(n.$element),n.$element.data("model",n)}let i=this;y(document).on("pointerdown",()=>{for(let n=0;n<5;n++)i.currentSubmenu[n]!=null&&(i.currentSubmenu[n].hide(),i.currentSubmenu[n]=null);i.openSubmenusOnMousemove=!1})}initMenuitemCallbacks(t,e){let i=this;e.action!=null&&(e.$element.on("pointerdown",n=>{n.stopPropagation()}),e.$element.on("pointerup",n=>{n.stopPropagation(),e.action(e.identifier);for(let s=0;s<5;s++)i.currentSubmenu[s]!=null&&(i.currentSubmenu[s].hide(),i.currentSubmenu[s]=null);i.openSubmenusOnMousemove=!1})),e.subMenu!=null?(e.$element.on("pointerdown",n=>{i.opensubmenu(e),i.openSubmenusOnMousemove=!0,n.stopPropagation()}),e.$element.on("mousemove.mainmenu",()=>{i.openSubmenusOnMousemove?i.opensubmenu(e):i.currentSubmenu[t.level+1]!=null&&(i.currentSubmenu[t.level+1].hide(),i.currentSubmenu[t.level+1]=null)})):e.$element.on("mousemove.mainmenu",()=>{i.currentSubmenu[t.level+1]!=null&&(i.currentSubmenu[t.level+1].hide(),i.currentSubmenu[t.level+1]=null)})}opensubmenu(t){let e=t.subMenu,i,n;e.level==1?(i=t.$element.position().left,n=30):(i=t.$element.offset().left+t.$element.width(),n=t.$element.offset().top),e.$element.css({top:""+n+"px",left:""+i+"px"}),this.currentSubmenu[e.level]!=null&&this.currentSubmenu[e.level].hide(),e.$element.show(),this.currentSubmenu[e.level]=e.$element}}class cg{constructor(t,e){r(this,"color","");r(this,"lastSpan","");r(this,"$lastSpan");r(this,"$lastDiv");r(this,"$outputDiv");r(this,"maxLines",2e3);r(this,"$lines",[]);r(this,"newLines",0);r(this,"printCommands",[]);r(this,"currentLinelength",0);r(this,"beginOfLineState",!0);this.$runDiv=t,this.main=e,y(()=>{this.$outputDiv=t.find(".jo_output"),this.clear();let i=this,n=0,s=!1,a=performance.now();setInterval(()=>{i.printCommands.length>0&&(i.flush(),performance.now()-a>200?i.$outputDiv[0].scrollTop=i.$outputDiv[0].scrollHeight:s=!0,a=performance.now()),n++%20==0&&s&&setTimeout(()=>{i.$outputDiv[0].scrollTop=i.$outputDiv[0].scrollHeight,s=!1},200)},50)})}isTestPrintManager(){return!1}showProgramEnd(){let t=this.$runDiv.find(".jo_run-programend");t.show(),t.addClass("jo_programendkf"),setTimeout(()=>{t.removeClass("jo_programendkf"),t.hide()},3e3)}flush(){if(this.newLines>=this.maxLines){this.$outputDiv.empty();let t=this.printCommands.length-1,e=0;for(;t>=0;){if(this.printCommands[t].newLine&&(e++,e>=this.maxLines)){this.printCommands.splice(0,t+1);break}t--}}this.newLines=0,this.$lastSpan!=null&&(this.$lastSpan.remove(),this.lastSpan.endsWith("</span>")&&(this.lastSpan=this.lastSpan.substring(0,this.lastSpan.length-7)));for(let t of this.printCommands)if(this.beginOfLineState&&t.text.startsWith(" ")?t.text.match(/^( *)(.*)$/)[2].length>0&&(this.beginOfLineState=!1):t.text.length>0&&(this.beginOfLineState=!1),t.text=t.text.replace(/</g,"&lt;").replace(/>/g,"&gt;"),t.color==null&&(t.color="var(--defaultOutputColor)"),(this.lastSpan==""||this.color!=t.color)&&(this.lastSpan!=""&&(this.lastSpan+="</span>"),this.lastSpan+='<span style="color: '+t.color+'">',t.newLine&&t.text==""&&(this.lastSpan+="​"),this.color=t.color),this.currentLinelength<=1e4&&(this.lastSpan+=t.text,this.currentLinelength+=t.text.length),t.newLine){this.beginOfLineState=!0,this.lastSpan.endsWith("</span>")||(this.lastSpan+="</span>"),this.$lastSpan=y(this.lastSpan),this.$lastDiv.append(this.$lastSpan),this.lastSpan="",this.$lastSpan=null,this.$lastDiv=y("<div></div>");let e=this.main.getInterpreter().inputManager.$input;e!=null?this.$lastDiv.insertBefore(e):this.$outputDiv.append(this.$lastDiv),this.$lines.push(this.$lastDiv),this.currentLinelength=0}if(this.lastSpan!=""&&(this.lastSpan.endsWith("</span>")||(this.lastSpan+="</span>"),this.$lastSpan=y(this.lastSpan),this.$lastDiv.append(this.$lastSpan)),this.$lines.length>this.maxLines*1.5){let t=this,e=t.$lines.length-t.maxLines,i=t.$lines.splice(0,e);for(let n of i)n.remove()}this.printCommands=[]}clear(){this.$outputDiv.empty(),this.$lastDiv=y("<div></div>"),this.$lines.push(this.$lastDiv),this.$outputDiv.append(this.$lastDiv),this.currentLinelength=0,this.color="",this.lastSpan="",this.printCommands=[]}print(t,e,i){if(t==null&&(t=""),e&&(t+=`
481
481
  `),t!=""){if(i==null?i="var(--defaultPrintColor)":i=Hi.convertToInt(i),typeof i=="number"){for(i=i.toString(16);i.length<6;)i="0"+i;i="#"+i}if(t=t.toString(),t.indexOf(`
482
482
  `)>=0){let n=t.split(`
483
483
  `);for(let s=0;s<n.length;s++){let a=n[s],l=s<n.length-1;a==""&&s==n.length-1||(this.printCommands.push({text:a,color:i,newLine:l}),l&&this.newLines++)}}else this.printCommands.push({text:t,color:i,newLine:!1})}}printHtmlElement(t){this.flush(),this.$lines.push(y(t)),this.$outputDiv.append(y(t))}}class bm{constructor(t,e){r(this,"position",0);r(this,"xMax",0);r(this,"$grip");r(this,"$bar");r(this,"$display");r(this,"$outer");r(this,"gripWidth",10);r(this,"overallWidth",100);r(this,"intervalBorders",[1,10,100,1e3,5e4,1e6,5e7]);r(this,"maxSpeed",this.intervalBorders[this.intervalBorders.length-1]);r(this,"initialSpeed",this.maxSpeed);this.interpreter=e,this.$outer=y('<div class="jo_speedcontrol-outer" title="'+Dr.speedControl()+'" draggable="false"></div>'),this.$bar=y('<div class="jo_speedcontrol-bar" draggable="false"></div>'),this.$grip=y('<div class="jo_speedcontrol-grip" draggable="false"></div>'),this.$display=y('<div class="jo_speedcontrol-display" draggable="false">100 '+Dr.stepsPerSecond()+"</div>"),this.$grip.append(this.$display),this.$outer.append(this.$bar,this.$grip),t.append(this.$outer)}setInterpreter(t){this.interpreter=t}initGUI(){let t,e,i=this;i.overallWidth=Rl(this.$outer.css("width")),i.gripWidth=Rl(i.$grip.css("width")),i.xMax=i.overallWidth-i.gripWidth;let n=window.PointerEvent?"pointer":"mouse";i.$outer.on(n+"down",s=>{let a=s.pageX-i.$outer.offset().left-4;i.setSpeed(a),i.$grip.css("left",a+"px"),i.$grip.trigger(n+"down",[s.clientX])}),this.$grip.on(n+"down",(s,a)=>{a==null&&(a=s.clientX),t=a,e=i.position,y(".joe_controlPanel_top").css("z-index","1000"),i.$display.show(),y(document).on(n+"move.speedcontrol",l=>{let h=l.clientX-t;i.setSpeed(e+h)}),y(document).on(n+"up.speedcontrol",()=>{y(document).off(n+"up.speedcontrol"),y(document).off(n+"move.speedcontrol"),i.$display.hide(),y(".joe_controlPanel_top").css("z-index","0")}),s.stopPropagation()}),this.setSpeed(this.initialSpeed)}getSpeedInStepsPerSecond(){return this.interpreter.getStepsPerSecond()}setSpeedInStepsPerSecond(t){if(t=="max"&&(t=this.maxSpeed),t>this.intervalBorders[this.intervalBorders.length-1]){this.$grip.css("left",this.xMax+"px");return}t=Math.max(t,1);for(let e=0;e<this.intervalBorders.length-1;e++){let i=this.intervalBorders[e],n=this.intervalBorders[e+1];if(t>=i&&t<=n){let s=this.xMax/(this.intervalBorders.length-1),a=Math.round(s*e+s*(t-i)/(n-i));this.$grip.css("left",a+"px"),this.position=a;break}}this.setInterpreterSpeed(t)}setSpeed(t){t<0&&(t=0),t>this.xMax&&(t=this.xMax),this.position=t,this.$grip.css("left",t+"px");let e=this.xMax/(this.intervalBorders.length-1),i=Math.floor(t/e);i==this.intervalBorders.length-1&&i--;let n=(t-i*e)/e,s=this.intervalBorders[i],a=this.intervalBorders[i+1],l=s+(a-s)*n;l>=this.intervalBorders[this.intervalBorders.length-1]-10&&(l=1e11),this.setInterpreterSpeed(l)}setInterpreterSpeed(t){let e=!1,i=""+bm.printMillions(t);t>=this.intervalBorders[this.intervalBorders.length-1]-10-10&&(i=Dr.maximumSpeed(),e=!0),this.$display.html(i+(e?"":" "+Dr.stepsPerSecond())),this.interpreter.setStepsPerSecondPerSpeedControl(t,e),this.interpreter.hideProgrampointerPosition()}static printMillions(t){return t<1e6?""+Math.trunc(t):(t=Math.trunc(t/1e3)*1e3/1e6,t+" "+Dr.millions())}}class ug{constructor(t,e,i){r(this,"speedControl");r(this,"buttonData",[{actionIdentifier:"interpreter.start",title:T.ProgramRun(),iconClass:"img_start-dark jo_button"},{actionIdentifier:"interpreter.pause",title:T.ProgramPause(),iconClass:"img_pause-dark jo_button"},{actionIdentifier:"interpreter.stop",title:T.ProgramStop(),iconClass:"img_stop-dark jo_button"},{actionIdentifier:"interpreter.stepOver",title:T.ProgramStepOver(),iconClass:"img_step-over-dark jo_button"},{actionIdentifier:"interpreter.stepInto",title:T.ProgramStepInto(),iconClass:"img_step-into-dark jo_button"},{actionIdentifier:"interpreter.stepOut",title:T.ProgramStepOut(),iconClass:"img_step-out-dark jo_button"},{actionIdentifier:"interpreter.gotoCursor",title:T.ProgramGotoCursor(),iconClass:"img_goto-cursor-dark jo_button"},{actionIdentifier:"interpreter.restart",title:T.ProgramRestart(),iconClass:"img_restart-dark jo_button"},{actionIdentifier:"interpreter.startTests",title:T.ProgramExecuteAllTests(),iconClass:"img_test-start jo_button jo_start-test-button"}]);for(let n of this.buttonData){let s=y(`<div title="${n.title}" class="${n.iconClass}"></div>`);n.$button=s,t.append(s),i.registerButton(n.actionIdentifier,s),n.actionIdentifier=="interpreter.pause"&&s.hide()}this.speedControl=new bm(t,e),this.speedControl.initGUI()}getButton(t){var e;return(e=this.buttonData.find(i=>i.actionIdentifier==t))==null?void 0:e.$button}}class pv{constructor(t,e,i){r(this,"$dialog");r(this,"$dialogMain");r(this,"studentCount",0);this.classes=t,this.workspace=e,this.main=i,this.init()}init(){this.$dialog=y("#dialog"),y("#main").css("display","none"),this.$dialog.append(y(`<div class="jo_ds_heading">${oi.distributeWorkspaceToIndividualStudents()}</div>
@@ -631,5 +631,5 @@ class MyFirstTestClass {
631
631
  <li>in sehr niedriger Geschwindigkeit ausgeführt wird (weniger als 10 Schritte/s).
632
632
  </ul>
633
633
  </div>
634
- `),!this.config.hideEditor){let e=new vn("Debugger",["jo_scrollable","jo_editorFontSize","jo_variablesTab"]);this.rightDiv.tabManager.addTab(e);let i=y(e.bodyDiv);this.$debuggerDiv.hide(),i.append(this.$debuggerDiv,this.$alternativeDebuggerDiv)}return this.$runDiv=y(this.rightDiv.outputTab.bodyDiv),t}async loadUserSpritesheet(){this.config.spritesheetURL!=null&&await new As().initializeSpritesheetForWorkspace(this.currentWorkspace,this,this.config.spritesheetURL)}showFile(t){var e;t&&((e=this.fileExplorer)==null||e.selectFile(t,!1))}getDisassembler(){return this.disassembler}showJUnitDiv(){var t;(t=this.bottomDiv)==null||t.showJunitTab()}showProgramPosition(t,e,i=!0){this.showFile(t),e&&(e.startLineNumber&&(e=ee.getStartPosition(e)),i&&this.getMainEditor().setPosition(e),this.getMainEditor().revealPositionInCenterIfOutsideViewport(e),this.getMainEditor().focus())}markFilesAsStartable(t,e){var i;(i=this.fileExplorer)==null||i.markFilesAsStartable(t,e)}onStartFileClicked(t){this.interpreter.start(t)}}function _v(){fetch(qp).then(p=>p.json()).then(p=>{Ja.load(cm).then(t=>{let e=t.source;e.minFilter="nearest",e.magFilter="nearest",p.meta.size.w=t.width,p.meta.size.h=t.height;let i=new Xm(t,p);i.parse().then(()=>{Ja.cache.set("spritesheet",i)})})})}function zv(){self.MonacoEnvironment={getWorker:(p,t)=>{switch(t){case"json":return new Bg;case"css":case"scss":case"less":return new Pg;case"html":case"handlebars":case"razor":return new Mg;case"typescript":case"javascript":return new jg;default:return new Dg}}}}class qv{constructor(){r(this,"startupComplete",2)}initGUI(){this.checkStartupComplete()}initEditor(){this.checkStartupComplete()}checkStartupComplete(){this.startupComplete--,this.startupComplete==0&&this.start()}start(){this.initJavaOnlineDivs()}async initJavaOnlineDivs(){let t=[];y(".java-online").addClass("notranslate").each((e,i)=>{let n=y(i),s=[];n.find("script").each((a,l)=>{let h=y(l),c=h.attr("src"),u=h.text().trim(),g={title:h.attr("title"),text:u};h.data("type")=="hint"&&!g.title.endsWith(".md")&&(g.title+=".md"),c!=null&&(g.url=c),g.text=this.eraseDokuwikiSearchMarkup(g.text),s.push(g)}),t.push([n,s])});for(let e of t)new sp(e[0][0]).switchTheme("dark"),await this.initDiv(e[0],e[1])}eraseDokuwikiSearchMarkup(t){return t.replace(/<span class="search\whit">(.*?)<\/span>/g,"$1")}async initDiv(t,e){t.addClass("joeCssFence");for(let i of e)if(i.url!=null){const n=await fetch(i.url);i.text=await n.text()}new wg(t,e)}}y(function(){let p=new qv;zv(),p.initEditor(),p.initGUI(),_v(),console.log("Online-IDE embedded Version 2.2.1 vom 13.2.2026, 16:51 Uhr")});export{bA as _,vA as a,gA as c,fA as g};
634
+ `),!this.config.hideEditor){let e=new vn("Debugger",["jo_scrollable","jo_editorFontSize","jo_variablesTab"]);this.rightDiv.tabManager.addTab(e);let i=y(e.bodyDiv);this.$debuggerDiv.hide(),i.append(this.$debuggerDiv,this.$alternativeDebuggerDiv)}return this.$runDiv=y(this.rightDiv.outputTab.bodyDiv),t}async loadUserSpritesheet(){this.config.spritesheetURL!=null&&await new As().initializeSpritesheetForWorkspace(this.currentWorkspace,this,this.config.spritesheetURL)}showFile(t){var e;t&&((e=this.fileExplorer)==null||e.selectFile(t,!1))}getDisassembler(){return this.disassembler}showJUnitDiv(){var t;(t=this.bottomDiv)==null||t.showJunitTab()}showProgramPosition(t,e,i=!0){this.showFile(t),e&&(e.startLineNumber&&(e=ee.getStartPosition(e)),i&&this.getMainEditor().setPosition(e),this.getMainEditor().revealPositionInCenterIfOutsideViewport(e),this.getMainEditor().focus())}markFilesAsStartable(t,e){var i;(i=this.fileExplorer)==null||i.markFilesAsStartable(t,e)}onStartFileClicked(t){this.interpreter.start(t)}}function _v(){fetch(qp).then(p=>p.json()).then(p=>{Ja.load(cm).then(t=>{let e=t.source;e.minFilter="nearest",e.magFilter="nearest",p.meta.size.w=t.width,p.meta.size.h=t.height;let i=new Xm(t,p);i.parse().then(()=>{Ja.cache.set("spritesheet",i)})})})}function zv(){self.MonacoEnvironment={getWorker:(p,t)=>{switch(t){case"json":return new Bg;case"css":case"scss":case"less":return new Pg;case"html":case"handlebars":case"razor":return new Mg;case"typescript":case"javascript":return new jg;default:return new Dg}}}}class qv{constructor(){r(this,"startupComplete",2)}initGUI(){this.checkStartupComplete()}initEditor(){this.checkStartupComplete()}checkStartupComplete(){this.startupComplete--,this.startupComplete==0&&this.start()}start(){this.initJavaOnlineDivs()}async initJavaOnlineDivs(){let t=[];y(".java-online").addClass("notranslate").each((e,i)=>{let n=y(i),s=[];n.find("script").each((a,l)=>{let h=y(l),c=h.attr("src"),u=h.text().trim(),g={title:h.attr("title"),text:u};h.data("type")=="hint"&&!g.title.endsWith(".md")&&(g.title+=".md"),c!=null&&(g.url=c),g.text=this.eraseDokuwikiSearchMarkup(g.text),s.push(g)}),t.push([n,s])});for(let e of t)new sp(e[0][0]).switchTheme("dark"),await this.initDiv(e[0],e[1])}eraseDokuwikiSearchMarkup(t){return t.replace(/<span class="search\whit">(.*?)<\/span>/g,"$1")}async initDiv(t,e){t.addClass("joeCssFence");for(let i of e)if(i.url!=null){const n=await fetch(i.url);i.text=await n.text()}new wg(t,e)}}y(function(){let p=new qv;zv(),p.initEditor(),p.initGUI(),_v(),console.log("Online-IDE embedded Version 2.2.1 vom 18.3.2026, 08:04 Uhr")});export{bA as _,vA as a,gA as c,fA as g};
635
635
  //# sourceMappingURL=online-ide-embedded.js.map