From 79b43fbb97eaac34fe8f399fcef7c671a31ccae5 Mon Sep 17 00:00:00 2001
From: Eilert Tunheim <emtunhei@stud.ntnu.no>
Date: Tue, 3 May 2022 14:17:23 +0200
Subject: [PATCH] Added confidentinterval for regression, regression not
 working tho

---
 Bachelor_application.iml                      |   1 -
 pom.xml                                       |   5 -
 .../java/com/application/DB/Constants.java    |   7 +-
 .../GUI/LineChartFunctionality.java           | 154 ++++++++++++------
 src/main/java/com/application/Main.java       |   4 +-
 .../com.application/GUI/graphStyles.css       |  12 +-
 .../com.application/GUI/graphStyles.css       |  20 +--
 .../com/application/DB/Constants.class        | Bin 6367 -> 6414 bytes
 .../application/GUI/InputPopUpWindow.class    | Bin 8553 -> 8570 bytes
 .../GUI/LineChartFunctionality.class          | Bin 12357 -> 13662 bytes
 .../com/application/Main$1WorkerThread.class  | Bin 2837 -> 2842 bytes
 11 files changed, 129 insertions(+), 74 deletions(-)

diff --git a/Bachelor_application.iml b/Bachelor_application.iml
index f8154df..06a8fa9 100644
--- a/Bachelor_application.iml
+++ b/Bachelor_application.iml
@@ -54,6 +54,5 @@
     <orderEntry type="library" name="Maven: com.google.auto.value:auto-value-annotations:1.9" level="project" />
     <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
     <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.14" level="project" />
-    <orderEntry type="library" name="Maven: org.jblas:jblas:1.2.4" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 221d396..51648b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,11 +40,6 @@
             <artifactId>joda-time</artifactId>
             <version>2.10.14</version>
         </dependency>
-        <dependency>
-            <groupId>org.jblas</groupId>
-            <artifactId>jblas</artifactId>
-            <version>1.2.4</version>
-        </dependency>
     </dependencies>
 
     <properties>
diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java
index ccb1fac..69d3c17 100644
--- a/src/main/java/com/application/DB/Constants.java
+++ b/src/main/java/com/application/DB/Constants.java
@@ -27,10 +27,13 @@ public final class Constants {
     public static int NUMBER_OF_PERIODS = 2;
 
     // Number of seconds to wait before updating live data, in seconds
-    public static int NUMBER_OF_SECONDS_LIVE_DATA = 10;
+    public static int NUMBER_OF_SECONDS_LIVE_DATA = 60;
+
+    // Confidence interval
+    public static final double CONFIDENCE_INTERVAL = 0.95;
 
     // Non linear regression
-    public static final double ADJUST_REGRESSION = 5.5;
+    public static final double ADJUST_REGRESSION = 2.5;
 
     // Current sawmill settings;
     public static final String PROJECT_ID = "sf-drying-optimization";
diff --git a/src/main/java/com/application/GUI/LineChartFunctionality.java b/src/main/java/com/application/GUI/LineChartFunctionality.java
index 9883670..a72f2b9 100644
--- a/src/main/java/com/application/GUI/LineChartFunctionality.java
+++ b/src/main/java/com/application/GUI/LineChartFunctionality.java
@@ -1,5 +1,6 @@
 package com.application.GUI;
 
+import com.application.DB.Constants;
 import com.application.Main;
 import javafx.scene.chart.CategoryAxis;
 import javafx.scene.chart.LineChart;
@@ -14,6 +15,7 @@ import org.apache.commons.math3.stat.regression.SimpleRegression;
 import java.util.*;
 
 import static com.application.DB.Constants.ADJUST_REGRESSION;
+import static com.application.DB.Constants.CONFIDENCE_INTERVAL;
 
 public class LineChartFunctionality {
 
@@ -21,8 +23,8 @@ public class LineChartFunctionality {
     private static XYChart.Series<String, Number> liveDataSeries;
     private static CategoryAxis xAxis;
     private static NumberAxis yAxis;
-    private static final double CONFIDENCE_INTERVAL = 0.90;
-    private static int dataPoints = 0;
+    private static int dataPointsXAxis = 0;
+    private static int dataPointsYAxis = 0;
     private static Map<String, Number> liveData;
 
 
@@ -58,22 +60,25 @@ public class LineChartFunctionality {
         for (Map.Entry<Integer, ArrayList<Double>> entry : multiMap.entrySet()) {
             //System.out.printf("\nIndex: \t%s\t\t\tkWh: \t%s\n", entry.getKey(), entry.getValue());
 
-            if(entry.getValue().size()>1){
+            System.out.println("entry: "+entry);
+            //if(entry.getValue().size()>1){
                 SummaryStatistics stats = new SummaryStatistics();
                 for (double val : entry.getValue()) {
                     stats.addValue(val);
                 }
 
+            //System.out.println("Stats: "+stats);
+
                 // Calculate 95% confidence interval
-                double ci = calcMeanCI(stats, CONFIDENCE_INTERVAL);
+                double ci = calcMeanCI(stats, Constants.CONFIDENCE_INTERVAL);
                 //System.out.println(String.format("Mean: %f", stats.getMean()));
                 double lower = stats.getMean() - ci;
                 double upper = stats.getMean() + ci;
-                //System.out.println(String.format("Confidence Interval 95%%: %f, %f", lower, upper));
+                System.out.println(String.format("Confidence Interval "+CONFIDENCE_INTERVAL*100+"%%: %f, %f", lower, upper));
 
                 // Deletes entries if they are out of bounds with the confidence interval
                 entry.getValue().removeIf(value -> Double.compare(value, lower) < 0 || Double.compare(value, upper) > 0);
-            }
+            //}
         }
         return multiMap;
     }
@@ -127,6 +132,74 @@ public class LineChartFunctionality {
 
         //System.out.println("Series size: "+allSeries.size());
 
+
+
+        // Finds the end datapoint at the end of each graph
+        int numberOfGraphs = 0;
+        ArrayList<Double> dataArraylistXAxis = new ArrayList<>();
+        ArrayList<Double> dataArraylistYAxis = new ArrayList<>();
+        Map<Integer, ArrayList<Double>> endOfGraphPointsXAxis = new HashMap<>();
+        Map<Integer, ArrayList<Double>> endOfGraphPointsYAxis = new HashMap<>();
+        for (int i = 0; i < multiMap.size(); i++) {
+            ArrayList<Double> list = multiMap.get(i);
+            for (int j = 0; j < list.size(); j++) {
+                if (numberOfGraphs < list.size()) {
+                    numberOfGraphs = list.size();
+                }
+                if (list.size() < numberOfGraphs) {
+
+                    dataArraylistXAxis.add((double) i);
+                    dataArraylistYAxis.add(multiMap.get(i).get(j));
+                    //System.out.println(tempList);
+
+                    numberOfGraphs = list.size();
+                }
+            }
+        }
+        dataArraylistXAxis.add((double) multiMap.size());
+        dataArraylistYAxis.add(multiMap.get(multiMap.size()-1).get(0));
+
+        //System.out.println(dataArraylistYAxis);
+
+
+        endOfGraphPointsXAxis.put(0,dataArraylistXAxis);
+        endOfGraphPointsYAxis.put(0,dataArraylistYAxis);
+
+        System.out.println(endOfGraphPointsXAxis);
+        System.out.println(endOfGraphPointsYAxis);
+
+        Map<Integer, ArrayList<Double>> endOfGraphPointsConfidenceXAxis = statistics(endOfGraphPointsXAxis);
+        Map<Integer, ArrayList<Double>> endOfGraphPointsConfidenceYaxis = statistics(endOfGraphPointsYAxis);
+
+        System.out.println(endOfGraphPointsConfidenceXAxis);
+
+        System.out.println("Size of list: "+ endOfGraphPointsConfidenceXAxis.size());
+
+        dataPointsXAxis = 0;
+        for (Map.Entry<Integer, ArrayList<Double>> entry : endOfGraphPointsConfidenceXAxis.entrySet()) {
+            System.out.println("Arraylist: "+ entry.getValue());
+            for (int i = 0; i < entry.getValue().size(); i++) {
+                System.out.println("End of graphs: "+ entry.getValue().get(i));
+                dataPointsXAxis += entry.getValue().get(i);
+            }
+        }
+        dataPointsXAxis = dataPointsXAxis /endOfGraphPointsConfidenceXAxis.get(0).size();
+
+        System.out.println("Datapoints: " + dataPointsXAxis);
+
+        dataPointsYAxis = 0;
+        for (Map.Entry<Integer, ArrayList<Double>> entry : endOfGraphPointsConfidenceYaxis.entrySet()) {
+            System.out.println("Arraylist: "+ entry.getValue());
+            for (int i = 0; i < entry.getValue().size(); i++) {
+                System.out.println("End of graphs: "+ entry.getValue().get(i));
+                dataPointsYAxis += entry.getValue().get(i);
+            }
+        }
+        dataPointsYAxis = dataPointsYAxis /endOfGraphPointsConfidenceYaxis.get(0).size();
+
+        System.out.println("Datapoints Y-axis: " + dataPointsYAxis);
+
+
         // Stores the data from the confidence interval in a new map
         Map<Integer, ArrayList<Double>> confidenceIntervalData = statistics(multiMap);
 
@@ -174,47 +247,29 @@ public class LineChartFunctionality {
             }
         }
 
-        // Finds the end datapoint at the end of each graph
-        int numberOfGraphs = 0;
-        ArrayList<Integer> endOfGraphPoints = new ArrayList<>();
-        for (int i = 0; i < confidenceIntervalData.size(); i++) {
-            ArrayList<Double> list = confidenceIntervalData.get(i);
-            for (int j = 0; j < list.size(); j++) {
-                if (numberOfGraphs < list.size()) {
-                    numberOfGraphs = list.size();
-                }
-                if (list.size() < numberOfGraphs) {
-                    endOfGraphPoints.add(i);
-                    numberOfGraphs = list.size();
-                }
-            }
-        }
-        endOfGraphPoints.add(confidenceIntervalData.size());
-
-        dataPoints = 0;
-        for (int i = 0; i < endOfGraphPoints.size(); i++) {
-            dataPoints+=endOfGraphPoints.get(i);
-        }
-        dataPoints = dataPoints/endOfGraphPoints.size();
-
 
         liveDataSeries = new XYChart.Series<String, Number>();
         updateLineChart(liveDataSeries);
 
 
         XYChart.Series<String, Number> regressionSeries = new XYChart.Series<String, Number>();
-        for (int i = 0; i <= dataPoints; i++) {
+        for (int i = 0; i <= getDataPointsXAxis(); i++) {
 
             // Connect the data to a series
             //System.out.println(simpleRegression.predict(i));
             //regressionSeries.getData().add(new XYChart.Data<String, Number>(String.valueOf(i), simpleRegression.predict(i)));
             regressionSeries.getData().add(new XYChart.Data<String, Number>(
                             String.valueOf(i),
-                            getNonLinearRegression(confidenceIntervalData,
-                            simpleRegression.getIntercept(),
-                            simpleRegression.getSlope(),
-                            i,
-                            dataPoints)));
+                            getNonLinearRegression(
+                                confidenceIntervalData,
+                                getDataPointsYAxis(),
+                                //simpleRegression.getIntercept(),
+                                simpleRegression.getSlope(),
+                                //simpleRegression.getIntercept()
+                                getDataPointsYAxis(),
+                                i,
+                                    getDataPointsXAxis()
+                            )));
         }
         updateLineChart(regressionSeries);
         //lineChart.setOpacity(1);
@@ -252,7 +307,7 @@ public class LineChartFunctionality {
         System.out.println("Predicted Time: "  + simpleRegression.predict(35));
 
         // You can also get the slope and intercept from your data
-        System.out.println("slope = " + simpleRegression.getSlope());
+        System.out.println("Alpha! = " + simpleRegression.getSlope());
         System.out.println("intercept = " + simpleRegression.getIntercept());
 
         //simpleRegression.add
@@ -281,10 +336,10 @@ public class LineChartFunctionality {
         int time = 0;
 
         if(liveData == 0) {
-            time = getDataPoints()*10;
+            time = getDataPointsXAxis()*10;
 
         } else {
-            time = (getDataPoints()/liveData)*10;
+            time = (getDataPointsXAxis()/liveData)*10;
         }
         if(time > 60){
             time = time/60;
@@ -295,10 +350,10 @@ public class LineChartFunctionality {
     }
 
 
-    public static double getNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, double y0, double alpha, double j, int n) {
+    public static double getNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, double y0, double alpha, double beta, double j, double n) {
         //return Math.exp(intercept+slope*i)/(1+Math.exp(intercept+slope*i));
 
-
+        /*
         double beta = 0.0;
         //double n = confidenceIntervalData.size();
         for (Map.Entry<Integer, ArrayList<Double>> entry : confidenceIntervalData.entrySet()) {
@@ -308,28 +363,31 @@ public class LineChartFunctionality {
                 }
             }
         }
+
+         */
         //System.out.println("maxYValue: " + maxYValue);
         //System.out.println("j*n: "+j/n);
 
-        //double p_t = ((beta*maxYValue)/(maxYValue+((beta-maxYValue)*Math.exp(-alpha*(yValue-maxYValue)))));
-        //double p_t = ((beta* y0)/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(2*Math.PI)))))-y0;      //Funker sånn halveis
-        //double p_t = (beta * y0)/(y0 + (beta - y0)*Math.exp(-intercept*(j/n)));
-
-        double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(ADJUST_REGRESSION)))))-y0;      //Beste til nå
+        //double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(ADJUST_REGRESSION)))))-y0;      //Beste til nå
+        double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*(j-n)))))-y0;      //Beste til nå
 
 
         System.out.println("---------------------------");
         System.out.println("y0: " + y0);
         System.out.println("Alpha: " + alpha);
         System.out.println("Beta: " + beta);
-        System.out.println(p_t);
+        //System.out.println(p_t);
 
         return p_t;
 
     }
 
-    public static int getDataPoints() {
-        return dataPoints;
+    public static int getDataPointsXAxis() {
+        return dataPointsXAxis;
+    }
+
+    public static int getDataPointsYAxis() {
+        return dataPointsYAxis;
     }
 
     public static Map<String, Number> getLiveData() {
diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java
index b795ec3..aa32d72 100644
--- a/src/main/java/com/application/Main.java
+++ b/src/main/java/com/application/Main.java
@@ -24,7 +24,7 @@ import java.util.logging.Logger;
 import static com.application.DB.Constants.*;
 import static com.application.DB.HelpingFunctions.*;
 import static com.application.DB.HelpingFunctions.isLoadedData;
-import static com.application.GUI.LineChartFunctionality.getDataPoints;
+import static com.application.GUI.LineChartFunctionality.getDataPointsXAxis;
 import static com.application.GUI.LineChartFunctionality.getLiveData;
 import static java.util.logging.Level.SEVERE;
 
@@ -251,7 +251,7 @@ public class Main extends Application {
                             rpi.setProgress(progress);
                         });
 
-                        progress = getLiveData().size()/getDataPoints();
+                        progress = getLiveData().size()/ getDataPointsXAxis();
 
                         if (progress > 100) {
                             break;
diff --git a/src/main/resources/com.application/GUI/graphStyles.css b/src/main/resources/com.application/GUI/graphStyles.css
index ce64d11..2629bcc 100644
--- a/src/main/resources/com.application/GUI/graphStyles.css
+++ b/src/main/resources/com.application/GUI/graphStyles.css
@@ -15,9 +15,9 @@
 
 .default-color0.chart-line-symbol{-fx-background-color: red,red;}
 .default-color1.chart-line-symbol{-fx-background-color: green,green;}
-.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
+.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
diff --git a/target/classes/com.application/GUI/graphStyles.css b/target/classes/com.application/GUI/graphStyles.css
index bbef3d5..2629bcc 100644
--- a/target/classes/com.application/GUI/graphStyles.css
+++ b/target/classes/com.application/GUI/graphStyles.css
@@ -4,8 +4,8 @@
     -fx-effect: null;
 }
 
-.default-color0.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0}
-.default-color1.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1}
+.default-color0.chart-series-line{-fx-stroke: red; -fx-opacity: 1.0}
+.default-color1.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0}
 .default-color2.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1}
 .default-color3.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1}
 .default-color4.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1}
@@ -13,11 +13,11 @@
 .default-color6.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1}
 .default-color7.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1}
 
-.default-color0.chart-line-symbol{-fx-background-color: green,green;}
-.default-color1.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
-.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);}
+.default-color0.chart-line-symbol{-fx-background-color: red,red;}
+.default-color1.chart-line-symbol{-fx-background-color: green,green;}
+.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
+.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;}
diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class
index 02c56a821341bc307e15807c05b63c49702bfc51..3b053db686018b72a73f6e868c762198503a508d 100644
GIT binary patch
delta 2252
zcmca_*k@FK>ff$?3=9k=3?I1|%o*mhGc4d@U;@z#xfo0s7I87KFf0a%ECI2Wf{0}t
z49h_xD?pr;91N>K^lA=<H5?3UIT+S)Fs$cb*ucTCk%M6q2g7DAhAj+RIT=_OwsA0Q
z=U~{u!LXBqVHXF(Zjjg>u6hO*hP@yI_JN4~91I6I7!GnU9O7U&3{r4}gW)KMKE}at
zoQvTE!$~fNQw*m;tTQ0tvm6ZPK=gSKaREeJ1QD0m87{LkT;XE4%5aT~!I<GXJHrh|
z1|H|opdeSjka!oz5LZS9A)l<ovc!r1QVfNi{r%iLU0nT~UE@9dLR^Ew9DNuW7+n|{
zc%Ad}ic1pnO2QIzN>kbF-=%@U<OD_$Nj3)-1~6b`;0g%x_i}X(iT8BjV7NJXA)^-K
zt;uH?TNrO|4rF@4#CT`373*A9<}!xz$+x&nt?x42<6&rFsN-R{&+veUVKRu-!BEG@
zz!{d9lbc$SnOw}n@Q~pV4?{Odl-avHgNI=Ph^a7HpGS6bI(H`bV;+XP3{Q9%Vi;m4
z-{!U#N@j@VVVDXsX&Q)_$xt_0hbPKDmm!vsfioyIF$e4e9)?1YfN*7HWu>mKuWm|;
zf`^AyZmv~vF+0Ok9)@QO&)FGX@G!h&c*Vo;n&HjlqdXqmZ+RHrF}&wtC}a4rS%SBK
ziBWrUC%<jI0|O(2BLf2i6N4**B!fGHC7kcUAj#m#U<2oSF-S6aBgy+PNHX{$@dX$p
z8T^p=QVfy|{z!aj21$khB)%+zBtu|5l0XoHBttNog&|1t{0x!|p-6m?g<(j1K?X^N
za3sDEgCs))5?_Qtk|7d_FUlavP#=Y4VKjpzC?*&f8REbp63-yXkbtBC<fB9+KFCK&
zNPJlaNrq&GSQPy!Nam+9NHU}$saIl<tY=6^5>RH4WXM3`gM5^U#0U8(3yH77Ajy!8
z#8+jIWXM6X5agj;GzaA&saI#Hmt@FC5&-$A0ErLsQ6ZWEMM(0+43Z2bNEVhd@G~$m
zlrfYuFfvpyFfbT1FfuSQFfg!cZD(NI2oBUr1_lODxx>J~$H2lME5K02z`(!*QN>Wr
zP{Y8$z{ya{P{+W;P%+t0$jld{L5KmAOY<2x7z!9f844Mc8H(WgI2dFZ>KPgs7#JF%
zCP74+7#N`O*v!BM%BWxyFA7;BnOMQV!BEK{!BEAZ!BCB4q7p+Znu#EhHn@rH44e!d
zP&Y;j>mr$0&%nXZz#z!b$RNeggk+)!hKV4NPPmC(3|ydc0_?_AF|Emeg_Y_-K9^%)
zXJBAxW8h$DXAorQV31<yWKd@4V$fmeVX$QAMY6$|p$E;)AQ5C6I2n2w`am`?Ffhn~
zL!5zuWfOzM1_lNOMh1{=Y+%uekZ|K+=x5*pl~^DxlWoK$CLa=!3j`?>V_;=qV3^9l
z!7z<MkYPH56vGS#Wro>Ej*(@Uh~^lO2&!WyK^!yLP*hYFWGck+`4G#&c29-|@kJr=
z$yK5%NWr|6frDWgg9O8J1`UQ4NcJi*OhL03B!U`oQ=z857DbM@H4GdKYZ(L?)-gyi
ztVc2t6iuj!3nYT<6E22nP!m(de2^k-GXn?176w6vtqf8O+ZdD?wlnB3>}0TH*o9=e
zF~f8;_ku)_P3L5o0SPD6NK-?Pw0)3pgGAa)sDo_8&A<+VMA#t)4u-=Ff(%C(q!^Ae
zC^H;Ka)>O$EHsCJL{J?v8=FHk&>eCb;t+;@1`dWf4CO4KqG0k@aScYB$#N1sjFppD
cOUQ~lFgP%HFeEa>F*GrxGB7gC1(yx;0MNWwLjV8(

delta 2214
zcmeA(x^Gy2>ff$?3=9k=4DYxY%o*meGtA{;U;@$exEM?r=5sNyFf0IxECjI@fr!N%
z3`;;FOF^7v91P1r^a>7!l^hJKI2cxQFs$KVSj)k%j)P%62g3#~hK&rHI2l+NHghm+
z;b7Rx!LW^kVLJ!I4v^SRu6hO*hFu^7c7upL91MFo81`{6?B`%O08(&}gW(W}KFq;z
zgp1)Q!!a&~;|wQ2tdk(&QydJZLG&3AaTY|J0}<!h87{ChT;yW7#BiC5!I<F+JHu5*
z1|H|opdeSjka!oz5LZS9A)l<ovc!r1QtSmCUA#hrL*j#6-Gf|%gFXHI7#SE{7#Vn-
z^Ye;J67x#J5_3vZ*&M_ez<`l~D<H_<%hfp~-qVGH;o9T_j9QG>C%<NFVZ5=qfawJj
z<IT;HtaDkJiy2BL|Ku{YzQu5xhoO<7nup;I!(ASR2_RN0Lp37<XINrRZfZ$paxo9X
zJ%;-{3>_d*X7BP09)?~JQ(>|nkL=_&?o93nJPfxO9`Z0mGDJ=O#ceN?z!1g5FbQPR
zWDqfpp?b16Pn3NYLlh$eXHaTl4%p2+40#{{;mXR&N?l)H-INps4-c!{T&v<@c7{hh
z438O}uroa6VR**yoQL5B!^_D}cs#gY@i4q*c*Da`%<y)zId1_Iqt@gV{I>O$42%qp
z3=9lR46Y243~mfIaK1Z(B!dS7Lf(@>lEDj!FTfzl;ElwWVvuC;LE=j@NHX{$@nsn#
z8T^p={tS`~0rhAW1|lioXOLtFLgIrg3`XJ$GDtFnAn}D5BpE`H_#zCF3}HxoQ3gqd
za3uR87$h0$BN?I?7#X6$ArQkL$q<XA0pz1NBtFPT@ko4G21$klH2sN479=r9G9)9Z
zS7MN4NI~K&Gf37mq#_A`e3XX72l*%+iLb&S$&i7>S7nf7$V9Rb<fAM!2W2CvS7(r9
z$U)*uGt^5m<RS@xe3XY~Kt7Uu0fQt%A(Dkf4EzjC48;s342%q=3=9m$42%qn3=9mc
zTH6^IH-ZDTjDdjxRIV^E@G-D32r!g0Ffi~y6fsmV@K!P~FmN(dF;p`!F_ccO6*BV$
zX%J#yVPIg$Vc=lMWe{b^V^C(uhil|ukY%W0sAXVasDl~>5vgZjfW~730~aV`f=rww
zY>i}KDFX*X8G{5vIfDj61(JbE3{7YTf<&6(2DUJ8GPFXS*deToWMT~i2SY7`AVVF4
z6hl3di6R&#f<)TjCblzhfr<r?6DLm*)0(U!qErv^xEupJ0|P@d0|!G3gCIjIgA_v>
zgEB)qgAPL{gC#>3k`2ZTooH?bi6Gm+$<W2n4YGlOfk6fw;tUKdn;0ZEFfcGMGJtGj
z1B>=Sf{llvhk*-JK!LPOzA0iB2vQ=(z{<eDFo}VKVKRdt!xRQ7hN%q73^R}%BFoT+
z<`9qwszdrA4w;-FDk=*y6=Lxmh{a%gCqROClCb#Xm7*$0A-srzgJCg)1j7;r4Thyi
z)+#YfM6(tof*NO&Acjts5<`x&l?)sVs~7|sRx?O3tU)pn6ho-V3M7K;5iW+wP!p$!
z`5?vD1_lm>jSPYen;4`RHZv$QY+=x0*v4SVupP;CV}>bc?gfb;o6gBF6%tIS@uh|y
zU%Mf}28pj}PzPm;n}Hn!iLd<(91I5-1Q`x8NHH8@P-ZxS<Pceg>1YlCiJ&@U1~!Li
zpgZIQ#32kl3>*wI8A@0{g}`JL2@OWB$-WXjjAfH=Nyv)ZGB_}}G9)rYGc++IF)%XB
I0+$N20rqT4!vFvP

diff --git a/target/classes/com/application/GUI/InputPopUpWindow.class b/target/classes/com/application/GUI/InputPopUpWindow.class
index 037171ffa7925880946ed5def0d7a08388321c3e..9842a47d800e544997e151418ed15de64d8ee3d9 100644
GIT binary patch
delta 1466
zcmaFq^vkLK)W2Q(7#J8#7|(JsG&3CJVmQQbn2X^E!%=pIV_Xa@3<o(Gjx(G9u}*R@
zoC49O*%{7oFr4LL;9@w(!Ehc#U*KT4$iXm?o#7G(!(|SJD_jg$8LqK2T<2mCWw^n?
za1%t|;$XN9qA!4mI~)vmIT-G7FidQ6uIFI*#?J7agW(4kgBi%kpCI~z5Ca3le=Y_y
zMh139Mm7f(1~A}auw`Td5zOq2EZmH&jBK2Y?2H^B5l(hSE;fgz17LM*4)qRT1{Z@H
zBR7cPVQ1v!VC3Us<YyG%ViaT)0_hg!VqmFf6yaiEVHD+H6ystPXO!S#lw_0wv7|W}
zWf)~S8RZz|xfnzl6+kRS5TOJjlsOnxxEKT(RXG^dK(snYPy@u$<Y3g|WbkFw=3>-g
z)CCcGAVMER7=WxYWM?!IVqj!6<zmQYG@E>skv|H=vSMen=3*#fv=L%pVl)LAX9pte
zxfmT79fcT}8J)Qp4l%m0g8jw7`~u`WSCB?GE=G4o4=zSIMo*AhFChjNMrV+i4?Cmp
zW=*E|%wl{wnPsUii6x048AYjyDU1w^sf-L#llQYqO*Ur}Vzl1u#b(LK=f}h7&(O}!
z7{J5m&los)BD=U+5D#N8V+appC}S8SgMepVL1~FXKw?p1ZfZ$tQ85o=IAa9JAOlv>
z$&c9u1tS<4I5I(sLh=iE7$X@YCbM!Fu|@GPMl;4tw&hSUiDhIE4o=NUO)gOgDN0RM
z2rfuX&P*-lVT=PABmmayQj}ldl3$+ZlwZNa7|)onc`An+qiCW4V-i0bW3m8a3J+r{
zV;T=*I%CG<51jJ)nLLbHjM<C~f?0`WiD?!3#mT98srr8TDXHv?IXsNHjCt&g`8<pT
zjD<XmMU2Ih?YJb_N_ZGc8M7zHa{1Sn@i3M%R<JWx@-S90R`W2{FxK)g)-l%eFg7r>
zGcpKQR#sN(`uggoq$qfJSmowg6&JHJHu5kwF*dU^w(u~vGPdzBwlj9HGj{SYb}@Fd
zGxqQ>_A++!F!nL_^Ds^Tu_l6uNsQf$42-HgjFTCsFfuUkFivHh#>2=l9V9n{apq)W
zZUc!~JdCp$BX}6+fQY#uVjhT?Ke?J)x_$u<<3h$oJPd7&i+LEAFedOYE@f!vVO$0x
zmV@023IY9`#JqHU*NWuSf|AVqJRZgs4DI}Ej4OE<S248mFs=r<a19URTE=z!Y>ewc
zMsDC?+z2vq6XRwc#x0Cn*%`O-Fm7kq#lyG*WXVpj%3VAxjJp~4Y?kEN%*ec#ao^<g
zymE~DH^1YZ$I5tMa<6b1<H5-+BC(8zCMSuUWIQ}sN7P;Z2oK{?#*;h@s~A@EFzjY%
z=V90iB6c$D;$hg!uxs)pQB%g#lTV1gWI4mgpgLJjOnh>_7~AGcVo~gj8z$?@xoU1?
z*u=ofu$h5@L5hLzH$x03p9BPcXYgQW*us_yA_TY?woaZcH<@`G!}iIB@{&^97<Mo)
zfOT;)urTO3u`_I85#VCj$*^m3ihPXNHiqp`X?6xCcc|p<$=BpFO(0UD3@i-m7}hf|
zFf3<aVBle3WZ+=nWZ1^A2cazlstx3gVue&xGkrjk3>*ymCcjhA3f#}Yz`(?Cfbj$a
z0|OTWBjYi~Q;f$MBpH5z3SI_QhTja#41XB@GW-Lv7>yZC7>%JUTR6)J&hln71^^2o
BI931v

delta 1495
zcmez6^wO#R)W2Q(7#J8#7|(DqG&3CFVmQcfh>PJc!x46dqg)Iu3<o$Fjxihuu}*L>
zoCMLQ*cnc9Fr49H;9@w-!Eg>lpXXq>z`-z)o#7$}!zB)e%Ulds7_PE2T;pO8Ww_44
za05i&<Y2f3qR)ef+Z+scI2i77Fifm*t7m8U#=-ENi@^+J-VYFcUWkE#;U9?gpPi9`
z%|V3$47eC<85uzY6FVa_HzNxpD<>lxBRfchgPoC+&7tW4SRI=~y#tuR#o)%s1tPfF
z8F@GudAS(*82Pyv1sDZEx`ntHSQv%5>KRxVMK~BmxfsP5#km+I7$re0DNaUdMj1{<
zSw=Z722n<N5K93>D1rzj4n}1z20=y@4n|cFtp*ZQ2eC9b7&SQ=d>OU47_}L7K!h%c
z&;t?rAPWuH84ZOP7#U5t7_u2nxfrt37|lRTa}Z$xA}rY%t+*J97_EgEm>5k!CfkAt
zJ1$0hMh77VW=1D2hJ%dGtY9xPFuwq~)CHu`m5b4h(VdG?meB*G)>DXqh0zHl=FQIN
zvsshrJu@p~DkFo`<o&EtlRemk7_Bx(vsp5F`|>dQF|@NY`tvaQF$OR)2xTRfC8kyA
z7ndZar|JiTNOs0R9>yTXU>?R0#!yBE0nfaG(h`M$#G=I9)RNSqVjjjY#&D3)fgGZf
zzpx7mhBGp7WP%ih<QMQTMlgm?7UM8ti{xR9VvL^b$Dv{p!^j{UoSKuGT%r(Cl$xp#
zT#%ZanOe-l7z;8;0Ib)gD8IlZzdX+=zk-J`jxm1oG7dLJ(F6g;M1D5LBmu@`9>x^L
zR364O#`MXIT=M!EJdBx)S&R&VFb^cB=B4WU<)@^wGiLKJ<}l{6Gv@Iy<}()XFcvZv
zP4?%KWGm)jEMd%=oX6!~U&_N+##qkISi!?s$ymk1Sj||&!&u8$$HQ39(9XypTv=IJ
zsq5>jo06j7;bE1VYgJs#&e*`i*vQz#&e+Vu*uvP#!`Q~y&d%7u!`R8##m?Bx!`Q>v
z#lzUk*vG@z4`NLK5fd4^7#SE<c^D@#PG)3a;9;D?IF*NyV;V?qI^&GVF5CtZGkF+i
zF^2On&IS>4K*U@SF>i7Yw{-n{9>xWX3wapY7#Hy{E@q79VO+w{&cnDAL@Wcl6%+#c
zIf;4c`mPnpsRbpO`FT8y%Ng4F*%(*wFs@{1<zZX}a^Y$o#x;y<`PmrPfs9<w!?*!t
z<VMC#JdB$ex3DvA<zd{$u#<;zJIIn9V3j+0SQvLP?%u4$vzd{3598j+4|wGm_ig^q
zJCBud|KxeXWsC<Vi;BcD9-Le(a+2}TWLr^p`NKSnM;K4=Fsx!&&BL&Zp`C|e3y9dk
zu#<;j55vyMi$zTtPffll`jX`|BZKN>eKGOL4PtDYAB#n?Gp?CzC+DiUfng&9E5jxR
z1_mhxzTXTnoO}`x_?^LnonbRuDu@u^V%Rcyjof6jtqj{37#NHhSQyqZtY=_gSkAz}
zz{9}EAi*HQu$5su0|VG3P6ieRJtuaC%`5_33_BQhPA-*?5rb$2S;Wr3<PMeGHTk)G
zrU^t!6vI>w22O^p47;JGvNJG+K(&Fq)}oM#YNiiJl7WL^@8tgqT7jU_mx*CN<8cNC
z1}+9h#-ofU8ILhYGW-OU$_%UwzZjSqelz@G_zPk&8ZjC(8bMh$aF!#S<;7?O02b{!
AfdBvi

diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class
index 125b40b88613c6967a6c7d4b98232326c6796831..fc06715ba9dfd5d758264f91fd1228deb018f988 100644
GIT binary patch
delta 7726
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
QlNgg3Q^2fB#wx~Y0C}JQd;kCd

delta 6534
zcmcbYbu^*=)W2Q(7#J8#nE2QkCAk=S8Ku}6rMVcG8KpQGq!?w`8D+T`*dQD^c1C$F
z22Mr=kc=V+qY_A&GKf&&U{nPuQw9+#9E@rpW$GY8gPT#4QHzVgiBX$_QHP6Bmr)NS
ztk2G9z`<z9#aM5|Xw1cE!e|OoXU5Io$Y{>ZXu)X7&1l7F4I*sV8Ev^4lo{>V8SS|k
zR2d!E86CM8)ET8f97}daCoTppMrV+S3!D9$Gazu5i$RLf6(r;)#K6Gl15)YB&gcgc
z@#kVNW(;6+V1NLwdIn?0K#)Wb7h^DE2s>jaTm28H9D@{N7&~J)7lS=0P$JkFqd@+U
z0tHeu2V)EuV=QAF$o6;;k-)_e%a|y{z{r>i@<kemNC(*r_Pho=V+Kfl78ip*V>ZZr
zIUofN?DY)KL5gxY8S@zPxflx=3)vZqxELZp{)=EN2FZaVqJ*8X6l6mgDD2BY22_Al
zRf32r5VxA0v4)Ewg;9!wu@*$vfn@4ItOgJf4KlltgRu!D+|0q)0-{?v80*_W41bW4
zb`Hi4HV4NBu<t>log9o^9E{x{(|bTfFNo-4XYA)<r~w7J6ypStzKI-+leicsGfv@P
zoXX}P2G-613e9O8jMF(7XK*mi<Y1fyvVS(n@pC|-HJ6=n9wP&1PUhwrOnHo!!p{DF
zZk{f#e$KA(o_-;&L1B(Qj0}t}j10Wa`FX`9iFqYqi8-aIj0{{Ui6w~v`I&ho#f%J$
zo||=8ESNTDu(>gE&1Yw{WoL9`WSBGgAg}b~7#`utI_wIY**L5j8AB&KaeigYoNU6S
zIysh0a<VFSwGv-mX>L+#k$;+dQDQ+xF(ZROYF-MI2eDxCJnp~Dj0{?n71<Rg$MA5d
z*jckPf|3C{qdhxg5j(?UMg}g|isaOSlFa<PVs^#_j12RkmfLR@=apn+6q{_wC#>SB
z>B7jsRB6D-z?zs-kdes9z?jF#z><_&lE}!wTo7Nv$Pfb62X?fKi;D|b4{v&Ei3^g4
znKd*$H^1XcVPsp(u!NC8e)2_D;mK#2c{q3&rZdc7WRL|3@cV&1=2($g%)>B~Vb<h@
z0*YCS85i;}^fB}^GH`<oRDk%9hj9_(VjjjNj7u3An7zw07#RdyiYhbn(iH-V@{?1G
zi&Kkv7?**REN5K7&bX3?aTVig9>z6{YoRd#2|ISibv%sgLCQ8Tu9&PN7^b_ChjA0*
zW_HFcJd9fzxA8D;XIR3+xPx&gJL4`M#@&p2*cs>ZFz#jC$HTav@xbKuf?~=%j0YJH
zFfs^dC6*=XmzHGa=sOk_C06=m7MJia9%AHVWU!vRkwbEFJ%`fdL?Ka!!;D9G7>_a@
z<6$_)aGZznIO7pU1_7u1{F365qQnB<)RK(+lwy81#uEaJtNGa&PYN)e;$b|^c!r1Z
zEaN#w2II*aIgI6b7|%0a;9*$Ic#MbfBI6|<#><RH*cq?zFkWT6#K>R|worgmjg^OC
z6T_0p6NS}St}!wwPQJ*hXv4#JopBo@11Qbi;9<PUc#DVeHsc*0#=DI7K*W6k#s~at
zj1L7E1$Y=AF+S#De8TvYhw&NX14y(<Pu3LSRl3Xg9Ax_o9)`^fTR^fe*%@E)FurDd
z!_N4Yhw&Z5zsUzhY&jX<Gk)M<n8z@Ga-p<{91r71Mou1vNeokY7}heZ<6-;+3X0Dl
zf`O57@>xMyWB1e&g&->h9>y<>UwIh6fuz1Le&=C)$GDi0K>#G1o>~$VTv(b|lnPSz
zgYn2@A5leN#-E^IWCtnm1BriO{582jRD_4|Hz+(figWS{QYSAI6?S3x%kYnfVHLw_
z9!6e<UyKX_;AqQ9%uCmYq&^--4n|Ip{eKu4m=rSD8UOMy{sY<0qL7=J$HVxa@zUha
zqLzw`??6$wfMFpI69W??ib4KKS*gh-n@z<EnD{x;Q(+|lOL1n^<RVE!J}xFECT1=M
zDJB+122qX4_xZ&pJ4)S>;V8)uE-A{)OGhybA~ac2I%@J#NhKCB4NuL<fjq*K=Sk}_
zvQ9oDeP;4}8HveDB@8EfNh&z8C#Ix;vI!#tn?`iBi)I)j14kyj4B|;oE%D4NNi729
zd`1S4+k!zM!^psvSWu9fm%_-PJNclv)Z||hqLY1P%O(rR%1^!|>nOm+!^F<S#ltAf
zD8j?Y&nPfiS<aM^XL6+6Ef!uz2Gz+6<iscY$(z*oGB7Z(GjM_OD+43L1O^5MCWeU&
zT%ah2^QSRzf$}^90|OT*lQS?dNHNT2n8U!xFc+*|mw^kEV!-kX7#70yEn*O0U}RX#
zu!Mn;VJQOx!(0Xy21W)327j&X3{1Njm?O6{O#UhFRlkgZfkBIbi-CbbmVt#qj)9Ls
zo<V{^fkA^ok->mLiNTyfnZcexg~5$MmBEiejbS+h0|O7lB!(3XD;XFVI6>)yfeCDj
z3|NMNfn^f|_XY+A21W*u`D|cOEvOIIFmQs>GepPaLkc#&AT>e^EDQ_`dJMb_`V3+W
z1`Ik3hDdhlGOTBq%D}(?G81AuNMsrV1Julo44j~>3-aq^Z$(+KuecbPKn)%SZU$2Z
zE>OmU*vOd2zzX*7T&<l9@{9~S859^9e6)8mC^9n4Wa!l1$)Lo@aDYMCS7#@K3W%k;
zjX{lN2}90q2KC783>tn&;+j@0k}Oc2(jXRCtJb!925n1LT?y803_8pIKhzar(A~kH
zZ^@#&jln>ICEbz@!brB{fSV=3Cc&|b!H|Jr8-r2!^8Y1TAfK{;L(hnThk=2?ib0;i
zmO-Dvj=`M4o*|CGfgy##ks+PIg`t4KjiHjkouP@rn_&inFT-pGzj|=cc`&du#4)fj
zY-O0kz{+6GkjSu&VLJmeLji*Z!w!Zy3@i+l4Dt*+8RjssF*GrVG3;WP!@$8H&rr#*
zn_(|F@a8h?V^|0cb}<GfsN8<I+yMp#hJ)aw!}^DThn?ZjKL!hShQsXj3`f`*4*g<K
z{K;VOi-8FmNk<vDK!rFck{B2mRxz+Muz@0IH-mAc);0zcuGFsW45og%{QT<aA`E8v
z>Dw4AELkL2w6-x=W`h)T?O?FVU+*WvV6z^ap!68@8LSzY!GR>kz{<eD5W>LE5XK<K
zP#?jd&k)IAzz_uv2onZY27U$wh7$}Y8JHR57z7zkfxU0Qz`}5v;S2*a$Qj_k0X1q&
z7|w$87sz9542=2g4Cfd)8O}3YU|<HNagKQmJPd*i3@iaV80>a4*hg+>aPUD&N}zNz
znMXyKADnm`typ$5I7Mz}aGtEEqE+u=#VN@t<hqT)&5BEsi`mGETat^#Xa|G)4h9b^
z9&J&!9Sokk7`zx5b~1P~GlW9~b~5-dF&tn}mE_sR;2SQ<x{bkaH-mp9NO6E9&vu5u
zoeZK(4B;(ojLZLbE&uPYy@Mghm)VZlj75}1XD352Bf}yF107M89SrrJFtfHXsL3v2
z5Cw}O3);1?FfRXp8lp`$gY_sw2$K~Hvl%P18Jj2@M0gQ{uMWs^xIQa(W-|^^4oUWH
z3~GxQv?N(XS&f)Q+1i7^EEY+2QI2g4p$8bW>bEgy2eq&=ws0^m|9=VW;B}iA!X#Pt
zZDR=E%@7f}ogvbSO_EKLWgA13B#RZhB>O%y4rVh>QBF~gMGOX#?4q1TppdiTmgL@N
z#=~sJE6OX%vxq@Jl3SG5(2}o(mvQ<3_br@^%m1HeHe=t-pc=WIA=(OJgwD=-NMJ<j
zh;r^=KscX^*^FD1TapXxd^1sYD2oeBn?bmu?28ygB{{$v!O;LxZN}ch&A9ykF|dV;
zBth9Zn2})zgC|G@^Jaz^u+t?uzy`~1VyKS+nE(!p*li4P37Z*Wz*_HbVu%5&%Gt~i
z15GcR8R9oF#P488fby+4na#LFxi&GxEM_p5<b)*xt{n^kI+ASL7!pB5k|<aECWe?D
z49PnfJP;{^i*fn?<C2^^>KPJ{QYt7Qp@mnoBp0mQv*LzX$ir;LD#;Bk1s!+73rj0r
zNnWTvXAnz?k->^jl5ZP>ixs~lKR9*6)3g96(L$0d>kfwc07(Iat5_MA|KBOevx6aF
z`TxpI3}L$&QX;oAqza{NV@L;iCSw~z<~D|`Z4B8+k~vVxTx^ngP|193k_Fos>cQp~
zZeu9IFt-@2RfM5r8$%g3-Q{5UZ461+BrBkjiEv5g9SoH_7^>i<IAa<^Bm+Y|LjnUc
zLox$5Ln?z7LmGoALk5E#LnebGLl#34Lk>eGLoP!RLmoo~Lq0<bLkYuFhEj%=3>6HA
z7%CZ#GE^~~V5nm_&CtwnfuV!p5<@4$1BNb!uMFLc><pcZybKc=Wf&$i$}>!5)Mc2?
zXv;8@(TiagV+g}+#teozjM)q`8S4ufrZSc@EM#n8Si;!Ju#9m6!z#vA3~LxqF|1;|
zz_5w&GQ(!ZI}BSGUomWD{Kc@1iJf6PlOV$mCJBaJOiB#9nRFTUFqtrHW3pn{!sNhk
zfXScX5K}P2VWtFzBTOX>hncDvjxn_{oMf87aEfUf!&#>J4Ck0uF<fTa%5a5gH^a4h
zrUMMunNBiXWxB+0ndt_@Ii`CIx0xO@JYZ&Hc*M-l@R(VM;R&-f!!u?lhUd(|46m4T
z7+y2yGrVCgVtB_~&hUY`is38sbcS!tTNu7GUu5{n{Ep!d3m?OO7Hvib77s=i79U17
zP?66V#-PNI$q>VEk>L^pCqofKFvDerD-88q3>6H%3|AR0F>o`qFgP+?W4O-1!;r*~
z%y5I@CIbh9DZ^xjTMP>sSQzXWx)^RVOl4qYaAas_xWh1?fsH|nVIIR>hP@2T3|AQ}
z816C5XJBD;U@&C3&oG~XgVC13gy8|hLk4z6C5BM2EF0r01_g#k438PO82>WZGTg6c
zn9sn?_=~{-tdNWGK0_i{AtzH9g9?<jh`|QT;$n7U&;`4npE;O82JBP;W@`o$uv7V%
z`57|64&-5GV<-eWiyKraF+2g+*xW3x;JTZU;R165!&8QZ3``7{nCt5po-xd4U}ltI
zHetBM@SK5#QJ&cl>^oM*PNw4wFBo1jurXd{s%3b^FrR^)@eWf7!)u0z3>-}J88<S#
zVVKIm32uWGFmOXdXc_}6G+f>?Fhj%O9RoYmlkXU~pbnkJz{AW|4|eHW2AE6VGcYhf
zTzY^3=F$TUOi*h-z^$FezzJ?={9};)%OK9q@R6P2(0>MV1`aS2!~?ZDK*FCG*%=No
zF#KnzU|@zzGBEsNVEV_v$zIR!k&)5x7X#}*1`&3K5Jtwo46^JDpBcf;6xRO?DhymO
zO&=LS3fLLGfG9?giINO_*d^H+zOplXWdth{#%;n62G;t241A0r3!(N(N&jSE{l&og
zhe4F_7lZO&26c9ZPmI49tp6|wf?HGOV1IoAH>Ny)Ft9UxV_*O`<iA7PR6iIv8GbVS
zf;3GSzA~_a+d=VKI~c09z*YYahDv4|SfM|;)j+Bq+%Bov#!w4tbFge;h=*1s(mNOe
zBv}x}Gb7{j{|7dL?E^K?)fhM#7#O)3SQvR2cp3Q^_!;>b^cV#g>=}g_A{a#&q8UXQ
z;uyt1xsO4MfrY^ynr2xT^cZx(>64j(fgzru9+E)$83MrRjuD)mK#fa?vftp=SUkfM
zhDFfEB@YABUj}JVy#8Wv!U%vr44j}&Dzs6#oq-A5I1OR8k($N8yMv)lfGfjhIRnoQ
zhB~Pn5L>!lz-9@9qO^cbjt#WJk>18oFVwJ&A$=P|)((co<qVR@5>0RkP*^}(n~<=O
zWME>HW?*BKVGv-HXOLu6WRPc6Vo+gJX0T;cWe8?e2Zsg7YoM0t0*3kE4qJT?!+(bP
z42<9e&B?&>he3dmLs^u8laYau5!yw$$H2wF%fP_!mCup`7IzAa3`iArJaUE2Y{nzX
z1Fxw;{gp)w))E{D5m6p+n?q|GgZ7O2ISf)*Wh^;bctADs^8a%sIMlP%B{<a6HOnPf
zvqjn4^F<h%^LH?`W+&&Xr(1GuVh9szL#>zFw=txv!>d1}3cF()L%JrCL_NHo@7%_a
zF2R8$6(+&8jiF0|Ydt*CSuyZ2Ffi&dFf$r3s4*HcSTh<igfSX3<T4sE6f>GJlrh>d
zOk;Fpn8)bEu$|GF;R2%z!z)HthEI&{;J}Yz;AGHb@B$a8JPc|Kz6`tT8TNw8ABL~s
zQW4bP|H{Y&ZtycOd}U;2m;+9LUm5O$drcrQ7En>hz|8Q8krmuSn#K^%$i^^-feW5=
z!3HzzhnoxQ7fCX({$&tgW@k9`mqCJ^;V|QG2IqQkmWTF<7}*&(K_e*8<crjOj#-1+
zeP;Aw;AG@t<c6dW1|*f;phgB#N1HJKQZ_L1FmQrKZJ;__85qI6rg~Pb%?#a$v<&Vh
zGlnp*FouGI4AQ-3W#j|bBOtR8BA_e@8K(Fnzy%uFfV$g=feCCj2eiQr(!~VsmqEJz
zB}gXMb1(`r3NbJUaDm20pax_xuz(9LIZ(@ATWtqJ&uj*MFk52>L(e=0c9!J~EX<%F
zfn-34vEE=~6~GZD2kyv%qEimskp=br<rqa7t~0QJa~c~1vjnpPBLhb{qZoWpL>BC7
z1_oA8TOAZ6NWsV;$-vAg4$88O5)4xq7#NfoSQwlbBN-+$NHQohI5O;E<7Dt>jAYDY
mkYwUu;%4GxkYsdcU|<kqU}E%OU}p4W^kVb|vyvE-8B+lAWU2)K

diff --git a/target/classes/com/application/Main$1WorkerThread.class b/target/classes/com/application/Main$1WorkerThread.class
index 8764a06752f05b58c77755135c22afadf0c8bbf2..b47d85b5fce893cc2f8bdd2faa64b9b4888b2eef 100644
GIT binary patch
delta 31
mcmbO#HcM=S3%ig|dTNPFVo72^er8@tafD+<=H@{5Bg_D)+zS2x

delta 26
hcmbOwHdSnc3p+1wdTNPFVo72^er8_D<}mgn%m8(&2@C)L

-- 
GitLab