From fb432d687cf4c97ae5570720ca02457fca2129ca Mon Sep 17 00:00:00 2001
From: niklasBr <104077966+bretzNiklas@users.noreply.github.com>
Date: Wed, 28 Dec 2022 17:49:45 +0100
Subject: [PATCH] Added Parser.java

---
 .idea/uiDesigner.xml                      | 124 ++++++++++++++++++++++
 Aufgabe3/packages/NUnit.3.13.3/CHANGES.md |   6 +-
 Aufgabe4/Ast.java                         |  65 ++++++++++++
 Aufgabe4/{Tokenizer.java => Lexer.java}   |  10 +-
 Aufgabe4/Main.java                        |  26 -----
 Aufgabe4/Parser.java                      |  99 +++++++++++++++++
 Aufgabe4/main.java                        |  41 +++++++
 out/production/inf3_git/main.class        | Bin 2089 -> 1429 bytes
 8 files changed, 337 insertions(+), 34 deletions(-)
 create mode 100644 .idea/uiDesigner.xml
 create mode 100644 Aufgabe4/Ast.java
 rename Aufgabe4/{Tokenizer.java => Lexer.java} (88%)
 delete mode 100644 Aufgabe4/Main.java
 create mode 100644 Aufgabe4/Parser.java
 create mode 100644 Aufgabe4/main.java

diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>
\ No newline at end of file
diff --git a/Aufgabe3/packages/NUnit.3.13.3/CHANGES.md b/Aufgabe3/packages/NUnit.3.13.3/CHANGES.md
index ae907d4..13279ed 100644
--- a/Aufgabe3/packages/NUnit.3.13.3/CHANGES.md
+++ b/Aufgabe3/packages/NUnit.3.13.3/CHANGES.md
@@ -1714,7 +1714,7 @@ NOTE: Bug Fixes below this point refer to the number of the bug in Launchpad.
 
 ## NUnit 2.9.6 - October 4, 2013
 
-### Main Features
+### main Features
 
  * Separate projects for nunit-console and nunit.engine
  * New builds for .NET 4.5 and Silverlight
@@ -1847,7 +1847,7 @@ NOTE: Bug Fixes below this point refer to the number of the bug in Launchpad.
 
 ## NUnit 2.9.3 - October 26, 2009
 
-### Main Features
+### main Features
 
  * Created new API for controlling framework
  * New builds for .Net 3.5 and 4.0, compact framework 3.5
@@ -1861,7 +1861,7 @@ NOTE: Bug Fixes below this point refer to the number of the bug in Launchpad.
 
 ## NUnit 2.9.2 - September 19, 2009
 
-### Main Features
+### main Features
 
  * NUnitLite code is now merged with NUnit
  * Added NUnitLite runner to the framework code
diff --git a/Aufgabe4/Ast.java b/Aufgabe4/Ast.java
new file mode 100644
index 0000000..1de8c11
--- /dev/null
+++ b/Aufgabe4/Ast.java
@@ -0,0 +1,65 @@
+import java.beans.Expression;
+import java.util.ArrayList;
+
+public abstract class Ast {
+
+    public void visit(){
+
+    }
+
+   
+}
+
+class AstExpression extends Ast {
+
+    AstExpression astExpression;
+    AstBinaryOp astBinaryOp;
+    AstValue astValue;
+    
+}
+
+class AstBinaryOp extends Ast {
+
+    Ast[] binaryOp = new Ast[3];
+
+}
+
+class AstValue extends Ast {
+
+    AstNumber astNumber;
+    AstValue astValue;
+    boolean isVariable;
+
+}
+
+class AstNumber extends Ast {
+
+    AstDigitWoz astDigitWoz;
+    ArrayList<AstDigit> astDigits = new ArrayList<>();
+
+}
+
+class AstDigitWoz extends Ast {
+
+    int astDigitWozContent;
+
+}
+
+class AstDigit extends Ast {
+
+    int astDigit;
+
+}
+
+class AstDecimal extends Ast {
+
+    AstDigit astDigitBeforeComma;
+    AstDigit astDigitAfterComma;
+
+
+}
+
+class AstOperator extends Ast {
+
+    String astOperator;
+}
diff --git a/Aufgabe4/Tokenizer.java b/Aufgabe4/Lexer.java
similarity index 88%
rename from Aufgabe4/Tokenizer.java
rename to Aufgabe4/Lexer.java
index 574433d..fc81483 100644
--- a/Aufgabe4/Tokenizer.java
+++ b/Aufgabe4/Lexer.java
@@ -1,17 +1,17 @@
 import java.util.ArrayList;
 import java.util.Objects;
 
-public class Tokenizer {
+public class Lexer {
 
 
+    public ArrayList<Token> lex(String s) {
 
+        ArrayList<String> separatedChars = separateChars(s);
 
+        ArrayList<String> tokensAsStrings = buildSubstringsFromSeparatedChars(separatedChars);
 
+        return constructTokenList(tokensAsStrings);
 
-    public ArrayList<Token> tokenizeString(String s) {
-
-
-        return constructTokenList( buildSubstringsFromSeparatedChars( separateChars(s) ) );
 
 
     }
diff --git a/Aufgabe4/Main.java b/Aufgabe4/Main.java
deleted file mode 100644
index 4fa6318..0000000
--- a/Aufgabe4/Main.java
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-public class Main {
-    public static void main(String[] args){
-
-        // 23, x, +, (,0, 5, x,), ^, 2, -, 1
-        String ausdruck = "230lkjhx  +(2  5x) ^2,jhff  3−1gf ";
-        String ausdruck2 = "0x  +(2 5x) ^2−1f ";
-
-        Tokenizer t = new Tokenizer();
-
-        t.tokenizeString(ausdruck).forEach(t1 -> {
-            System.out.print(t1.getTokenString() + " ");
-            System.out.println(t1.getTokenType());
-        });
-
-
-        t.tokenizeString(ausdruck2).forEach(t1 -> {
-            System.out.print(t1.getTokenString() + " ");
-            System.out.println(t1.getTokenType());
-        });
-
-
-    }
-}
-
diff --git a/Aufgabe4/Parser.java b/Aufgabe4/Parser.java
new file mode 100644
index 0000000..fe1ccee
--- /dev/null
+++ b/Aufgabe4/Parser.java
@@ -0,0 +1,99 @@
+import java.io.IOError;
+import java.sql.SQLSyntaxErrorException;
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class Parser {
+
+    public AstExpression parse (ArrayList<Token> tokenList) {
+
+        AstExpression root;
+
+        root = (AstExpression) parseAstExpression(tokenList);
+
+        return root;
+    }
+
+    private Ast parseAstExpression (ArrayList<Token> tokenList) {
+
+        if(tokenList.size() == 1) {
+            AstValue astValue = new AstValue();
+            astValue.astNumber = new AstNumber();
+            astValue.astNumber.astDigitWoz = new AstDigitWoz();
+
+            astValue.astNumber.astDigitWoz.astDigitWozContent = Integer.parseInt(tokenList.get(0).getTokenString());
+            return astValue;
+        }
+
+        AstExpression astExpression = new AstExpression();
+
+        ArrayList<Token> tokensPos3 = new ArrayList<>();
+
+        tokenList.forEach(token -> {
+            if(token != tokenList.get(0) && token != tokenList.get(1)) {
+                tokensPos3.add(token);
+            }
+        });
+
+
+        astExpression.astBinaryOp = parseBinaryOp(tokenList.get(0), tokenList.get(1), tokensPos3);
+
+        return astExpression;
+
+    }
+
+    private AstBinaryOp parseBinaryOp (Token expression1, Token operator, ArrayList<Token> expression2) {
+
+
+
+
+        AstBinaryOp astBinaryOp = new AstBinaryOp();
+
+
+        AstValue exp1;
+
+        ArrayList<Token> exp1ArrayList = new ArrayList<>();
+        exp1ArrayList.add(expression1);
+        exp1 = (AstValue) parseAstExpression(exp1ArrayList);
+
+        astBinaryOp.binaryOp[0] = exp1;
+
+
+        astBinaryOp.binaryOp[1] = parseOperator(operator);
+
+
+
+        // ( 2 + 3 ) + 3
+
+
+        if (expression2.size() > 2) {
+
+            astBinaryOp.binaryOp[2] = parseAstExpression(expression2);
+
+        } else {
+
+            AstValue exp2 = new AstValue();
+
+            ArrayList<Token> exp2ArrayList = new ArrayList<>();
+            exp2ArrayList.add(expression2.get(0));
+            exp2 = (AstValue) parseAstExpression(exp2ArrayList);
+
+            astBinaryOp.binaryOp[2] = exp2;
+
+        }
+
+        return astBinaryOp ;
+    }
+
+    private AstOperator parseOperator (Token operator) {
+
+        AstOperator astOperator = new AstOperator();
+        astOperator.astOperator = operator.tokenString;
+
+        return astOperator;
+    }
+
+
+
+
+}
diff --git a/Aufgabe4/main.java b/Aufgabe4/main.java
new file mode 100644
index 0000000..5c9c610
--- /dev/null
+++ b/Aufgabe4/main.java
@@ -0,0 +1,41 @@
+import java.util.Arrays;
+
+public class main {
+
+    public static void main(String[] args){
+
+        // 23, x, +, (,0, 5, x,), ^, 2, -, 1
+        String ausdruck = "230lkjhx  +(2  5x) ^2,jhff  3−1gf ";
+        String ausdruck2 = "0x  +(2 5x) ^2−1f ";
+
+        Lexer lexer = new Lexer();
+
+        // [23x] + [0,5x^2 - 1]
+
+
+        //lexer.lex(ausdruck).forEach(token -> System.out.println(token.getTokenString()));
+
+        Parser p = new Parser();
+
+        AstExpression result =  p.parse(lexer.lex(ausdruck));
+
+
+        System.out.println( ((AstValue) result.astBinaryOp.binaryOp[0]).astNumber.astDigitWoz.astDigitWozContent );
+
+        System.out.println( ((AstOperator) result.astBinaryOp.binaryOp[1]).astOperator );
+
+
+        // System.out.println( ( result.astBinaryOp.binaryOp[2]).getClass() );
+
+        AstExpression root = (AstExpression) result.astBinaryOp.binaryOp[2];
+
+        System.out.println( ((AstValue) root.astBinaryOp.binaryOp[0]).astNumber.astDigitWoz.astDigitWozContent );
+
+        System.out.println( ((AstOperator) root.astBinaryOp.binaryOp[1]).astOperator );
+
+        System.out.println( ((AstValue) root.astBinaryOp.binaryOp[2]).astNumber.astDigitWoz.astDigitWozContent );
+
+
+    }
+}
+
diff --git a/out/production/inf3_git/main.class b/out/production/inf3_git/main.class
index 386650f1dab3e03d3dce9cf08e58cea64d1e5f43..274c9dc70fb7124b56b29c31600ddfaac7e9ea12 100644
GIT binary patch
literal 1429
zcmaJ>X;afs6g`hFX-gC>Zn$9GTM?^ur-&kgqLHF#U2uCXnHmjACrKUfNBAf7vokuK
zI-@g;e)UH=p4YSr=-3ZQ?so3E_np@tKfkO1D8fvk2N4ZX9WlfOHocUuW!{!fEnlj<
zG^>F?eAIHRU`!yA&6N{K2qX)c;moPbQ0BCTlt9cdmrO5(qypN&f?4VL%Aq5oyqk1v
zMw<1uxg?Ow8h?7s1)k;9in-9$2rN54?s;<Au>7E?0JiAZif!ysSC|5aJJst_bH=zI
zOfJ<u)AudcDJHQ40~&Vf*oEC|rkY#!19OpN+y-ac8aB4v{49wCq+`lORu5vYhK!DV
z*e|eQ4Yok9^n)vwBfaHPol(`gYqInp4rw^7;|Q`$T@@2ZRDM^*=T%uz!%@2VRhD+c
zOd^M4I)-taJC=Sh(^#yS9#K?oXt2QvoYYXzaSErI_B#^tx@y&|;J*8&!>enu>@3b{
zIIrUZMnYcQm_VAny4Hm21g68)i0KqYaZ$sVj!U>K(BD3`wW|`)>S}SeBM{9_=gJzc
zgy^NZ>B+$Lk{HKT9g~;}33mPL`nL{L$Lp%yG>_(AIw>o;-qc~>7WY;&g9%&uKDlK(
z5^5{A?WBB0QBq*D>%c-`7Zuq%q`fFD#eTwFpuYMH%Q3@M-<1`cp0wdsrCpYurR<I~
z8oaRBHg2fmqQJK7{NK~$%7m3(P4W9jm;=a$zu+~huc&X{4RzF-(Y{QC6x3G22(J>&
zIHldNc`kkHq|P3m>oSm<a~odOoU#<_q#|})oftKIn@dx_9<UMOe9qCz^DX#}9sLaP
zu^qn4rwRiR+~ZRZ6Hvx|T1ni&1A162rkN3^?|WJ^z9RYXGkR}*h0gcJnc-tYE%dd}
zKN9_f?E}#!_B3%IQuu~k6GKhpn>f=#aaAnJ*mx5YEnHjWjTKtB(ZWm@A;zr1k(kPe
z{RguXTZh^4DvUKO{tRB=xIlt~rO=Bs`mu%o1KTlz0nB0#s@MyU+kA@yc#lK)hHQID
zW8ot35RX_N!3yRv#WnS!g~xcpt@q;tp5hr}gLsGMkcbkggbKf6%&fAm2MfOdB=kuM

literal 2089
zcmcIlTXWk)6#mwBB3n^n*SVCWr4_9k?A)9S<x+=2YZ_Xrq=f{RQYfrt*;Xt|8EM^V
zcxQ%Zp7<N^kj{h|egMO-;D<1rm1N@7frrizPozDU{m%K$o;~{gujAhURN$#dAgLgw
zVFaTLxqbeOmmTi5$`9)MmMIuUH*MDzHyM(}QZ0=%Lt%Ym)#>cFpX>T!ab4H1KQHM|
z*O&I&&8Dtz{Q1L=Yptf9hRQIt8v8^p($v%yXbhP>uVcCPcb2bW3`zOOYRKUn!-R-U
zyTZ5K7DK6MoTL>gE2T))6Sh;n<@@~5ume%a6RAlJQ<$c_xoKJlMBs99(7D-jO<{X(
zx$3z=uWR`g73cAqf>{l7xWF(O#ySnmpfo-I4maBjdYnz@F^pEK<v}1BT*74qx`sD!
z<y2jF4+CL!shnPqlADfr*k1V|krl+w;$2FqfNKioHN1%;!$?>xs!Yog;j&+usXn#v
z#NyKA=|~qeEMke_e3y4DVrp{n$QEtMS#Vbb4D<h9)Il&6D<~^i)v$*3esNA`OZgqh
z+=<Ltm^De}Ee+T4HiOn@uy=T1F^p6GAt5Oe>lM7K;XT}-dWVpX`x0o>l$BCV!6rkh
z%Wd*VRlNp*WewZ4c6!~q<?r#jLz=wdncS&y-<EQ$Oo_Hl{6`JBxxz40d~!y6)d-gR
zEpnVZ!_1K8y`bUu%#MsQ)ScAdeLEG6QEA2^p0eR7=D5SV^#(7<6bfq$YB4esF@}U7
zjS?$f@?9n0U9abx)|M?9W+cLjj88pw+w(*qe15QPiMH1WvZL5lv4_tU)HFQ87YtWU
zQnlS@bkE90m<jFRO>PR$Kcrl{gVG;^hZ=8+0^H?p!?A*b;d!0jL1nlM1DaDC!_$5x
zV-#{Q)G%;-+ruu7tyS(gySA_@IozPCJW*-%eWhUs_j9;Uif^RiTMeItQeB0Kh5}1o
zq9)C|p`t}MExK1*{j&Y^{}(F0;e#F7zY)Xb{D*WJG`12<r|WmmbuGW@@F1`P1=PIP
zhPa(|whCxqUHWfVd8NWepov$Z5hVXoGz#gvLeKX}D$|?Mdt~7S*w3^`;3hq#nUwf|
zo?5*A5VuImU=z1VBR79f-YI&Q@`{nqZ2yX}$1gCxv%GkOiDS^<Kf=uNQYc&ug_8ht
z6heX}q0&mj1pO}1N1{jrUj|)>fKkOqBqcGAJJ_PIqqvHXX_W~5@8TYkIaT&ZoRUEn
znflx>czxjrSC3JWk(VQJ;|TAZ<S;?Fz%;U$!7P1nPRP!|z&1e0)Q+!=oF(KOA)gyY
prpON{b^;IaDZMX}{2Bc}#+UdyUOlB1r`Rpn<e}1P9}Zm1{tX$k4nF_@

-- 
GitLab