From 14361e68e94d718bce518f1c502b64ba24ab73ab Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu <634-db200253@users.noreply.www-apps.univ-lehavre.fr> Date: Wed, 22 Nov 2023 07:16:18 +0000 Subject: [PATCH 01/11] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..19fb813 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Mesure_RI + -- GitLab From 5c82b54015ebbb0621a767cd8d030ede10f110b2 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu <634-db200253@users.noreply.www-apps.univ-lehavre.fr> Date: Wed, 22 Nov 2023 08:19:43 +0000 Subject: [PATCH 02/11] Delete org.eclipse.core.resources.prefs --- .settings/org.eclipse.core.resources.prefs | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .settings/org.eclipse.core.resources.prefs diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index f9fe345..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 -- GitLab From a0b3c4290cecaf24b1ca5f8a870e80a132075748 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu <634-db200253@users.noreply.www-apps.univ-lehavre.fr> Date: Wed, 22 Nov 2023 08:19:47 +0000 Subject: [PATCH 03/11] Delete org.eclipse.jdt.core.prefs --- .settings/org.eclipse.jdt.core.prefs | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .settings/org.eclipse.jdt.core.prefs diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index a3b98fd..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.7 -- GitLab From cf88d5c44b95cb33485782596824bd6de9e580fa Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu <634-db200253@users.noreply.www-apps.univ-lehavre.fr> Date: Wed, 22 Nov 2023 08:19:53 +0000 Subject: [PATCH 04/11] Delete org.eclipse.m2e.core.prefs --- .settings/org.eclipse.m2e.core.prefs | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .settings/org.eclipse.m2e.core.prefs diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 -- GitLab From 7bb292550c09ac2f1c16a0d893e2e80bb8b01c70 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu <634-db200253@users.noreply.www-apps.univ-lehavre.fr> Date: Wed, 22 Nov 2023 08:20:05 +0000 Subject: [PATCH 05/11] Delete .classpath --- .classpath | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 .classpath diff --git a/.classpath b/.classpath deleted file mode 100644 index 90790b6..0000000 --- a/.classpath +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- GitLab From d85a4fe14ffd764a26b0d05cfdf558adffb658c6 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu <634-db200253@users.noreply.www-apps.univ-lehavre.fr> Date: Wed, 22 Nov 2023 08:20:13 +0000 Subject: [PATCH 06/11] Delete .project --- .project | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 .project diff --git a/.project b/.project deleted file mode 100644 index 3cbcb0f..0000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - Mesure_RI - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - -- GitLab From aa91c49dac7a8fe9bd777ac2eb120e8d006ef35e Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu <634-db200253@users.noreply.www-apps.univ-lehavre.fr> Date: Wed, 22 Nov 2023 10:02:23 +0000 Subject: [PATCH 07/11] Delete degree_distribution.png --- src/main/gp/degree_distribution.png | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/gp/degree_distribution.png diff --git a/src/main/gp/degree_distribution.png b/src/main/gp/degree_distribution.png deleted file mode 100644 index e69de29..0000000 -- GitLab From c6d6c143b3d422830b082ef52dbfa4481a5b1a48 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu Date: Wed, 20 Dec 2023 11:03:11 +0100 Subject: [PATCH 08/11] simul --- src/main/java/Propagation/Epidemie.java | 119 ++++++++++++++++++++++++ src/main/java/Propagation/Main.java | 87 +++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 src/main/java/Propagation/Epidemie.java create mode 100644 src/main/java/Propagation/Main.java diff --git a/src/main/java/Propagation/Epidemie.java b/src/main/java/Propagation/Epidemie.java new file mode 100644 index 0000000..214cbf1 --- /dev/null +++ b/src/main/java/Propagation/Epidemie.java @@ -0,0 +1,119 @@ +package Propagation; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +import org.graphstream.graph.Edge; +import org.graphstream.graph.Graph; +import org.graphstream.graph.Node; + +public class Epidemie { + + final int NOTHING = 0; + final int ALEA = 1; + final int SELECT = 2; + final double TRANSMISSION_PROBABILITY = 1/7; + final double RECOVERY_PROBABILITY = 1/14; + + private static Graph g; + @SuppressWarnings("unused") + private int immune; + private List contamine; + + public Epidemie(Graph graph, int immune) { + + g = graph; + + switch(immune) { + case 0 : this.immune = NOTHING; + case 1 : this.immune = ALEA; + case 2 : this.immune = SELECT; + } + + contamine = new ArrayList<>(); + } + + public void runSimulation(int initialInfectedNodes, int simulationSteps) { + initializeSimulation(initialInfectedNodes); + + for (int step = 0; step < simulationSteps; ++step) { + updateEpidemicState(); + System.out.println("Step " + step + ": Infected Count = " + countInfected()); + } + } + + private void initializeSimulation(int initialInfectedNodes) { + Random random = new Random(); + + for (int i = 0; i < initialInfectedNodes; ++i) { + int randomNode = random.nextInt(g.getNodeCount()); + g.getNode(randomNode).setAttribute("infected", true); + contamine.add(g.getNode(randomNode)); + } + + for (Node node : g) { + + if(!(node.hasAttribute("infected"))) { + + node.setAttribute("infected", false); + } + } + } + + private void updateEpidemicState() { + for (Node node : g) { + boolean infected = (boolean) node.getAttribute("infected"); + + if (infected) { + for (Node neighbor : getNeighbours(node)) { + + boolean neighborInfected = (boolean) neighbor.getAttribute("infected"); + + if (!neighborInfected && getRand() < TRANSMISSION_PROBABILITY) { + + neighbor.setAttribute("infected", true); + contamine.add(neighbor); + } + } + + if (getRand() < RECOVERY_PROBABILITY) { + + node.setAttribute("infected", false); + contamine.remove(node); + } + } + } + } + + private int countInfected() { + + return contamine.size(); + } + + private static List getNeighbours(Node n) { + + List le = n.leavingEdges().collect(Collectors.toList()); + List voisins = new ArrayList<>(); + + for(Edge e : le) { + + voisins.add(e.getOpposite(n)); + } + + return voisins; + } + + public static double getRand() { + + return Math.random(); + } + + public static void go(Graph g, int step, int immune) { + + System.out.println("coucou"); + Epidemie simulation = new Epidemie(g, immune); + simulation.runSimulation(1, step); + } +} diff --git a/src/main/java/Propagation/Main.java b/src/main/java/Propagation/Main.java new file mode 100644 index 0000000..729e143 --- /dev/null +++ b/src/main/java/Propagation/Main.java @@ -0,0 +1,87 @@ +package Propagation; + +import java.io.IOException; + +import org.graphstream.algorithm.Toolkit; +import org.graphstream.graph.Graph; +import org.graphstream.graph.implementations.DefaultGraph; +import org.graphstream.stream.file.FileSource; +import org.graphstream.stream.file.FileSourceEdge; + +public class Main { + + static Graph g = new DefaultGraph("Reseau"); + + public static void main(String[] args) { + + System.setProperty("org.graphstream.ui", "swing"); + String filePath = "src/main/ressources/com-dblp.ungraph.txt"; + FileSource fs = new FileSourceEdge(); + + fs.addSink(g); + + try { + + fs.readAll(filePath); + } catch(IOException e) { + + e.printStackTrace(); + } finally { + + System.out.println("Graphe experimental : "); + printUsefullDatas(); + System.out.println(); + getet(); + System.out.println("------------------------------------------------"); + simulEpid(); + fs.removeSink(g); + } + } + + /** + * Question 1 + * Taux de propagation : proba de transmission (1/7) / taux de guérison (2/30) ~ 2 + * Seuil épidémique : k/k² = 6.62.../144.00... = 0.045... + * Seuil théorique : 1/k+1 => 1/7.62... = 0,1311963 + * Seuil épidémique > taux de propagation donc la maladie progresse + */ + + private static void printUsefullDatas() { + + int nbNodes = g.getNodeCount(); + int nbEdges = g.getEdgeCount(); + double avgDegree = Toolkit.averageDegree(g); + double clusterCoef = Toolkit.averageClusteringCoefficient(g); + + System.out.println("Nombre de noeuds dans le graphe : " + nbNodes); + System.out.println("Nombre de liens dans le graphe : " + nbEdges); + System.out.println("Degré moyen du graphe : " + avgDegree); + System.out.println("Coefficient de clustering moyen du graphe : " + clusterCoef); + } + + private static void getet() { + + int[] distrib = Toolkit.degreeDistribution(g); + + double r = 0.0; + double d = 0.0; + + for(int i = 1; i < distrib.length; ++i) { + + r += i * i * distrib[i]; + d += distrib[i]; + } + + double avgDegree = Toolkit.averageDegree(g); + double sk = r/d; + + System.out.println(" = " + sk); + System.out.println("Seuil épidémique = " + avgDegree/sk); + } + + private static void simulEpid() { + + System.out.println("couco"); + Epidemie.go(g, 12, 0); + } +} \ No newline at end of file -- GitLab From 214d3f85772ad8fa3f103fede052fdaac01ad506 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu Date: Wed, 20 Dec 2023 11:09:49 +0100 Subject: [PATCH 09/11] simul --- .gitignore | 3 ++- src/main/java/Propagation/Epidemie.java | 11 +++++++---- src/main/java/Propagation/Main.java | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 7a3900f..9d6abaa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .settings .classpath -.project \ No newline at end of file +.project +/target/ diff --git a/src/main/java/Propagation/Epidemie.java b/src/main/java/Propagation/Epidemie.java index 214cbf1..e31d776 100644 --- a/src/main/java/Propagation/Epidemie.java +++ b/src/main/java/Propagation/Epidemie.java @@ -3,8 +3,6 @@ package Propagation; import java.util.ArrayList; import java.util.List; import java.util.Random; -import java.util.stream.Collectors; - import org.graphstream.graph.Edge; import org.graphstream.graph.Graph; import org.graphstream.graph.Node; @@ -94,7 +92,13 @@ public class Epidemie { private static List getNeighbours(Node n) { - List le = n.leavingEdges().collect(Collectors.toList()); + List le = new ArrayList<>(); + + for(Edge e : n) { + + le.add(e); + } + List voisins = new ArrayList<>(); for(Edge e : le) { @@ -112,7 +116,6 @@ public class Epidemie { public static void go(Graph g, int step, int immune) { - System.out.println("coucou"); Epidemie simulation = new Epidemie(g, immune); simulation.runSimulation(1, step); } diff --git a/src/main/java/Propagation/Main.java b/src/main/java/Propagation/Main.java index 729e143..2a785a5 100644 --- a/src/main/java/Propagation/Main.java +++ b/src/main/java/Propagation/Main.java @@ -81,7 +81,6 @@ public class Main { private static void simulEpid() { - System.out.println("couco"); Epidemie.go(g, 12, 0); } } \ No newline at end of file -- GitLab From 469bdbef2823cd8ad88f158146878cf72db89721 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu Date: Wed, 20 Dec 2023 11:50:48 +0100 Subject: [PATCH 10/11] simul base --- src/main/java/Propagation/Epidemie.java | 88 +++++++++++++++++++++---- src/main/java/Propagation/Main.java | 3 +- src/main/ressources/select/cases.csv | 1 + 3 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 src/main/ressources/select/cases.csv diff --git a/src/main/java/Propagation/Epidemie.java b/src/main/java/Propagation/Epidemie.java index e31d776..1d61698 100644 --- a/src/main/java/Propagation/Epidemie.java +++ b/src/main/java/Propagation/Epidemie.java @@ -1,5 +1,8 @@ package Propagation; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -12,13 +15,15 @@ public class Epidemie { final int NOTHING = 0; final int ALEA = 1; final int SELECT = 2; - final double TRANSMISSION_PROBABILITY = 1/7; - final double RECOVERY_PROBABILITY = 1/14; + final double TRANSMISSION_PROBABILITY = 0.142857143; + final double RECOVERY_PROBABILITY = 0.071428571; + //final double IMMUNE_PROBABILITY = 0.5; private static Graph g; - @SuppressWarnings("unused") private int immune; + private String of; private List contamine; + //private List immunise; public Epidemie(Graph graph, int immune) { @@ -30,15 +35,43 @@ public class Epidemie { case 2 : this.immune = SELECT; } + switch(immune) { + case 0 : this.of = "src/main/ressources/nothing/cases.csv"; + case 1 : this.of = "src/main/ressources/alea/cases.csv"; + case 2 : this.of = "src/main/ressources/select/cases.csv"; + } + contamine = new ArrayList<>(); + //immunise = new ArrayList<>(); } public void runSimulation(int initialInfectedNodes, int simulationSteps) { initializeSimulation(initialInfectedNodes); for (int step = 0; step < simulationSteps; ++step) { + + int ci = countInfected(); + System.out.println("Step " + step + ": Infected Count = " + ci); + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(of))) { + + writer.write(step + "," + ci + "\n"); + } catch (IOException e) { + + e.printStackTrace(); + } + updateEpidemicState(); - System.out.println("Step " + step + ": Infected Count = " + countInfected()); + } + + System.out.println("Step " + simulationSteps + ": Infected Count = " + countInfected()); + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(of))) { + + writer.write(simulationSteps + "," + countInfected() + "\n"); + } catch (IOException e) { + + e.printStackTrace(); } } @@ -52,8 +85,17 @@ public class Epidemie { } for (Node node : g) { + /* + if(immune == ALEA) { + + if(!(node.hasAttribute("infected")) && Math.random() < IMMUNE_PROBABILITY) { + + node.setAttribute("immune", true); + immunise.add(node); + } + }*/ - if(!(node.hasAttribute("infected"))) { + if(!(node.hasAttribute("infected"))/* && !(immunise.contains(node))*/) { node.setAttribute("infected", false); } @@ -64,24 +106,47 @@ public class Epidemie { for (Node node : g) { boolean infected = (boolean) node.getAttribute("infected"); - if (infected) { + //if(immune == NOTHING) { + + if (infected) { for (Node neighbor : getNeighbours(node)) { boolean neighborInfected = (boolean) neighbor.getAttribute("infected"); - if (!neighborInfected && getRand() < TRANSMISSION_PROBABILITY) { + if (!neighborInfected && Math.random() < TRANSMISSION_PROBABILITY) { neighbor.setAttribute("infected", true); contamine.add(neighbor); } } - if (getRand() < RECOVERY_PROBABILITY) { + if (Math.random() < RECOVERY_PROBABILITY) { node.setAttribute("infected", false); contamine.remove(node); } - } + } + /*}*/ /*else if (immune == ALEA) { + + if (infected) { + for (Node neighbor : getNeighbours(node)) { + + boolean neighborInfected = (boolean) neighbor.getAttribute("infected"); + + if (!neighborInfected && Math.random() < TRANSMISSION_PROBABILITY) { + + neighbor.setAttribute("infected", true); + contamine.add(neighbor); + } + } + + if (Math.random() < RECOVERY_PROBABILITY) { + + node.setAttribute("infected", false); + contamine.remove(node); + } + } + }*/ } } @@ -108,11 +173,6 @@ public class Epidemie { return voisins; } - - public static double getRand() { - - return Math.random(); - } public static void go(Graph g, int step, int immune) { diff --git a/src/main/java/Propagation/Main.java b/src/main/java/Propagation/Main.java index 2a785a5..45f07ec 100644 --- a/src/main/java/Propagation/Main.java +++ b/src/main/java/Propagation/Main.java @@ -81,6 +81,7 @@ public class Main { private static void simulEpid() { - Epidemie.go(g, 12, 0); + Epidemie.go(g, 10, 0); + //Epidemie.go(g, 10, 1); } } \ No newline at end of file diff --git a/src/main/ressources/select/cases.csv b/src/main/ressources/select/cases.csv new file mode 100644 index 0000000..0d69f8a --- /dev/null +++ b/src/main/ressources/select/cases.csv @@ -0,0 +1 @@ +10,165688 -- GitLab From fbec1146b822de6c419215910d76ef46695c68a6 Mon Sep 17 00:00:00 2001 From: Baptiste Duvieu Date: Wed, 20 Dec 2023 11:56:41 +0100 Subject: [PATCH 11/11] debut simul alza --- src/main/java/Propagation/Epidemie.java | 42 +++++++++++++------------ src/main/java/Propagation/Main.java | 3 +- src/main/ressources/alea/cases.csv | 1 + src/main/ressources/nothing/cases.csv | 1 + src/main/ressources/select/cases.csv | 2 +- 5 files changed, 27 insertions(+), 22 deletions(-) create mode 100644 src/main/ressources/alea/cases.csv create mode 100644 src/main/ressources/nothing/cases.csv diff --git a/src/main/java/Propagation/Epidemie.java b/src/main/java/Propagation/Epidemie.java index 1d61698..d7f44a0 100644 --- a/src/main/java/Propagation/Epidemie.java +++ b/src/main/java/Propagation/Epidemie.java @@ -17,32 +17,34 @@ public class Epidemie { final int SELECT = 2; final double TRANSMISSION_PROBABILITY = 0.142857143; final double RECOVERY_PROBABILITY = 0.071428571; - //final double IMMUNE_PROBABILITY = 0.5; + final double IMMUNE_PROBABILITY = 0.5; private static Graph g; private int immune; private String of; private List contamine; - //private List immunise; + private List immunise; public Epidemie(Graph graph, int immune) { g = graph; - switch(immune) { - case 0 : this.immune = NOTHING; - case 1 : this.immune = ALEA; - case 2 : this.immune = SELECT; - } - - switch(immune) { - case 0 : this.of = "src/main/ressources/nothing/cases.csv"; - case 1 : this.of = "src/main/ressources/alea/cases.csv"; - case 2 : this.of = "src/main/ressources/select/cases.csv"; + if(immune == 0) { + + this.immune = NOTHING; + this.of = "src/main/ressources/nothing/cases.csv"; + } else if(immune == 1) { + + this.immune = ALEA; + this.of = "src/main/ressources/alea/cases.csv"; + } else { + + this.immune = SELECT; + this.of = "src/main/ressources/select/cases.csv"; } contamine = new ArrayList<>(); - //immunise = new ArrayList<>(); + immunise = new ArrayList<>(); } public void runSimulation(int initialInfectedNodes, int simulationSteps) { @@ -85,7 +87,7 @@ public class Epidemie { } for (Node node : g) { - /* + if(immune == ALEA) { if(!(node.hasAttribute("infected")) && Math.random() < IMMUNE_PROBABILITY) { @@ -93,9 +95,9 @@ public class Epidemie { node.setAttribute("immune", true); immunise.add(node); } - }*/ + } - if(!(node.hasAttribute("infected"))/* && !(immunise.contains(node))*/) { + if(!(node.hasAttribute("infected")) && !(immunise.contains(node))) { node.setAttribute("infected", false); } @@ -106,7 +108,7 @@ public class Epidemie { for (Node node : g) { boolean infected = (boolean) node.getAttribute("infected"); - //if(immune == NOTHING) { + if(immune == NOTHING) { if (infected) { for (Node neighbor : getNeighbours(node)) { @@ -126,14 +128,14 @@ public class Epidemie { contamine.remove(node); } } - /*}*/ /*else if (immune == ALEA) { + } else if (immune == ALEA) { if (infected) { for (Node neighbor : getNeighbours(node)) { boolean neighborInfected = (boolean) neighbor.getAttribute("infected"); - if (!neighborInfected && Math.random() < TRANSMISSION_PROBABILITY) { + if (!neighborInfected && !(immunise.contains(neighbor)) && Math.random() < TRANSMISSION_PROBABILITY) { neighbor.setAttribute("infected", true); contamine.add(neighbor); @@ -146,7 +148,7 @@ public class Epidemie { contamine.remove(node); } } - }*/ + } } } diff --git a/src/main/java/Propagation/Main.java b/src/main/java/Propagation/Main.java index 45f07ec..1256dbe 100644 --- a/src/main/java/Propagation/Main.java +++ b/src/main/java/Propagation/Main.java @@ -82,6 +82,7 @@ public class Main { private static void simulEpid() { Epidemie.go(g, 10, 0); - //Epidemie.go(g, 10, 1); + System.out.println(); + Epidemie.go(g, 10, 1); } } \ No newline at end of file diff --git a/src/main/ressources/alea/cases.csv b/src/main/ressources/alea/cases.csv new file mode 100644 index 0000000..2ba37de --- /dev/null +++ b/src/main/ressources/alea/cases.csv @@ -0,0 +1 @@ +10,202785 diff --git a/src/main/ressources/nothing/cases.csv b/src/main/ressources/nothing/cases.csv new file mode 100644 index 0000000..d4d3279 --- /dev/null +++ b/src/main/ressources/nothing/cases.csv @@ -0,0 +1 @@ +10,98832 diff --git a/src/main/ressources/select/cases.csv b/src/main/ressources/select/cases.csv index 0d69f8a..8eaf110 100644 --- a/src/main/ressources/select/cases.csv +++ b/src/main/ressources/select/cases.csv @@ -1 +1 @@ -10,165688 +10,1 -- GitLab