+
+
+
+
diff --git a/examples/network/basicUsage.html b/examples/network/basicUsage.html
new file mode 100644
index 0000000000..d92d0019bc
--- /dev/null
+++ b/examples/network/basicUsage.html
@@ -0,0 +1,56 @@
+
+
+
+
Network | Basic usage
+
+
+
+
+
+
+
+
+
+ Create a simple network with some nodes and edges.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/data/datasets.html b/examples/network/data/datasets.html
new file mode 100644
index 0000000000..4986aafd88
--- /dev/null
+++ b/examples/network/data/datasets.html
@@ -0,0 +1,140 @@
+
+
+
+
Network | Dynamic Data
+
+
+
+
+
+
+
+
+ You can change any settings you want while the network is initialized using the vis Dataset, setOptions and setData. Finally you can destroy the network and completely reinitialize it.
+
+
+
DataSet (change the data while it's loaded and initialzed):
+
+
+
+
+
+
+
setOptions (change the global options):
+
+
+
setData (reinitialize the data):
+
+
+
Cleanly destroy the network and restart it:
+
+
+
+
+
+
+
+
diff --git a/examples/network/data/dotLanguage/data/cellular_automata.gv.txt b/examples/network/data/dotLanguage/data/cellular_automata.gv.txt
new file mode 100644
index 0000000000..5e48093fa2
--- /dev/null
+++ b/examples/network/data/dotLanguage/data/cellular_automata.gv.txt
@@ -0,0 +1,23 @@
+digraph G {
+ // note: not all attributes are recognized and supported by Network
+ // unrecognized attributes are ignored
+
+ node[width=.25,height=.375,fontsize=15]
+ node [shape=filled color=#FF00FF fillcolor=#F1AAF0]
+ 0-> 0 ;
+ 1-> 1 ;
+ 2-> 2 ;
+ 3-> 3 ;
+ 4-> 4 ;
+ 5-> 5 ;
+ 6-> 6 ;
+ 7-> 5 ;
+ 8-> 8 ;
+ 9-> 9 ;
+ 10-> 10 ;
+ 11-> 10 ;
+ 12-> 12 ;
+ 13-> 5 ;
+ 14-> 10 ;
+ 15-> 0 ;
+}
diff --git a/examples/network/data/dotLanguage/data/computer_network.gv.txt b/examples/network/data/dotLanguage/data/computer_network.gv.txt
new file mode 100644
index 0000000000..cd49095c89
--- /dev/null
+++ b/examples/network/data/dotLanguage/data/computer_network.gv.txt
@@ -0,0 +1,19 @@
+digraph topology
+{
+ node[shape=circle fontsize=12]
+ edge[length=170 fontsize=12]
+ "10.0.255.1" -> "10.0.255.3"[label="1.000"];
+ "10.0.255.1" -> "10.0.255.2"[label="1.000"];
+ "10.0.255.1" -> "10.0.255.2"[label="1.000"];
+ "10.0.255.1" -> "10.0.255.3"[label="1.000"];
+ "10.0.255.2" -> "10.0.255.1"[label="1.000"];
+ "10.0.255.2" -> "10.0.255.3"[label="1.000"];
+ "10.0.255.3" -> "10.0.255.1"[label="1.000"];
+ "10.0.255.3" -> "10.0.255.2"[label="1.000"];
+ "10.0.255.3" -> "10.0.3.0/24"[label="HNA", shape=solid];
+ "10.0.3.0/24"[shape=box];
+ "10.0.255.2" -> "10.0.2.0/24"[label="HNA"];
+ "10.0.2.0/24"[shape=box];
+ "10.0.255.1" -> "10.0.1.0/24"[label="HNA"];
+ "10.0.1.0/24"[shape=box];
+}
diff --git a/examples/network/data/dotLanguage/data/simple.gv.txt b/examples/network/data/dotLanguage/data/simple.gv.txt
new file mode 100644
index 0000000000..50fb06e3ef
--- /dev/null
+++ b/examples/network/data/dotLanguage/data/simple.gv.txt
@@ -0,0 +1,15 @@
+digraph {
+ node [shape=circle fontsize=16]
+ edge [length=100, color=gray, fontcolor=black]
+
+ A -> A[label=0.5];
+ B -> B[label=1.2] -> C[label=0.7] -- A;
+ B -> D;
+ D -> {B; C}
+ D -> E[label=0.2];
+ F -> F;
+ A [
+ fontcolor=white,
+ color=red,
+ ]
+}
diff --git a/examples/network/data/dotLanguage/dotEdgeStyles.html b/examples/network/data/dotLanguage/dotEdgeStyles.html
new file mode 100644
index 0000000000..b9584db496
--- /dev/null
+++ b/examples/network/data/dotLanguage/dotEdgeStyles.html
@@ -0,0 +1,231 @@
+
+
+
+
Network | DOT edge styles
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draw
+ Reset
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/data/dotLanguage/dotLanguage.html b/examples/network/data/dotLanguage/dotLanguage.html
new file mode 100644
index 0000000000..80c9f9b126
--- /dev/null
+++ b/examples/network/data/dotLanguage/dotLanguage.html
@@ -0,0 +1,22 @@
+
+
+
Network | DOT Language
+
+
+
+
+
+
+
+ Network supports the DOT language.
+
+
+
+
+
+
diff --git a/examples/network/data/dotLanguage/dotPlayground.html b/examples/network/data/dotLanguage/dotPlayground.html
new file mode 100644
index 0000000000..e193f90557
--- /dev/null
+++ b/examples/network/data/dotLanguage/dotPlayground.html
@@ -0,0 +1,216 @@
+
+
+
+
Network | DOT language playground
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/data/dotLanguage/graphvizGallery/fsm.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/fsm.gv.txt
new file mode 100644
index 0000000000..e59b7c2dc3
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/fsm.gv.txt
@@ -0,0 +1,20 @@
+digraph finite_state_machine {
+ rankdir=LR;
+ size="8,5"
+ node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
+ node [shape = circle];
+ LR_0 -> LR_2 [ label = "SS(B)" ];
+ LR_0 -> LR_1 [ label = "SS(S)" ];
+ LR_1 -> LR_3 [ label = "S($end)" ];
+ LR_2 -> LR_6 [ label = "SS(b)" ];
+ LR_2 -> LR_5 [ label = "SS(a)" ];
+ LR_2 -> LR_4 [ label = "S(A)" ];
+ LR_5 -> LR_7 [ label = "S(b)" ];
+ LR_5 -> LR_5 [ label = "S(a)" ];
+ LR_6 -> LR_6 [ label = "S(b)" ];
+ LR_6 -> LR_5 [ label = "S(a)" ];
+ LR_7 -> LR_8 [ label = "S(b)" ];
+ LR_7 -> LR_5 [ label = "S(a)" ];
+ LR_8 -> LR_6 [ label = "S(b)" ];
+ LR_8 -> LR_5 [ label = "S(a)" ];
+}
diff --git a/examples/network/data/dotLanguage/graphvizGallery/hello.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/hello.gv.txt
new file mode 100644
index 0000000000..7bc71ff4e4
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/hello.gv.txt
@@ -0,0 +1 @@
+digraph G {Hello->World}
\ No newline at end of file
diff --git a/examples/network/data/dotLanguage/graphvizGallery/process.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/process.gv.txt
new file mode 100644
index 0000000000..34fe9fb5aa
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/process.gv.txt
@@ -0,0 +1,15 @@
+graph G {
+ run -- intr;
+ intr -- runbl;
+ runbl -- run;
+ run -- kernel;
+ kernel -- zombie;
+ kernel -- sleep;
+ kernel -- runmem;
+ sleep -- swap;
+ swap -- runswap;
+ runswap -- new;
+ runswap -- runmem;
+ new -- runmem;
+ sleep -- runmem;
+}
diff --git a/examples/network/data/dotLanguage/graphvizGallery/screenshots/fsm.png b/examples/network/data/dotLanguage/graphvizGallery/screenshots/fsm.png
new file mode 100644
index 0000000000..544b8ed68b
Binary files /dev/null and b/examples/network/data/dotLanguage/graphvizGallery/screenshots/fsm.png differ
diff --git a/examples/network/data/dotLanguage/graphvizGallery/screenshots/hello.png b/examples/network/data/dotLanguage/graphvizGallery/screenshots/hello.png
new file mode 100644
index 0000000000..532a7d8835
Binary files /dev/null and b/examples/network/data/dotLanguage/graphvizGallery/screenshots/hello.png differ
diff --git a/examples/network/data/dotLanguage/graphvizGallery/screenshots/softmaint.png b/examples/network/data/dotLanguage/graphvizGallery/screenshots/softmaint.png
new file mode 100644
index 0000000000..9aacc6128e
Binary files /dev/null and b/examples/network/data/dotLanguage/graphvizGallery/screenshots/softmaint.png differ
diff --git a/examples/network/data/dotLanguage/graphvizGallery/screenshots/traffic_lights.png b/examples/network/data/dotLanguage/graphvizGallery/screenshots/traffic_lights.png
new file mode 100644
index 0000000000..237016a632
Binary files /dev/null and b/examples/network/data/dotLanguage/graphvizGallery/screenshots/traffic_lights.png differ
diff --git a/examples/network/data/dotLanguage/graphvizGallery/siblings.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/siblings.gv.txt
new file mode 100644
index 0000000000..e6628dfcfc
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/siblings.gv.txt
@@ -0,0 +1,512 @@
+/*
+This is a graphviz-produced layout of the "family tree" of a fraternity and sorority.
+
+Each member in the graph was assigned a "big brother" from one organization and a "big sister" from the other. Blue icons represent Brothers from the fraternity, Pink represents Sisters from the sorority (Purple members are in both organizations - like honoraries.)
+
+Charter members (who can have no parent nodes) are outlined.
+
+...
+
+dot -Tgif -Goverlap=false -o siblings.gif siblings.dot
+
+
+We're experimenting with different ways of coloring and graphing, but found this the easiest for now. When we have more people in, we might look at different shades depending on generation number -- earlier people would get lighter colors, more recent members darker. Thumbnail images would be an interesting alteration as well.
+
+from Japheth Cleaver
+*/
+
+
+digraph sdsu {
+ size="36,36";
+ node [color=grey, style=filled];
+ node [fontname="Verdana", size="30,30"];
+ graph [ fontname = "Arial",
+ fontsize = 36,
+ style = "bold",
+ label = "\nKappa Kappa Psi/Tau Beta Sigma\nSan Diego State University\nEta Mu and Zeta Xi Family Tree\n\nto date: November 30th, 2008\n",
+ ssize = "30,60" ];
+"Lori Brede" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=10"];
+"Michael Griffith" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=24"];
+"Amie Holston" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=30"];
+"Michael Griffith" -> "Lori Brede"
+"Amie Holston" -> "Lori Brede"
+"Casey Carter" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=11"];
+"Laura De'Armond" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=14"];
+"Laura De'Armond" -> "Casey Carter"
+"Japheth Cleaver" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=12"];
+"Chuk Gawlik" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=22"];
+"Stacy Snyder" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=309"];
+"Chuk Gawlik" -> "Japheth Cleaver"
+"Stacy Snyder" -> "Japheth Cleaver"
+"Jillian Clifton" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=13"];
+"David Guthrie" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=25"];
+"David Guthrie" -> "Jillian Clifton"
+"Japheth Cleaver" -> "Jillian Clifton"
+"Tony Sacco" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=55"];
+"Heather Smith" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=59"];
+"Tony Sacco" -> "Laura De'Armond"
+"Heather Smith" -> "Laura De'Armond"
+"Kevin Decker" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=15"];
+"Alex Hansen" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=26"];
+"Wanda Livelsberger" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=53"];
+"Alex Hansen" -> "Kevin Decker"
+"Wanda Livelsberger" -> "Kevin Decker"
+"Patrick Doerr" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=16"];
+"Deanna Jagow" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=23"];
+"Alex Hansen" -> "Patrick Doerr"
+"Deanna Jagow" -> "Patrick Doerr"
+"Lori Asaro" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=178"];
+"Mark Pearson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=169"];
+"Lori Ball" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=167"];
+"Mark Pearson" -> "Lori Asaro"
+"Lori Ball" -> "Lori Asaro"
+"Ryan Farris" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=18"];
+"Rob Reiner" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=51"];
+"Cindy Teel" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=62"];
+"Rob Reiner" -> "Ryan Farris"
+"Cindy Teel" -> "Ryan Farris"
+"Ginger Palmer" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=180"];
+"Mark Newton-John" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=46"];
+"Mark Newton-John" -> "Ginger Palmer"
+"Matthew FitzGerald" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=19"];
+"Mervin Maniago" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=41"];
+"Mervin Maniago" -> "Matthew FitzGerald"
+"Amie Holston" -> "Matthew FitzGerald"
+"Tani Miller" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=195"];
+"Mark Pearson" -> "Tani Miller"
+"Vienna McMurtry" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=196"];
+"Robert Walwick" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=153"];
+"Robert Walwick" -> "Vienna McMurtry"
+"Ginger Palmer" -> "Vienna McMurtry"
+"Chuck Foster" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=20"];
+"Karen Saye" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=56"];
+"Kevin Decker" -> "Chuck Foster"
+"Karen Saye" -> "Chuck Foster"
+"Gary Frampton" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=201"];
+"Ginger Palmer" -> "Gary Frampton"
+"Pat Norris" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=207"];
+"Sean Tipps" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=204"];
+"Teresa Long" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=194"];
+"Sean Tipps" -> "Pat Norris"
+"Teresa Long" -> "Pat Norris"
+"Marc Martin-ez" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=208"];
+"Mark Pearson" -> "Marc Martin-ez"
+"Tani Miller" -> "Marc Martin-ez"
+"Kristen Villone" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=209"];
+"Kelly Erickson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=199"];
+"Anna Pedroza" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=197"];
+"Kelly Erickson" -> "Kristen Villone"
+"Anna Pedroza" -> "Kristen Villone"
+"Geoff Frank" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=21"];
+"Chris Livelsberger" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=40"];
+"Amy Price" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=57"];
+"Chris Livelsberger" -> "Geoff Frank"
+"Amy Price" -> "Geoff Frank"
+"Tracy Murray" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=210"];
+"John FitzGibbon" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=92"];
+"Judy Dulcich" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=177"];
+"John FitzGibbon" -> "Tracy Murray"
+"Judy Dulcich" -> "Tracy Murray"
+"Ian McIntosh" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=215"];
+"Barbara Tollison" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=172"];
+"Robert Walwick" -> "Ian McIntosh"
+"Barbara Tollison" -> "Ian McIntosh"
+"Jayson Smith" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=58"];
+"Jayson Smith" -> "Chuk Gawlik"
+"Heather Smith" -> "Chuk Gawlik"
+"Kelly McKinney" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=222"];
+"Mark Nadeau" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=183"];
+"Mark Nadeau" -> "Kelly McKinney"
+"Judy Dulcich" -> "Kelly McKinney"
+"Chris Livelsberger" -> "Deanna Jagow"
+"Amy Price" -> "Deanna Jagow"
+"Renee Thompson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=231"];
+"J. Angeles" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=3"];
+"Kelley Smith" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=223"];
+"J. Angeles" -> "Renee Thompson"
+"Kelley Smith" -> "Renee Thompson"
+"Steven Smith" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=233"];
+"John FitzGibbon" -> "Steven Smith"
+"Charlene Andrews" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=234"];
+"Diane Reoch" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=227"];
+"Diane Reoch" -> "Charlene Andrews"
+"Tonya Alexander" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=238"];
+"Gail Vasquez" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=225"];
+"Gail Vasquez" -> "Tonya Alexander"
+"Spencer Caldwell" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=239"];
+"Becky Bernal" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=218"];
+"Becky Bernal" -> "Spencer Caldwell"
+"Chuk Gawlik" -> "Michael Griffith"
+"Wanda Livelsberger" -> "Michael Griffith"
+"Russell Grant" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=242"];
+"Steven Smith" -> "Russell Grant"
+"Tiffany Worthington" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=66"];
+"Chuck Foster" -> "David Guthrie"
+"Tiffany Worthington" -> "David Guthrie"
+"Jerry Maya" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=250"];
+"John FitzGibbon" -> "Jerry Maya"
+"Melissa Schwartz" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=252"];
+"Russell Grant" -> "Melissa Schwartz"
+"Delphy Shaulis" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=255"];
+"Renee Thompson" -> "Delphy Shaulis"
+"Martin Naiman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=45"];
+"Janean Angeles" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=86"];
+"Martin Naiman" -> "Alex Hansen"
+"Janean Angeles" -> "Alex Hansen"
+"Leslie Harlow" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=265"];
+"Dennis McColl" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=251"];
+"Denise Luna" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=236"];
+"Dennis McColl" -> "Leslie Harlow"
+"Denise Luna" -> "Leslie Harlow"
+"Jonathan Yudman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=267"];
+"April Ortiz-cloninger" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=258"];
+"April Ortiz-cloninger" -> "Jonathan Yudman"
+"Michael Elgo" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=268"];
+"Carol Kropp" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=254"];
+"Spencer Caldwell" -> "Michael Elgo"
+"Carol Kropp" -> "Michael Elgo"
+"Denmark Vea" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=269"];
+"Marc Martin-ez" -> "Denmark Vea"
+"Kelley Smith" -> "Denmark Vea"
+"Kathleen Hansen" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=27"];
+"Martin Naiman" -> "Kathleen Hansen"
+"Heather Smith" -> "Kathleen Hansen"
+"Laura Stegner" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=274"];
+"April Ortiz-cloninger" -> "Laura Stegner"
+"Kathy Jones" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=28"];
+"J. Angeles" -> "Kathy Jones"
+"Eric Gates" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=282"];
+"Erick Sugimura" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=280"];
+"Erick Sugimura" -> "Eric Gates"
+"Laura Stegner" -> "Eric Gates"
+"Jennifer Stoewe" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=288"];
+"Eric Gates" -> "Jennifer Stoewe"
+"Karen Helbling" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=29"];
+"Regan Ashker" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=5"];
+"Kevin Decker" -> "Karen Helbling"
+"Regan Ashker" -> "Karen Helbling"
+"Scott Wood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=295"];
+"Eric Gates" -> "Scott Wood"
+"Greg Flood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=200"];
+"Greg Flood" -> "J. Angeles"
+"Ginger Palmer" -> "J. Angeles"
+"Lynn Reeves" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=48"];
+"Chuk Gawlik" -> "Amie Holston"
+"Lynn Reeves" -> "Amie Holston"
+"Susan Colwell" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=302"];
+"Michael Elgo" -> "Susan Colwell"
+"Christopher Jouan" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=306"];
+"Kevin Owens" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=245"];
+"Kevin Owens" -> "Christopher Jouan"
+"Kristianna Reynante" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=308"];
+"Michael Elgo" -> "Kristianna Reynante"
+"Janean Angeles" -> "Kristianna Reynante"
+"Amy Berner" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=300"];
+"Amy Berner" -> "Stacy Snyder"
+"Deanna Johnson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=31"];
+"Alex Hansen" -> "Deanna Johnson"
+"Laura De'Armond" -> "Deanna Johnson"
+"Johnny Richardson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=310"];
+"Russell Grant" -> "Johnny Richardson"
+"Nathan Fellhauer" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=313"];
+"James Rowland" [color=thistle, URL="http://sdsu.kkytbs.net/members/profile.html?who=52"];
+"James Rowland" -> "Nathan Fellhauer"
+"Kristianna Reynante" -> "Nathan Fellhauer"
+"Brian Raneses" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=314"];
+"Sean McHenry" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=42"];
+"Sean McHenry" -> "Brian Raneses"
+"Penny Lewis" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=315"];
+"Martin Naiman" -> "Penny Lewis"
+"Becky Graham" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=316"];
+"Kristen Elgo" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=7"];
+"Kristen Elgo" -> "Becky Graham"
+"Steven Gross" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=318"];
+"Rob Reiner" -> "Steven Gross"
+"Stacy Snyder" -> "Steven Gross"
+"Sedona Reynolds" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=32"];
+"Mark Newton-John" -> "Sedona Reynolds"
+"Cindy Teel" -> "Sedona Reynolds"
+"Klair Mayerchak" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=320"];
+"Nathan Fellhauer" -> "Klair Mayerchak"
+"Becky Graham" -> "Klair Mayerchak"
+"Shari VerBerkmoes" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=321"];
+"Sean McHenry" -> "Shari VerBerkmoes"
+"Janean Angeles" -> "Shari VerBerkmoes"
+"Anson Summers" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=326"];
+"James Rowland" -> "Anson Summers"
+"Dusty Jolliff" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=33"];
+"Rob Reiner" -> "Dusty Jolliff"
+"Stacy Snyder" -> "Dusty Jolliff"
+"Jennifer Garman" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=331"];
+"James Rowland" -> "Jennifer Garman"
+"Kelly Greenhill" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=333"];
+"Rob Reiner" -> "Kelly Greenhill"
+"Kristen Elgo" -> "Kelly Greenhill"
+"Lucinda Farless" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=334"];
+"J. Angeles" -> "Lucinda Farless"
+"Susan Colwell" -> "Lucinda Farless"
+"Alfredo Cardenas" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=335"];
+"Chuk Gawlik" -> "Alfredo Cardenas"
+"Kathleen Hansen" -> "Alfredo Cardenas"
+"Jennifer Jouan" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=34"];
+"Andrea Owens" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=276"];
+"Andrea Owens" -> "Jennifer Jouan"
+"Tamara Scrivner" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=345"];
+"Joseph Butler" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=69"];
+"Sarah Maltese" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=83"];
+"Joseph Butler" -> "Tamara Scrivner"
+"Sarah Maltese" -> "Tamara Scrivner"
+"Bradley Stouse" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=346"];
+"Ryan Underwood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=74"];
+"Ryan Underwood" -> "Bradley Stouse"
+"Cindy Teel" -> "Bradley Stouse"
+"Casondra Brimmage" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=347"];
+"Kristopher Lininger" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=85"];
+"Ilana Melcher" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=73"];
+"Kristopher Lininger" -> "Casondra Brimmage"
+"Ilana Melcher" -> "Casondra Brimmage"
+"Cassiopeia Guthrie" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=348"];
+"Jeremy Frazier" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=79"];
+"Christine Mount" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=76"];
+"Jeremy Frazier" -> "Cassiopeia Guthrie"
+"Christine Mount" -> "Cassiopeia Guthrie"
+"Kathleen Moran" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=349"];
+"Matthew FitzGerald" -> "Kathleen Moran"
+"Lori Brede" -> "Kathleen Moran"
+"Tiffany Kalland" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=35"];
+"Tony Sacco" -> "Tiffany Kalland"
+"Karen Helbling" -> "Tiffany Kalland"
+"Kristen Anderson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=350"];
+"Jennie Bogart" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=78"];
+"David Guthrie" -> "Kristen Anderson"
+"Jennie Bogart" -> "Kristen Anderson"
+"Laura Simonette" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=351"];
+"Jon Weisel" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=89"];
+"Jon Weisel" -> "Laura Simonette"
+"Japheth Cleaver" -> "Laura Simonette"
+"Nathan Williams" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=352"];
+"David Guthrie" -> "Nathan Williams"
+"Karen Helbling" -> "Nathan Williams"
+"Rebecca Hippert" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=353"];
+"Ryan Underwood" -> "Rebecca Hippert"
+"Tiffany Kalland" -> "Rebecca Hippert"
+"Samuel Wallace" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=354"];
+"Joseph Butler" -> "Samuel Wallace"
+"Deanna Jagow" -> "Samuel Wallace"
+"Scott Gardner" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=355"];
+"Jeremy Frazier" -> "Scott Gardner"
+"Christine Mount" -> "Scott Gardner"
+"Alberto Ayon" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=356"];
+"Bradley Stouse" -> "Alberto Ayon"
+"Jennie Bogart" -> "Alberto Ayon"
+"Susannah Clayton" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=357"];
+"Nathan Williams" -> "Susannah Clayton"
+"Karen Helbling" -> "Susannah Clayton"
+"Lisa Gochnauer" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=358"];
+"Scott Gardner" -> "Lisa Gochnauer"
+"Casondra Brimmage" -> "Lisa Gochnauer"
+"Jamie Jackson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=359"];
+"Samuel Wallace" -> "Jamie Jackson"
+"Tamara Scrivner" -> "Jamie Jackson"
+"Christina Kelly" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=36"];
+"Matthew FitzGerald" -> "Christina Kelly"
+"Lori Brede" -> "Christina Kelly"
+"Gara Thornton" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=360"];
+"Mark Newton-John" -> "Gara Thornton"
+"Laura Simonette" -> "Gara Thornton"
+"Robert Winebarger" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=361"];
+"Robin Ellison" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=90"];
+"Scott Gardner" -> "Robert Winebarger"
+"Robin Ellison" -> "Robert Winebarger"
+"Jeremy Kirchner" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=37"];
+"Rob Reiner" -> "Jeremy Kirchner"
+"Sandy Konar" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=38"];
+"Jennifer Brandon" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=9"];
+"Jennifer Brandon" -> "Sandy Konar"
+"Dan Kuhlman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=39"];
+"Rob Reiner" -> "Dan Kuhlman"
+"Dusty Jolliff" -> "Dan Kuhlman"
+"Lindsay Arehart" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=4"];
+"Martin Naiman" -> "Lindsay Arehart"
+"Jennifer Brandon" -> "Lindsay Arehart"
+"J. Angeles" -> "Mervin Maniago"
+"Kathy Jones" -> "Mervin Maniago"
+"Jarrod Monroe" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=43"];
+"Jamie Fratacci" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=44"];
+"Mark Newton-John" -> "Jarrod Monroe"
+"Jamie Fratacci" -> "Jarrod Monroe"
+"Chuk Gawlik" -> "Jamie Fratacci"
+"Tiffany Worthington" -> "Jamie Fratacci"
+"Russell Grant" -> "Martin Naiman"
+"Tonya Alexander" -> "Martin Naiman"
+"Edward Givens" [color=lightblue, outline=bold, style=bold, URL="http://sdsu.kkytbs.net/members/profile.html?who=106"];
+"Edward Givens" -> "Mark Newton-John"
+"Veronica Nickel" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=47"];
+"Regan Ashker" -> "Veronica Nickel"
+"Wanda Livelsberger" -> "Lynn Reeves"
+"Bryan Ransom" [color=thistle, URL="http://sdsu.kkytbs.net/members/profile.html?who=49"];
+"Jayson Smith" -> "Bryan Ransom"
+"Tony Sacco" -> "Regan Ashker"
+"Dusty Jolliff" -> "Regan Ashker"
+"Jennifer Stout" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=50"];
+"Matthew FitzGerald" -> "Jennifer Stout"
+"Deanna Jagow" -> "Jennifer Stout"
+"Sean McHenry" -> "James Rowland"
+"James Rowland" -> "Wanda Livelsberger"
+"Janean Angeles" -> "Wanda Livelsberger"
+"Melissa Roy" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=54"];
+"Mervin Maniago" -> "Melissa Roy"
+"Christina Kelly" -> "Melissa Roy"
+"Dennis McColl" -> "Tony Sacco"
+"April Ortiz-cloninger" -> "Tony Sacco"
+"Tony Sacco" -> "Karen Saye"
+"Tony Sacco" -> "Amy Price"
+"Kathleen Hansen" -> "Amy Price"
+"James Rowland" -> "Jayson Smith"
+"Brian Raneses" -> "Heather Smith"
+"Kristen Elgo" -> "Heather Smith"
+"Josh Atwood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=6"];
+"David Guthrie" -> "Josh Atwood"
+"Lori Brede" -> "Josh Atwood"
+"Katie Browne" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=60"];
+"Patrick Doerr" -> "Katie Browne"
+"Jamie Fratacci" -> "Katie Browne"
+"Kristin Tang" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=61"];
+"James Rowland" -> "Kristin Tang"
+"Heather Smith" -> "Kristin Tang"
+"Mervin Maniago" -> "Cindy Teel"
+"Veronica Nickel" -> "Cindy Teel"
+"Mike Tulumello" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=63"];
+"Matthew FitzGerald" -> "Mike Tulumello"
+"Katie Browne" -> "Mike Tulumello"
+"Veronica Villanueva" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=64"];
+"Ryan Farris" -> "Veronica Villanueva"
+"Sedona Reynolds" -> "Veronica Villanueva"
+"Mervin Maniago" -> "Tiffany Worthington"
+"Jennifer Jouan" -> "Tiffany Worthington"
+"Scott Wright" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=67"];
+"James Rowland" -> "Scott Wright"
+"Kristen Elgo" -> "Scott Wright"
+"Jeremy Browne" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=68"];
+"Matthew FitzGerald" -> "Jeremy Browne"
+"Japheth Cleaver" -> "Jeremy Browne"
+"James Fogelman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=688"];
+"Alberto Ayon" -> "James Fogelman"
+"Susannah Clayton" -> "James Fogelman"
+"Sandra Chase" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=689"];
+"David Guthrie" -> "Sandra Chase"
+"Japheth Cleaver" -> "Sandra Chase"
+"Patrick Doerr" -> "Joseph Butler"
+"Deanna Jagow" -> "Joseph Butler"
+"Laura Fisher" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=690"];
+"Nathan Williams" -> "Laura Fisher"
+"Casondra Brimmage" -> "Laura Fisher"
+"Katie Kozma" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=691"];
+"Scott Wright" -> "Katie Kozma"
+"Robin Ellison" -> "Katie Kozma"
+"Rachel Perkins" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=692"];
+"Joseph Butler" -> "Rachel Perkins"
+"Cassiopeia Guthrie" -> "Rachel Perkins"
+"Sarah Titilah" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=693"];
+"Robert Winebarger" -> "Sarah Titilah"
+"Karen Helbling" -> "Sarah Titilah"
+"Ashley Rehart" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=694"];
+"Laura Fisher" -> "Ashley Rehart"
+"Cara Yancey" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=695"];
+"Katie Kozma" -> "Cara Yancey"
+"Ashley Presley" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=698"];
+"Cara Yancey" -> "Ashley Presley"
+"Leila Wilhelm" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=699"];
+"Robin Ellison" -> "Leila Wilhelm"
+"Sean McHenry" -> "Kristen Elgo"
+"Stacy Snyder" -> "Kristen Elgo"
+"Greg Moody" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=70"];
+"Ryan Farris" -> "Greg Moody"
+"Jennifer Stout" -> "Greg Moody"
+"Lisa Fleck" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=700"];
+"Rachel Perkins" -> "Lisa Fleck"
+"Christine Coyne" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=701"];
+"Rachel Perkins" -> "Christine Coyne"
+"Jennifer Cooley" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=702"];
+"Laura Fisher" -> "Jennifer Cooley"
+"Elizabeth Larios" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=703"];
+"Ashley Rehart" -> "Elizabeth Larios"
+"Cate Threlkeld" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=707"];
+"Katie Kozma" -> "Cate Threlkeld"
+"Erika Tapia" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=71"];
+"Patrick Doerr" -> "Erika Tapia"
+"Melissa Roy" -> "Erika Tapia"
+"Robbyn Rozelle" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=72"];
+"Jarrod Monroe" -> "Robbyn Rozelle"
+"Tiffany Kalland" -> "Robbyn Rozelle"
+"Ryan Farris" -> "Ilana Melcher"
+"Veronica Villanueva" -> "Ilana Melcher"
+"Greg Moody" -> "Ryan Underwood"
+"Katie Browne" -> "Ryan Underwood"
+"Cameron Brown" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=75"];
+"Joseph Butler" -> "Cameron Brown"
+"Tiffany Kalland" -> "Cameron Brown"
+"Ryan Underwood" -> "Christine Mount"
+"Lori Brede" -> "Christine Mount"
+"Janay Rabe" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=77"];
+"Greg Moody" -> "Janay Rabe"
+"Cindy Teel" -> "Janay Rabe"
+"Jeremy Browne" -> "Jennie Bogart"
+"Tiffany Kalland" -> "Jennie Bogart"
+"Ryan Farris" -> "Jeremy Frazier"
+"Ilana Melcher" -> "Jeremy Frazier"
+"Crystal Bozak" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=8"];
+"Patrick Doerr" -> "Crystal Bozak"
+"Katie Browne" -> "Crystal Bozak"
+"Kameka Smith" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=80"];
+"Matthew FitzGerald" -> "Kameka Smith"
+"Ilana Melcher" -> "Kameka Smith"
+"Kyra Sacco" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=81"];
+"Joseph Butler" -> "Kyra Sacco"
+"Robbyn Rozelle" -> "Kyra Sacco"
+"Samuel Behar" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=82"];
+"Ryan Underwood" -> "Samuel Behar"
+"Lori Brede" -> "Samuel Behar"
+"Patrick Doerr" -> "Sarah Maltese"
+"Deanna Jagow" -> "Sarah Maltese"
+"David Bronson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=84"];
+"Kristin Alongi-Hutchins" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=87"];
+"Tony Sacco" -> "David Bronson"
+"Kristin Alongi-Hutchins" -> "David Bronson"
+"Cameron Brown" -> "Kristopher Lininger"
+"Kameka Smith" -> "Kristopher Lininger"
+"Rakan Abu-Rahma" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=852"];
+"Christine Coyne" -> "Rakan Abu-Rahma"
+"Jennifer Berry" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=270"];
+"Jennifer Berry" -> "Janean Angeles"
+"Penny Lewis" -> "Kristin Alongi-Hutchins"
+"Melissa Bebak" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=88"];
+"Greg Moody" -> "Melissa Bebak"
+"Sarah Maltese" -> "Melissa Bebak"
+"Scott Wright" -> "Jennifer Brandon"
+"Japheth Cleaver" -> "Jennifer Brandon"
+"Samuel Behar" -> "Robin Ellison"
+"Kyra Sacco" -> "Robin Ellison"
+"Teresa Simms" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=91"];
+"Joseph Butler" -> "Teresa Simms"
+"Janay Rabe" -> "Teresa Simms"
+"Robert Schmidtke" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=188"];
+"Jean Newman" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=166"];
+"Robert Schmidtke" -> "John FitzGibbon"
+"Jean Newman" -> "John FitzGibbon"
+"Brittany DePew" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=928"];
+"Elizabeth Larios" -> "Brittany DePew"
+"Kathleen Halberg" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=929"];
+"Ashley Rehart" -> "Kathleen Halberg"
+"Terrance Hirsch" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=96"];
+"J. Angeles" -> "Terrance Hirsch"
+"Susan Colwell" -> "Terrance Hirsch"
+"Monique Arellano" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=972"];
+"Ashley Presley" -> "Monique Arellano"
+"Anthony Henderson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=973"];
+"Jennifer Cooley" -> "Anthony Henderson"
+"Amethyst Tagle" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=974"];
+"Cate Threlkeld" -> "Amethyst Tagle"
+"Mallory Williams" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=975"];
+"Lisa Fleck" -> "Mallory Williams"
+}
\ No newline at end of file
diff --git a/examples/network/data/dotLanguage/graphvizGallery/softmaint.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/softmaint.gv.txt
new file mode 100644
index 0000000000..04110890be
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/softmaint.gv.txt
@@ -0,0 +1,377 @@
+digraph G {
+ size="7,10"
+ page="8.5,11"
+ center=""
+ node[width=.25,height=.375,fontsize=9]
+ fcfpr1_1_2t_17 -> 341411;
+ fcfpr1_1t_1 -> 341411;
+ rdlfpr2_0_rdlt_4 -> 341411;
+ fpfpr1_0_1t_1 -> 341411;
+ fpfpr1_1_2t_11 -> 341411;
+ rtafpr1_1_2t_28 -> 341411;
+ rtafpr1_1_3t_6 -> 341411;
+ rdlfpr1_1t_1 -> 358866;
+ rtafpr1_1_3t_6 -> 358866;
+ tmfpr1_1_3t_5 -> 358930;
+ fcfpr1_1_3t_9 -> 358930;
+ pcfpr1_1_3t_7 -> 358930;
+ fpfpr1_1_3g_1 -> 358930;
+ fpfpr1_1_3t_1 -> 358930;
+ aufpr1_1_3t_1 -> 358930;
+ rtafpr1_0_3g_1 -> 358930;
+ rtafpr1_1_3t_6 -> 358930;
+ msgfpr1_1_1g_12 -> 371943;
+ rtafpr1_1_1g_8 -> 371943;
+ rtafpr1_1_1t_35 -> 371943;
+ rtafpr1_1_1t_45 -> 371943;
+ rtafpr1_1_3t_6 -> 371943;
+ tlfpr2_0_rdlg_2 -> 374300;
+ fcfpr1_1_3t_8 -> 374300;
+ fcfpr1_1_3t_9 -> 374300;
+ rtafpr1_1_3t_6 -> 374300;
+ fcfpr1_0_5g_1 -> 371942;
+ fcfpr1_1_1t_19 -> 371942;
+ fcfpr1_1_3t_9 -> 371942;
+ fcfpr1_1_3t_9 -> 374700;
+ tymsgfpr1_1_3t_3 -> 374700;
+ fpfpr1_1_3t_1 -> 374700;
+ rtafpr1_1_3t_7 -> 374700;
+ fcfpr1_1_3g_2 -> 374741;
+ fcfpr1_1_3t_9 -> 374741;
+ fpfpr1_1_3t_1 -> 374741;
+ rtafpr1_1_3t_7 -> 374741;
+ fcfpr1_1_1t_18 -> 374886;
+ fcfpr1_1_3t_9 -> 374886;
+ fpfpr1_1_3t_1 -> 374886;
+ rtafpr1_1_3t_7 -> 374886;
+ fcfpr1_1_3t_9 -> 375039;
+ fpfpr1_1_3t_1 -> 375039;
+ fcfpr1_1_3t_42 -> 375507;
+ fcfpr1_1_3t_9 -> 375507;
+ rdlfpr2_0_rdlt_158 -> 375507;
+ rtafpr1_1_3t_7 -> 375507;
+ rtafpr1_1_3t_71 -> 375507;
+ dbfpr1_1_3t_2 -> 375507;
+ fcfpr1_1_3t_9 -> 375508;
+ rdlfpr1_1g_13 -> 375508;
+ rtafpr1_1_3t_7 -> 375508;
+ rtafpr2_1_rdlg_1 -> 375508;
+ dbfpr1_1_3t_2 -> 375508;
+ fcfpr1_1_3t_9 -> 375519;
+ fpfpr1_1_3g_1 -> 375519;
+ fpfpr1_1_3t_1 -> 375519;
+ fcfpr1_1_3t_9 -> 377380;
+ rdlfpr1_1g_16 -> 377380;
+ rdlfpr1_1t_100 -> 377380;
+ fcfpr1_0_2g_1 -> 377719;
+ fcfpr1_1_3t_10 -> 377719;
+ fcfpr1_1_3t_7 -> 377719;
+ fcfpr1_1_3t_9 -> 377719;
+ rdlfpr2_0_rdlg_12 -> 377719;
+ rdlfpr2_0_rdlt_108 -> 377719;
+ rdlfpr2_0_rdlt_27 -> 377719;
+ rdlfpr2_0_rdlt_30 -> 377719;
+ fcfpr1_1_3t_9 -> 377763;
+ fcfpr1_1_3t_9 -> 379848;
+ fpfpr1_1_3t_1 -> 379848;
+ fcfpr1_1_3t_9 -> 380571;
+ fcfpr1_1_3t_9 -> 380604;
+ fpfpr1_1_3t_1 -> 380604;
+ fcfpr1_1_3t_9 -> 381211;
+ fpfpr1_1_3t_1 -> 381211;
+ fcfpr1_1_3t_9 -> 381835;
+ fcfpr1_1_3t_9 -> 381897;
+ fcfpr1_1_3t_9 -> 381901;
+ fpfpr1_1_3t_1 -> 381901;
+ fcfpr1_1_3t_9 -> 382103;
+ rtafpr1_1_3t_7 -> 382103;
+ fcfpr1_1_3t_9 -> 382161;
+ fcfpr1_1_3t_9 -> 383174;
+ fpfpr1_1_3t_1 -> 383174;
+ rtafpr1_1_3t_7 -> 383174;
+ fpfpr1_1_3g_1 -> 352010;
+ fpfpr1_1_3t_1 -> 352010;
+ fpfpr1_1_3t_1 -> 382409;
+ fpfpr1_1_3t_1 -> 382827;
+ fpfpr1_1_3t_1 -> 382928;
+ rtafpr1_1_3t_7 -> 382928;
+ tlfpr1_1_1t_5 -> 358224;
+ tymsgfpr1_1_1t_23 -> 358224;
+ tymsgfpr1_1_3t_3 -> 358224;
+ rcfpr0_0_1t_9 -> 358224;
+ rcfpr1_1_1t_5 -> 358224;
+ odfpr0_0_1t_8 -> 358224;
+ odfpr1_1_1t_6 -> 358224;
+ ecdsgfpr1_1_1t_4 -> 358224;
+ tymsgfpr1_1_1t_18 -> 358900;
+ tymsgfpr1_1_3t_3 -> 358900;
+ rcfpr1_1_1t_100 -> 358900;
+ rcfpr1_1_1t_22 -> 358900;
+ rcfpr1_1_1t_37 -> 358900;
+ odfpr1_1_1t_21 -> 358900;
+ tymsgfpr1_1_3t_3 -> 372568;
+ rcfpr1_1_1t_30 -> 372568;
+ odfpr1_1_1t_31 -> 372568;
+ tlfpr1_1_1t_20 -> 375557;
+ tymsgfpr1_1_1t_24 -> 375557;
+ tymsgfpr1_1_3t_3 -> 375557;
+ rcfpr1_1_1t_11 -> 375557;
+ odfpr1_1_1t_9 -> 375557;
+ ecdsgfpr1_1_1t_19 -> 375557;
+ rtafpr1_1_1g_14 -> 376956;
+ rtafpr1_1_1t_64 -> 376956;
+ rtafpr1_1_2t_18 -> 376956;
+ rtafpr1_1_3t_30 -> 376956;
+ rtafpr1_1_3t_7 -> 376956;
+ rtafpr1_1_3t_7 -> 379339;
+ rtafpr1_1_1t_14 -> 379422;
+ rtafpr1_1_1t_20 -> 379422;
+ rtafpr1_1_3t_7 -> 379422;
+ rtafpr1_1_3t_7 -> 383039;
+ fcfpr1_1_1t_18 -> 359471;
+ fcfpr2_0_1t_1 -> 359471;
+ fcfpr2_0_1t_2 -> 359471;
+ ccsfpr2_0_1t_99 -> 359471;
+ fcfpr1_1_3t_42 -> 384096;
+ rtafpr1_1_3t_71 -> 384096;
+ tlfpr1_0_4g_4 -> 354290;
+ rcfpr0_0_1t_9 -> 354290;
+ odfpr0_0_1t_8 -> 354290;
+ pagfpr1_1_1t_23 -> 354290;
+ rcfpr1_1_1t_5 -> 379864;
+ rcfpr1_1_1t_100 -> 382574;
+ rcfpr1_1_1t_22 -> 382574;
+ rcfpr1_1_1t_37 -> 382574;
+ rcfpr1_1_1t_30 -> 370706;
+ rcfpr1_1_1t_30 -> 377908;
+ rcfpr1_1_1t_30 -> 377924;
+ rcfpr1_1_1t_30 -> 377971;
+ rcfpr1_1_1t_30 -> 377980;
+ odfpr1_1_1t_31 -> 377980;
+ rcfpr1_1_1t_30 -> 378362;
+ rcfpr1_1_1t_30 -> 378656;
+ rcfpr1_1_1t_30 -> 378666;
+ rcfpr1_1_1t_30 -> 379169;
+ odfpr1_1_1t_31 -> 379169;
+ rcfpr1_1_1t_110 -> 379341;
+ rcfpr1_1_1t_30 -> 379341;
+ rcfpr1_1_1t_62 -> 379341;
+ odfpr1_1_1t_31 -> 379341;
+ rcfpr1_1_1t_30 -> 379972;
+ rcfpr1_1_1t_30 -> 380298;
+ rcfpr1_1_1t_30 -> 380448;
+ rcfpr1_1_1t_30 -> 380475;
+ odfpr1_1_1t_31 -> 380475;
+ rcfpr1_1_1t_30 -> 380526;
+ odfpr1_1_1t_31 -> 357430;
+ rcfpr1_1_1t_11 -> 379968;
+ odfpr1_1_1t_9 -> 379968;
+ ccsfpr2_0_1t_99 -> 359100;
+ ccsfpr2_0_1t_99 -> 376529;
+ ccsfpr2_0_1t_99 -> 377801;
+ ccsfpr2_0_1t_99 -> 379126;
+ ccsfpr2_0_1t_99 -> 379212;
+ ccsfpr2_0_1t_99 -> 380285;
+ ccsfpr2_0_1t_99 -> 380963;
+ ccsfpr2_0_1t_99 -> 384909;
+ tlfpr1_0_4g_4 -> 358471;
+ odfpr0_0_1t_7 -> 358471;
+ odfpr1_0_1t_36 -> 358471;
+ odfpr1_0_3t_18 -> 358471;
+ odfpr1_0_3t_21 -> 358471;
+ tlfpr1_0_4g_4 -> 375024;
+ tlfpr1_0_4g_4 -> 375027;
+ rcfpr1_1_1t_110 -> 381710;
+ rcfpr1_1_1t_62 -> 381710;
+ rcfpr1_1_1t_110 -> 381775;
+ rcfpr1_1_1t_62 -> 381775;
+ rcfpr1_1_1t_110 -> 382436;
+ fcfpr1_1_3t_34 -> 382528;
+ rcfpr1_1_1t_110 -> 382528;
+ rtafpr1_1_3t_48 -> 382528;
+ rcfpr1_1_1t_110 -> 382566;
+ rcfpr1_1_1t_110 -> 382572;
+ odfpr0_0_1t_7 -> 353506;
+ rcfpr1_0_1t_35 -> 370509;
+ odfpr0_0_1t_7 -> 370509;
+ odfpr0_0_1t_7 -> 370510;
+ odfpr1_0_1t_38 -> 370510;
+ tlfpr1_0_4g_5 -> 354546;
+ rcfpr1_1_1t_61 -> 354546;
+ odfpr1_0_3t_18 -> 354546;
+ odfpr1_0_3t_20 -> 354546;
+ odfpr1_0_3t_18 -> 354757;
+ odfpr1_0_3t_20 -> 354757;
+ odfpr1_0_3t_18 -> 354766;
+ odfpr1_0_3t_20 -> 354766;
+ odfpr1_0_3t_18 -> 354771;
+ odfpr1_0_3t_20 -> 354771;
+ odfpr1_0_3t_18 -> 354785;
+ odfpr1_0_3t_23 -> 354785;
+ odfpr1_0_3t_24 -> 354785;
+ odfpr1_0_3t_18 -> 354878;
+ odfpr1_0_3t_23 -> 354878;
+ odfpr1_0_3t_24 -> 354878;
+ odfpr1_0_3t_18 -> 355080;
+ odfpr1_0_3t_23 -> 355080;
+ odfpr1_0_3t_24 -> 355080;
+ odfpr1_0_3t_18 -> 355288;
+ odfpr1_0_3t_23 -> 355288;
+ odfpr1_0_3t_24 -> 355288;
+ odfpr2_0_03t_13 -> 355288;
+ odfpr1_0_3t_18 -> 355800;
+ odfpr1_0_3t_21 -> 355800;
+ odfpr1_0_3t_18 -> 356116;
+ odfpr1_0_3t_21 -> 356116;
+ odfpr1_0_3t_18 -> 356741;
+ odfpr1_0_3t_21 -> 356741;
+ odfpr1_0_3t_18 -> 357340;
+ odfpr1_0_3t_21 -> 357340;
+ odfpr1_0_3t_18 -> 357538;
+ odfpr1_0_3t_21 -> 357538;
+ odfpr1_0_3t_18 -> 357769;
+ odfpr1_0_3t_21 -> 357769;
+ odfpr1_0_3t_18 -> 357793;
+ odfpr1_0_3t_21 -> 357793;
+ odfpr1_0_3t_18 -> 358155;
+ odfpr1_0_3t_21 -> 358155;
+ odfpr1_0_3t_18 -> 358157;
+ odfpr1_0_3t_21 -> 358157;
+ odfpr1_0_3t_18 -> 358159;
+ odfpr1_0_3t_21 -> 358159;
+ odfpr1_0_3t_18 -> 358584;
+ odfpr1_0_3t_21 -> 358584;
+ odfpr1_0_3t_18 -> 360104;
+ odfpr1_0_3t_21 -> 360104;
+ odfpr1_0_3t_18 -> 360144;
+ odfpr1_0_3t_21 -> 360144;
+ odfpr1_0_3t_18 -> 360672;
+ odfpr1_0_3t_21 -> 360672;
+ odfpr1_0_3t_5 -> 360672;
+ odfpr1_0_3t_18 -> 360839;
+ odfpr1_0_3t_21 -> 360839;
+ odfpr1_0_3t_18 -> 371187;
+ tlfpr1_0_3g_5 -> 373300;
+ odfpr1_0_3t_12 -> 373300;
+ odfpr1_0_3t_18 -> 373300;
+ odfpr1_0_3t_18 -> 375134;
+ odfpr1_0_5t_18 -> 375134;
+ rcfpr0_0_1t_10 -> 375319;
+ odfpr1_0_3t_18 -> 375319;
+ odfpr1_0_3t_36 -> 375319;
+ odfpr1_0_5t_17 -> 375319;
+ odfpr1_0_5t_19 -> 375319;
+ odfpr1_0_3t_18 -> 375499;
+ odfpr1_0_3t_18 -> 377220;
+ odfpr1_0_5t_21 -> 377220;
+ tlfpr1_0_3g_7 -> 377562;
+ tlfpr1_1_1t_3 -> 377562;
+ odfpr1_0_3t_18 -> 377562;
+ odfpr1_0_3t_36 -> 377562;
+ odfpr1_0_5t_20 -> 377562;
+ odfpr1_0_3t_18 -> 378108;
+ odfpr1_0_3t_6 -> 378108;
+ odfpr1_0_5t_20 -> 354221;
+
+ odfpr0_0_1t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr1_0_3g_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr0_0_1t_8 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_61 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr1_0_3g_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_62 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ ccsfpr2_0_1t_99 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tymsgfpr1_1_3t_3 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr0_0_1t_9 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_1t_14 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_3t_30 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_110 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ dbfpr1_1_3t_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_1g_8 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_30 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr1_1_1t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_1t_64 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr2_0_rdlg_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_2t_28 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr1_1_1t_3 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_1_1t_6 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fpfpr1_1_3t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ aufpr1_1_3t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_3t_34 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_1t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_36 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr1_1_1t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_1t_19 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_1_1t_9 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_3t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_37 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_3t_8 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_1_1t_21 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_3t_9 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr2_0_rdlt_27 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_3g_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_1t_35 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_5t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fpfpr1_1_3g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_5t_21 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fpfpr1_1_2t_11 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ ecdsgfpr1_1_1t_19 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_1t_36 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_1g_14 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tymsgfpr1_1_1t_23 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tymsgfpr1_1_1t_24 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_1t_38 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_0_2g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr1_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr0_0_1t_10 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_100 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr2_0_rdlt_108 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ pcfpr1_1_3t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ ecdsgfpr1_1_1t_4 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tmfpr1_1_3t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_21 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fpfpr1_0_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_23 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_22 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ pagfpr1_1_1t_23 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_3t_71 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_2t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr2_0_rdlt_158 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_3t_6 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_24 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_3t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_0_3g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_1t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr1_1g_13 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_0_1t_35 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_2t_17 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr2_1_rdlg_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr2_0_rdlt_4 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr1_1g_16 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr2_0_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr2_0_1t_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr1_1t_100 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ msgfpr1_1_1g_12 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr2_0_rdlt_30 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr1_0_4g_4 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_3t_42 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_6 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tlfpr1_0_4g_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_3t_48 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_5t_17 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_5t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ tymsgfpr1_1_1t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_5t_19 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_1_3t_10 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ fcfpr1_0_5g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_0_3t_12 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr2_0_03t_13 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rcfpr1_1_1t_11 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ odfpr1_1_1t_31 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rdlfpr2_0_rdlg_12 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+ rtafpr1_1_1t_45 [label="",shape=circle,height=0.12,width=0.12,fontsize=1];
+}
diff --git a/examples/network/data/dotLanguage/graphvizGallery/traffic_lights.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/traffic_lights.gv.txt
new file mode 100644
index 0000000000..2cc3c482a6
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/traffic_lights.gv.txt
@@ -0,0 +1,29 @@
+##"I played some days with making an interface between our ConceptBase system (essentially a database system to store models) and graphviz. One example graph is attached. It is a so-called petri net for Dutch traffic lights. The example is actually taken from a book by Wil van der Aalst." Contributed by Manfred Jeusfeld.
+
+##Command to produce the output: "neato -Tpng thisfile > thisfile.png"
+
+digraph TrafficLights {
+node [shape=box]; gy2; yr2; rg2; gy1; yr1; rg1;
+node [shape=circle,fixedsize=true,width=0.9]; green2; yellow2; red2; safe2; safe1; green1; yellow1; red1;
+gy2->yellow2;
+rg2->green2;
+yr2->safe1;
+yr2->red2;
+safe2->rg2;
+green2->gy2;
+yellow2->yr2;
+red2->rg2;
+gy1->yellow1;
+rg1->green1;
+yr1->safe2;
+yr1->red1;
+safe1->rg1;
+green1->gy1;
+yellow1->yr1;
+red1->rg1;
+
+overlap=false
+label="PetriNet Model TrafficLights\nExtracted from ConceptBase and layed out by Graphviz"
+fontsize=12;
+}
+
diff --git a/examples/network/data/dotLanguage/graphvizGallery/transparency.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/transparency.gv.txt
new file mode 100644
index 0000000000..cfb82319a7
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/transparency.gv.txt
@@ -0,0 +1,105 @@
+graph G {
+// graph [splines=true overlap=false]
+// graph [truecolor bgcolor="#ff00005f"]
+ node [style=filled fillcolor="#00ff005f"]
+ 1 -- 30 [f=1];
+ 1 -- 40 [f=14];
+ 8 -- 46 [f=1];
+ 8 -- 16 [f=18];
+ 10 -- 25 [f=1];
+ 10 -- 19 [f=5];
+ 10 -- 33 [f=1];
+ 12 -- 8 [f=1];
+ 12 -- 36 [f=5];
+ 12 -- 17 [f=16];
+ 13 -- 38 [f=1];
+ 13 -- 24 [f=19];
+ 24 -- 49 [f=1];
+ 24 -- 13 [f=1];
+ 24 -- 47 [f=12];
+ 24 -- 12 [f=19];
+ 25 -- 27 [f=1];
+ 25 -- 12 [f=1];
+ 27 -- 12 [f=1];
+ 27 -- 14 [f=8];
+ 29 -- 10 [f=1];
+ 29 -- 8 [f=17];
+ 30 -- 24 [f=1];
+ 30 -- 44 [f=15];
+ 38 -- 29 [f=1];
+ 38 -- 35 [f=15];
+ 2 -- 42 [f=2];
+ 2 -- 35 [f=3];
+ 2 -- 11 [f=19];
+ 14 -- 18 [f=2];
+ 14 -- 24 [f=15];
+ 14 -- 38 [f=18];
+ 18 -- 49 [f=2];
+ 18 -- 47 [f=20];
+ 26 -- 41 [f=2];
+ 26 -- 42 [f=15];
+ 31 -- 39 [f=2];
+ 31 -- 47 [f=17];
+ 31 -- 25 [f=14];
+ 37 -- 26 [f=2];
+ 37 -- 16 [f=14];
+ 39 -- 50 [f=2];
+ 39 -- 14 [f=2];
+ 39 -- 18 [f=17];
+ 39 -- 47 [f=10];
+ 41 -- 31 [f=2];
+ 41 -- 8 [f=16];
+ 42 -- 44 [f=2];
+ 42 -- 29 [f=12];
+ 44 -- 37 [f=2];
+ 44 -- 32 [f=15];
+ 3 -- 20 [f=2];
+ 3 -- 28 [f=19];
+ 6 -- 45 [f=2];
+ 6 -- 28 [f=10];
+ 9 -- 6 [f=2];
+ 9 -- 16 [f=1];
+ 15 -- 16 [f=2];
+ 15 -- 48 [f=2];
+ 16 -- 50 [f=2];
+ 16 -- 32 [f=14];
+ 16 -- 39 [f=8];
+ 20 -- 33 [f=2];
+ 33 -- 9 [f=2];
+ 33 -- 46 [f=3];
+ 33 -- 48 [f=17];
+ 45 -- 15 [f=2];
+ 4 -- 17 [f=4];
+ 4 -- 15 [f=6];
+ 4 -- 12 [f=16];
+ 17 -- 21 [f=4];
+ 19 -- 35 [f=4];
+ 19 -- 15 [f=9];
+ 19 -- 43 [f=4];
+ 21 -- 19 [f=4];
+ 21 -- 50 [f=4];
+ 23 -- 36 [f=4];
+ 34 -- 23 [f=4];
+ 34 -- 24 [f=11];
+ 35 -- 34 [f=4];
+ 35 -- 16 [f=6];
+ 35 -- 18 [f=16];
+ 36 -- 46 [f=4];
+ 5 -- 7 [f=1];
+ 5 -- 36 [f=6];
+ 7 -- 32 [f=1];
+ 7 -- 11 [f=2];
+ 7 -- 14 [f=17];
+ 11 -- 40 [f=1];
+ 11 -- 50 [f=1];
+ 22 -- 46 [f=1];
+ 28 -- 43 [f=1];
+ 28 -- 8 [f=18];
+ 32 -- 28 [f=1];
+ 32 -- 39 [f=13];
+ 32 -- 42 [f=15];
+ 40 -- 22 [f=1];
+ 40 -- 47 [f=1];
+ 43 -- 11 [f=1];
+ 43 -- 17 [f=19];
+}
diff --git a/examples/network/data/dotLanguage/graphvizGallery/twopi2.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/twopi2.gv.txt
new file mode 100644
index 0000000000..72b28fa7a3
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/twopi2.gv.txt
@@ -0,0 +1,2212 @@
+digraph G {
+ ranksep=3;
+ ratio=auto;
+"1" [ label="02f5daf56e299b8a8ecea892",shape="hexagon",style="filled",color="green" ];
+"189E" [ label="ca5af2",shape="box",style="filled",color="grey" ];
+"790E" [ label="b4dfef6",shape="box",style="filled",color="grey" ];
+"2" [ label="171192dc1f8e6ea551548a910c00",shape="hexagon",style="filled",color="green" ];
+"191E" [ label="629e42",shape="box",style="filled",color="grey" ];
+"3" [ label="6bce02baf91781a831e1b95",shape="hexagon",style="filled",color="green" ];
+"193E" [ label="1c08373",shape="box",style="filled",color="grey" ];
+"4" [ label="6236a67933a619a6a3d48",shape="hexagon",style="filled",color="green" ];
+"195E" [ label="be8f4199f",shape="box",style="filled",color="grey" ];
+"5" [ label="50962c93b4cb293f5beb59eb",shape="hexagon",style="filled",color="green" ];
+"197E" [ label="be8f4199f",shape="box",style="filled",color="grey" ];
+"6" [ label="05d4b1ed6a6135eec3abd3f2",shape="hexagon",style="filled",color="green" ];
+"199E" [ label="",shape="box",style="filled",color="grey" ];
+"7" [ label="08769f73d31c1a99be2d9363f",shape="hexagon",style="filled",color="green" ];
+"201E" [ label="629e42",shape="box",style="filled",color="grey" ];
+"8" [ label="a6a196a504c3a7657d1fa41",shape="hexagon",style="filled",color="green" ];
+"203E" [ label="cd856f",shape="box",style="filled",color="grey" ];
+"9" [ label="837ebf4bde22e1f1535cb662",shape="hexagon",style="filled",color="green" ];
+"725E" [ label="d0eb84",shape="box",style="filled",color="grey" ];
+"785E" [ label="dd2ba36",shape="box",style="filled",color="grey" ];
+"10" [ label="5f865c374cb3fe976dd376b8",shape="hexagon",style="filled",color="green" ];
+"205E" [ label="23ad1",shape="box",style="filled",color="grey" ];
+"11" [ label="8be752bc95d436a90493bec9",shape="hexagon",style="filled",color="green" ];
+"207E" [ label="ee91c97828",shape="box",style="filled",color="grey" ];
+"12" [ label="969a58db14386cb9d2f51ec",shape="hexagon",style="filled",color="green" ];
+"209E" [ label="7c7c",shape="box",style="filled",color="grey" ];
+"13" [ label="da24f74aad2ff519009d1f38c",shape="hexagon",style="filled",color="green" ];
+"211E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ];
+"14" [ label="3124d3a6ed3381a6341c6",shape="hexagon",style="filled",color="green" ];
+"213E" [ label="bbe0a8f93dc1",shape="box",style="filled",color="grey" ];
+"15" [ label="71512ec7d43f958f2b6da",shape="hexagon",style="filled",color="green" ];
+"215E" [ label="3f0a2b4eb62f",shape="box",style="filled",color="grey" ];
+"16" [ label="3828a2c682419423cf",shape="hexagon",style="filled",color="green" ];
+"727E" [ label="2",shape="box",style="filled",color="grey" ];
+"784E" [ label="",shape="box",style="filled",color="grey" ];
+"17" [ label="aa868f65c34cdb64f1fad19a",shape="hexagon",style="filled",color="green" ];
+"217E" [ label="3089106e3b",shape="box",style="filled",color="grey" ];
+"787E" [ label="1aaaab063",shape="box",style="filled",color="grey" ];
+"18" [ label="dca32af03698c988b22",shape="hexagon",style="filled",color="green" ];
+"219E" [ label="eb8",shape="box",style="filled",color="grey" ];
+"19" [ label="d8f4a9e463a1e89217f",shape="hexagon",style="filled",color="green" ];
+"221E" [ label="4c6c8c",shape="box",style="filled",color="grey" ];
+"20" [ label="c96782ef56711c5d6a3f69",shape="hexagon",style="filled",color="green" ];
+"223E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ];
+"21" [ label="4f04c39708f",shape="hexagon",style="filled",color="green" ];
+"225E" [ label="a49284e9",shape="box",style="filled",color="grey" ];
+"22" [ label="97284d4c3a5d499853f0e",shape="hexagon",style="filled",color="green" ];
+"227E" [ label="53069e384a2",shape="box",style="filled",color="grey" ];
+"792E" [ label="79b69c612",shape="box",style="filled",color="grey" ];
+"23" [ label="c4d32527b670afb370d643",shape="hexagon",style="filled",color="green" ];
+"231E" [ label="e851f5ddd920",shape="box",style="filled",color="grey" ];
+"24" [ label="5e9156098c064",shape="hexagon",style="filled",color="green" ];
+"233E" [ label="",shape="box",style="filled",color="grey" ];
+"25" [ label="3d475ea3aeca51b60212dd",shape="hexagon",style="filled",color="green" ];
+"235E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ];
+"26" [ label="966d271c22e75c7538",shape="hexagon",style="filled",color="green" ];
+"237E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"27" [ label="b630e1af6ae1997f0e8ba750",shape="hexagon",style="filled",color="green" ];
+"239E" [ label="bb828f1a326",shape="box",style="filled",color="grey" ];
+"783E" [ label="499f6985db294c",shape="box",style="filled",color="grey" ];
+"28" [ label="ebd8ffc2ac3a90efb8af9",shape="hexagon",style="filled",color="green" ];
+"241E" [ label="1ebeec",shape="box",style="filled",color="grey" ];
+"791E" [ label="c0b727",shape="box",style="filled",color="grey" ];
+"29" [ label="69fdd1a1f4768c5efe7",shape="hexagon",style="filled",color="green" ];
+"243E" [ label="35b8742610",shape="box",style="filled",color="grey" ];
+"30" [ label="d93a80739fc1edb41a11b7294",shape="hexagon",style="filled",color="green" ];
+"245E" [ label="e03b8bc0435a",shape="box",style="filled",color="grey" ];
+"31" [ label="bf65cfddeb00ff847feae0c",shape="hexagon",style="filled",color="green" ];
+"247E" [ label="8df",shape="box",style="filled",color="grey" ];
+"32" [ label="916c686a1e82dba72524a",shape="hexagon",style="filled",color="green" ];
+"249E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ];
+"33" [ label="f496bcf0889b301d77819c",shape="hexagon",style="filled",color="green" ];
+"251E" [ label="f29dfb9",shape="box",style="filled",color="grey" ];
+"34" [ label="76889f7d35e",shape="hexagon",style="filled",color="green" ];
+"253E" [ label="e7ef998",shape="box",style="filled",color="grey" ];
+"35" [ label="668d636002",shape="hexagon",style="filled",color="green" ];
+"255E" [ label="4379b5ed",shape="box",style="filled",color="grey" ];
+"36" [ label="e1e4c23db39d8bd633c3a",shape="hexagon",style="filled",color="green" ];
+"257E" [ label="1ed5d7f63b8c6",shape="box",style="filled",color="grey" ];
+"37" [ label="842bc5775657c1e0d67",shape="hexagon",style="filled",color="green" ];
+"259E" [ label="a387210a27b",shape="box",style="filled",color="grey" ];
+"38" [ label="e4e2f4e6d",shape="hexagon",style="filled",color="green" ];
+"261E" [ label="1f4f0fdf",shape="box",style="filled",color="grey" ];
+"39" [ label="04390dec6f1779353c07f5",shape="hexagon",style="filled",color="green" ];
+"263E" [ label="bac77c3f414a",shape="box",style="filled",color="grey" ];
+"40" [ label="69f2611acc42c36ed7cc",shape="hexagon",style="filled",color="green" ];
+"265E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"41" [ label="1562abef0d8241",shape="hexagon",style="filled",color="green" ];
+"267E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ];
+"42" [ label="e49aaa5cc4e44355d6a0",shape="hexagon",style="filled",color="green" ];
+"269E" [ label="cc3f63d",shape="box",style="filled",color="grey" ];
+"43" [ label="e8ebe1bf5f421c1223",shape="hexagon",style="filled",color="green" ];
+"271E" [ label="96325ea",shape="box",style="filled",color="grey" ];
+"44" [ label="2759e82e30d6d",shape="hexagon",style="filled",color="green" ];
+"273E" [ label="ca5af2",shape="box",style="filled",color="grey" ];
+"45" [ label="23c1ec53358d237c1",shape="hexagon",style="filled",color="green" ];
+"275E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"46" [ label="5838586c293d455",shape="hexagon",style="filled",color="green" ];
+"277E" [ label="83c397b8bf7f",shape="box",style="filled",color="grey" ];
+"47" [ label="f841118350a27b7ea29a9c9d",shape="hexagon",style="filled",color="green" ];
+"279E" [ label="69f4ecb77d",shape="box",style="filled",color="grey" ];
+"48" [ label="658d208447d8ec5d6de8",shape="hexagon",style="filled",color="green" ];
+"281E" [ label="f7b22b9640",shape="box",style="filled",color="grey" ];
+"49" [ label="11180ae7706510211bc4",shape="hexagon",style="filled",color="green" ];
+"283E" [ label="052bb6e3",shape="box",style="filled",color="grey" ];
+"50" [ label="5807acd8d58e006f43",shape="hexagon",style="filled",color="green" ];
+"285E" [ label="",shape="box",style="filled",color="grey" ];
+"51" [ label="fe4e848cb5291ee59a2",shape="hexagon",style="filled",color="green" ];
+"287E" [ label="e3aefac763",shape="box",style="filled",color="grey" ];
+"52" [ label="c4f31ea3844e12da27ad47c6",shape="hexagon",style="filled",color="green" ];
+"289E" [ label="fb16636aae",shape="box",style="filled",color="grey" ];
+"53" [ label="00cbeb87c182ca0785f",shape="hexagon",style="filled",color="green" ];
+"291E" [ label="3089106e3b",shape="box",style="filled",color="grey" ];
+"54" [ label="11f088bfd8",shape="hexagon",style="filled",color="green" ];
+"293E" [ label="6a80cbe",shape="box",style="filled",color="grey" ];
+"55" [ label="64a9ec24428099ad8ed82ba6",shape="hexagon",style="filled",color="green" ];
+"745E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ];
+"56" [ label="3c2a62e0e5e9f7",shape="hexagon",style="filled",color="green" ];
+"295E" [ label="ae32701",shape="box",style="filled",color="grey" ];
+"57" [ label="dd84fe6a65cfac7bca03ebd",shape="hexagon",style="filled",color="green" ];
+"297E" [ label="",shape="box",style="filled",color="grey" ];
+"58" [ label="b06bbfa920aa95dd",shape="hexagon",style="filled",color="green" ];
+"299E" [ label="07",shape="box",style="filled",color="grey" ];
+"59" [ label="6b5aaa4bdf44b2c898854",shape="hexagon",style="filled",color="green" ];
+"301E" [ label="4c6c8c",shape="box",style="filled",color="grey" ];
+"789E" [ label="3a0ff0",shape="box",style="filled",color="grey" ];
+"60" [ label="855d26296eda4eb7",shape="hexagon",style="filled",color="green" ];
+"303E" [ label="53069e384a2",shape="box",style="filled",color="grey" ];
+"61" [ label="e82f47b8d4949ba4af69b38cbc19",shape="hexagon",style="filled",color="green" ];
+"305E" [ label="b62cd1d0a0",shape="box",style="filled",color="grey" ];
+"62" [ label="86569bffb49adf6b3d0ebac",shape="hexagon",style="filled",color="green" ];
+"307E" [ label="660ffeb76fc59",shape="box",style="filled",color="grey" ];
+"63" [ label="a96e47ff37983425a3e452095",shape="hexagon",style="filled",color="green" ];
+"309E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"64" [ label="71a48d11b2e7e56b1df128bd",shape="hexagon",style="filled",color="green" ];
+"311E" [ label="be8f4199f",shape="box",style="filled",color="grey" ];
+"65" [ label="a0befe6dd1ca7b165786835",shape="hexagon",style="filled",color="green" ];
+"313E" [ label="3cfae",shape="box",style="filled",color="grey" ];
+"66" [ label="f33ec11db496f7bfcb024f",shape="hexagon",style="filled",color="green" ];
+"315E" [ label="71e6b",shape="box",style="filled",color="grey" ];
+"67" [ label="fe6be3206549f5b5564acde84783",shape="hexagon",style="filled",color="green" ];
+"317E" [ label="",shape="box",style="filled",color="grey" ];
+"68" [ label="e4dba079d5fcb1f165920a3bf",shape="hexagon",style="filled",color="green" ];
+"319E" [ label="",shape="box",style="filled",color="grey" ];
+"69" [ label="35dfbee3123dc389cba0b15",shape="hexagon",style="filled",color="green" ];
+"746E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ];
+"70" [ label="16c508ab98483d430bbe",shape="hexagon",style="filled",color="green" ];
+"321E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"71" [ label="9c9e2e0f2da8758e436c",shape="hexagon",style="filled",color="green" ];
+"327E" [ label="cd0d985a366cad7e",shape="box",style="filled",color="grey" ];
+"72" [ label="fb039d7a2a9fe73b5f468eba9",shape="hexagon",style="filled",color="green" ];
+"329E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ];
+"73" [ label="2ef949c4a39b",shape="hexagon",style="filled",color="green" ];
+"331E" [ label="617809d979f",shape="box",style="filled",color="grey" ];
+"74" [ label="a9497e0757b0969bde707ed5",shape="hexagon",style="filled",color="green" ];
+"333E" [ label="541ab86a2e",shape="box",style="filled",color="grey" ];
+"75" [ label="230cc6bbc66b24eae94fa03d",shape="hexagon",style="filled",color="green" ];
+"335E" [ label="",shape="box",style="filled",color="grey" ];
+"76" [ label="1d163eac141def176461c",shape="hexagon",style="filled",color="green" ];
+"337E" [ label="0acc5bb8ca4",shape="box",style="filled",color="grey" ];
+"77" [ label="32979f8cf86",shape="hexagon",style="filled",color="green" ];
+"339E" [ label="a7e89580",shape="box",style="filled",color="grey" ];
+"78" [ label="37d80ae421dba4a70730338860",shape="hexagon",style="filled",color="green" ];
+"341E" [ label="",shape="box",style="filled",color="grey" ];
+"79" [ label="fbba7215e7c13173a60206",shape="hexagon",style="filled",color="green" ];
+"343E" [ label="617809d979f",shape="box",style="filled",color="grey" ];
+"80" [ label="2dd8cc4d693415f93c0f8fc",shape="hexagon",style="filled",color="green" ];
+"345E" [ label="94da691e20e3",shape="box",style="filled",color="grey" ];
+"81" [ label="00880e6f50c765ebc1f85d3e9",shape="hexagon",style="filled",color="green" ];
+"347E" [ label="e7ef998",shape="box",style="filled",color="grey" ];
+"82" [ label="ef13d45b1277ac9a0444adb",shape="hexagon",style="filled",color="green" ];
+"349E" [ label="a7fe7",shape="box",style="filled",color="grey" ];
+"83" [ label="2573e1bf51f1b307f4640",shape="hexagon",style="filled",color="green" ];
+"351E" [ label="84e4ede82074",shape="box",style="filled",color="grey" ];
+"84" [ label="162d8039483d8",shape="hexagon",style="filled",color="green" ];
+"353E" [ label="a8e9",shape="box",style="filled",color="grey" ];
+"85" [ label="f490de272a7f6e4af346d40",shape="hexagon",style="filled",color="green" ];
+"355E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ];
+"788E" [ label="391256c872",shape="box",style="filled",color="grey" ];
+"86" [ label="678bf739c344b9ad41da1",shape="hexagon",style="filled",color="green" ];
+"357E" [ label="396b16a892fe",shape="box",style="filled",color="grey" ];
+"87" [ label="876d120b38b0e88817",shape="hexagon",style="filled",color="green" ];
+"359E" [ label="e5",shape="box",style="filled",color="grey" ];
+"88" [ label="503737b64d432c60d6ac557e0e6",shape="hexagon",style="filled",color="green" ];
+"361E" [ label="9937ccba1469",shape="box",style="filled",color="grey" ];
+"89" [ label="b36e0be6f67fc25286127456",shape="hexagon",style="filled",color="green" ];
+"363E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ];
+"90" [ label="4cc20a0b7651e486",shape="hexagon",style="filled",color="green" ];
+"365E" [ label="e079d2c",shape="box",style="filled",color="grey" ];
+"91" [ label="08dade990b2282",shape="hexagon",style="filled",color="green" ];
+"367E" [ label="45827dbdd8",shape="box",style="filled",color="grey" ];
+"92" [ label="f8128d574c356631b8a9",shape="hexagon",style="filled",color="green" ];
+"369E" [ label="",shape="box",style="filled",color="grey" ];
+"93" [ label="88a4f0337c2189c3fc7b31",shape="hexagon",style="filled",color="green" ];
+"729E" [ label="da0d7bbcf30",shape="box",style="filled",color="grey" ];
+"94" [ label="1b13908a9f0763c0ae54af9062080",shape="hexagon",style="filled",color="green" ];
+"371E" [ label="8b06a67a",shape="box",style="filled",color="grey" ];
+"95" [ label="e2a5d11499b7e",shape="hexagon",style="filled",color="green" ];
+"373E" [ label="66abc181ac4",shape="box",style="filled",color="grey" ];
+"96" [ label="90cc275011c2013c61eb11",shape="hexagon",style="filled",color="green" ];
+"375E" [ label="",shape="box",style="filled",color="grey" ];
+"97" [ label="1e003bfe8fc840df0163f4c",shape="hexagon",style="filled",color="green" ];
+"747E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ];
+"98" [ label="1927c743a0d440a5a0",shape="hexagon",style="filled",color="green" ];
+"377E" [ label="b12441ecff15fa12c",shape="box",style="filled",color="grey" ];
+"99" [ label="155d892827c33ed3cae3",shape="hexagon",style="filled",color="green" ];
+"379E" [ label="71e6b",shape="box",style="filled",color="grey" ];
+"100" [ label="9f24ba80192c339a64c0",shape="hexagon",style="filled",color="green" ];
+"381E" [ label="",shape="box",style="filled",color="grey" ];
+"101" [ label="3e814305b42beb41b8c706",shape="hexagon",style="filled",color="green" ];
+"383E" [ label="1c08373",shape="box",style="filled",color="grey" ];
+"102" [ label="eccfe5ff0af70fe9fbec8b2360f90",shape="hexagon",style="filled",color="green" ];
+"385E" [ label="be8f4199f",shape="box",style="filled",color="grey" ];
+"103" [ label="8fa622d9f842c5572a545ed72982",shape="hexagon",style="filled",color="green" ];
+"387E" [ label="4dccb",shape="box",style="filled",color="grey" ];
+"104" [ label="ad9142a65f5eab78b4ca5e",shape="hexagon",style="filled",color="green" ];
+"389E" [ label="f36cce089",shape="box",style="filled",color="grey" ];
+"105" [ label="20f234fdcd0e1fc50261ce8",shape="hexagon",style="filled",color="green" ];
+"391E" [ label="67219ef689f0146b544",shape="box",style="filled",color="grey" ];
+"106" [ label="e06cc38155ff6781cf944d745",shape="hexagon",style="filled",color="green" ];
+"393E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ];
+"107" [ label="cfdf1932665dcb4cd3c",shape="hexagon",style="filled",color="green" ];
+"395E" [ label="964b86fc1bba0e",shape="box",style="filled",color="grey" ];
+"108" [ label="6d4a4a5a5af91b895272c30",shape="hexagon",style="filled",color="green" ];
+"397E" [ label="b5e86c73d1198f",shape="box",style="filled",color="grey" ];
+"109" [ label="e0ad365c2fb444358201",shape="hexagon",style="filled",color="green" ];
+"399E" [ label="bb5e89c8963",shape="box",style="filled",color="grey" ];
+"110" [ label="b07bbdc8cca5985d4c4",shape="hexagon",style="filled",color="green" ];
+"401E" [ label="50023f6f88",shape="box",style="filled",color="grey" ];
+"111" [ label="df5dba74c75b228de48c",shape="hexagon",style="filled",color="green" ];
+"403E" [ label="7e493ee44b28",shape="box",style="filled",color="grey" ];
+"112" [ label="0b8694c9ef9b27b9c3d8",shape="hexagon",style="filled",color="green" ];
+"405E" [ label="2342b759c03",shape="box",style="filled",color="grey" ];
+"113" [ label="81e20155999fa64e0ae6fd",shape="hexagon",style="filled",color="green" ];
+"407E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ];
+"114" [ label="3ef07ae75d29a707",shape="hexagon",style="filled",color="green" ];
+"409E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ];
+"115" [ label="4a36db80f1ab1e97",shape="hexagon",style="filled",color="green" ];
+"411E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ];
+"116" [ label="16da5f1301b36df4df0f",shape="hexagon",style="filled",color="green" ];
+"413E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ];
+"117" [ label="6b3f3fa236bb90592d23a",shape="hexagon",style="filled",color="green" ];
+"415E" [ label="83c397b8bf7f",shape="box",style="filled",color="grey" ];
+"118" [ label="f2a57e4d4f0cec516891e3",shape="hexagon",style="filled",color="green" ];
+"417E" [ label="bd2484",shape="box",style="filled",color="grey" ];
+"119" [ label="deb3089920548bf1ecb23f0d",shape="hexagon",style="filled",color="green" ];
+"419E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ];
+"120" [ label="bf01c8a262",shape="hexagon",style="filled",color="green" ];
+"421E" [ label="01",shape="box",style="filled",color="grey" ];
+"121" [ label="23dc3a52fed9c119610b5e8",shape="hexagon",style="filled",color="green" ];
+"423E" [ label="71e6b",shape="box",style="filled",color="grey" ];
+"122" [ label="aff7fc220edc93572bb2",shape="hexagon",style="filled",color="green" ];
+"748E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ];
+"123" [ label="78cc16f965adc5f712ea2372c6",shape="hexagon",style="filled",color="green" ];
+"425E" [ label="23ad1",shape="box",style="filled",color="grey" ];
+"124" [ label="5be631dff7b97697be7dc0a2f07f2",shape="hexagon",style="filled",color="green" ];
+"427E" [ label="",shape="box",style="filled",color="grey" ];
+"786E" [ label="421",shape="box",style="filled",color="grey" ];
+"125" [ label="48398d080dfcccced48da1980",shape="hexagon",style="filled",color="green" ];
+"431E" [ label="866808df",shape="box",style="filled",color="grey" ];
+"126" [ label="03716a2c341e5edaa31",shape="hexagon",style="filled",color="green" ];
+"433E" [ label="21407f8a6d7",shape="box",style="filled",color="grey" ];
+"127" [ label="ddfeabe456a9de5f5784",shape="hexagon",style="filled",color="green" ];
+"435E" [ label="aac615ae78",shape="box",style="filled",color="grey" ];
+"128" [ label="d550a7f392c787661aadd48",shape="hexagon",style="filled",color="green" ];
+"437E" [ label="e3aefac763",shape="box",style="filled",color="grey" ];
+"129" [ label="4c82921f4ad3f07066540",shape="hexagon",style="filled",color="green" ];
+"439E" [ label="a7fe7",shape="box",style="filled",color="grey" ];
+"130" [ label="0bc7f8f513e0e74b270",shape="hexagon",style="filled",color="green" ];
+"441E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ];
+"131" [ label="3b1563a23eb9",shape="hexagon",style="filled",color="green" ];
+"443E" [ label="a8e9",shape="box",style="filled",color="grey" ];
+"132" [ label="be233fafa38d931d894",shape="hexagon",style="filled",color="green" ];
+"445E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ];
+"133" [ label="f906dc5244ee6a371f8",shape="hexagon",style="filled",color="green" ];
+"749E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ];
+"134" [ label="e7a887d88c2318beba51",shape="hexagon",style="filled",color="green" ];
+"447E" [ label="9d8988c0945d6",shape="box",style="filled",color="grey" ];
+"135" [ label="be6b73bd46a7a5183e8c91a",shape="hexagon",style="filled",color="green" ];
+"449E" [ label="ee91c97828",shape="box",style="filled",color="grey" ];
+"769E" [ label="444189d179b5db71fe",shape="box",style="filled",color="grey" ];
+"770E" [ label="1e1fbbe14ac24e0518",shape="box",style="filled",color="grey" ];
+"136" [ label="644f112bb0aa452ee7040a",shape="hexagon",style="filled",color="green" ];
+"451E" [ label="52f247fc3b",shape="box",style="filled",color="grey" ];
+"137" [ label="010957669f3770aac",shape="hexagon",style="filled",color="green" ];
+"453E" [ label="78",shape="box",style="filled",color="grey" ];
+"138" [ label="0a185946ee443342b07d8e1",shape="hexagon",style="filled",color="green" ];
+"455E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ];
+"139" [ label="f66fe4df3d189e69ce10c9c",shape="hexagon",style="filled",color="green" ];
+"457E" [ label="21407f8a6d7",shape="box",style="filled",color="grey" ];
+"140" [ label="247e407f45b353f8",shape="hexagon",style="filled",color="green" ];
+"459E" [ label="",shape="box",style="filled",color="grey" ];
+"141" [ label="84907547f36d0ff7",shape="hexagon",style="filled",color="green" ];
+"461E" [ label="e920b915087",shape="box",style="filled",color="grey" ];
+"142" [ label="805004328dad9d315d",shape="hexagon",style="filled",color="green" ];
+"463E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ];
+"143" [ label="4f0cbd3fbf0cb1e8c",shape="hexagon",style="filled",color="green" ];
+"465E" [ label="403126",shape="box",style="filled",color="grey" ];
+"144" [ label="4869e993f2bb10f",shape="hexagon",style="filled",color="green" ];
+"467E" [ label="ff",shape="box",style="filled",color="grey" ];
+"145" [ label="665b76844ff78fc2cf66ca2",shape="hexagon",style="filled",color="green" ];
+"469E" [ label="af0268dddd",shape="box",style="filled",color="grey" ];
+"146" [ label="3f16509139c7dad5163b91799",shape="hexagon",style="filled",color="green" ];
+"471E" [ label="3089106e3b",shape="box",style="filled",color="grey" ];
+"147" [ label="01db23a60422ba93a68611cc0",shape="hexagon",style="filled",color="green" ];
+"473E" [ label="",shape="box",style="filled",color="grey" ];
+"148" [ label="46125fcc583c0f494a3a1d3",shape="hexagon",style="filled",color="green" ];
+"475E" [ label="db6c4213a717bc",shape="box",style="filled",color="grey" ];
+"149" [ label="731857fe189fb398e80a0594",shape="hexagon",style="filled",color="green" ];
+"477E" [ label="3089106e3b",shape="box",style="filled",color="grey" ];
+"150" [ label="6fb7a84e370ef70feac5cb",shape="hexagon",style="filled",color="green" ];
+"479E" [ label="396b16a892fe",shape="box",style="filled",color="grey" ];
+"151" [ label="e343cea291b79a2ed4e",shape="hexagon",style="filled",color="green" ];
+"481E" [ label="88d8b220746882d",shape="box",style="filled",color="grey" ];
+"152" [ label="5f2592b20f13356b7fc8b42",shape="hexagon",style="filled",color="green" ];
+"483E" [ label="",shape="box",style="filled",color="grey" ];
+"153" [ label="275a0407e33e9b8aa9cdd051",shape="hexagon",style="filled",color="green" ];
+"731E" [ label="",shape="box",style="filled",color="grey" ];
+"154" [ label="011d119375cf494ca2fa8d59",shape="hexagon",style="filled",color="green" ];
+"750E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ];
+"155" [ label="173fd00917644f0f1f3e3",shape="hexagon",style="filled",color="green" ];
+"485E" [ label="0acc5bb8ca4",shape="box",style="filled",color="grey" ];
+"156" [ label="c72df69b40156a3254",shape="hexagon",style="filled",color="green" ];
+"487E" [ label="fff03efcd",shape="box",style="filled",color="grey" ];
+"157" [ label="6c632ad9c42228bb337",shape="hexagon",style="filled",color="green" ];
+"489E" [ label="eb8",shape="box",style="filled",color="grey" ];
+"158" [ label="bbb13dc62adf2de2a42b6",shape="hexagon",style="filled",color="green" ];
+"491E" [ label="69ce90c9b2",shape="box",style="filled",color="grey" ];
+"159" [ label="6282bc21f6",shape="hexagon",style="filled",color="green" ];
+"495E" [ label="de34214b4c258c9333ec3",shape="box",style="filled",color="grey" ];
+"160" [ label="71cf45dd4e91bcca945137b40e",shape="hexagon",style="filled",color="green" ];
+"499E" [ label="65fd8495",shape="box",style="filled",color="grey" ];
+"161" [ label="a3b6df27179b175c88fa4c9cf9f",shape="hexagon",style="filled",color="green" ];
+"501E" [ label="6577",shape="box",style="filled",color="grey" ];
+"162" [ label="284f14a259991806654e74",shape="hexagon",style="filled",color="green" ];
+"503E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ];
+"163" [ label="a7c99ccf6ddf6f5ebbe",shape="hexagon",style="filled",color="green" ];
+"505E" [ label="c4fd8",shape="box",style="filled",color="grey" ];
+"164" [ label="c32d2697e8",shape="hexagon",style="filled",color="green" ];
+"507E" [ label="52f247fc3b",shape="box",style="filled",color="grey" ];
+"165" [ label="d12bd75c24b110ef90cdd35d3",shape="hexagon",style="filled",color="green" ];
+"509E" [ label="0668",shape="box",style="filled",color="grey" ];
+"166" [ label="1c07453d584f3d14b1876fdb",shape="hexagon",style="filled",color="green" ];
+"511E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ];
+"167" [ label="f713a8b311ffa05ce3683ad10",shape="hexagon",style="filled",color="green" ];
+"513E" [ label="30d6138b63eb",shape="box",style="filled",color="grey" ];
+"168" [ label="3cdc90c57243373efaba65a",shape="hexagon",style="filled",color="green" ];
+"515E" [ label="fa2afbd869",shape="box",style="filled",color="grey" ];
+"169" [ label="e3bdbca0e2256fffa8a59018",shape="hexagon",style="filled",color="green" ];
+"517E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ];
+"170" [ label="75ba8d840070942eb4e737849",shape="hexagon",style="filled",color="green" ];
+"519E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ];
+"171" [ label="fbdc3ca37406f66635c8b226e",shape="hexagon",style="filled",color="green" ];
+"521E" [ label="8cbcf5cb5",shape="box",style="filled",color="grey" ];
+"172" [ label="40b49a5a9bb256c7a3286e56",shape="hexagon",style="filled",color="green" ];
+"523E" [ label="f72564578be",shape="box",style="filled",color="grey" ];
+"173" [ label="3b2f08d52e4bca3f9ca7bbbd6",shape="hexagon",style="filled",color="green" ];
+"525E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ];
+"174" [ label="4a38abc630c82b0c48dfbf5271",shape="hexagon",style="filled",color="green" ];
+"527E" [ label="f0bd1521",shape="box",style="filled",color="grey" ];
+"175" [ label="2d7b7fb6c9ad6821752651f7",shape="hexagon",style="filled",color="green" ];
+"529E" [ label="47b2da3d",shape="box",style="filled",color="grey" ];
+"176" [ label="910b00285f11bb90d0a15641",shape="hexagon",style="filled",color="green" ];
+"531E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ];
+"177" [ label="24431c3eb075102f07cc2c1be",shape="hexagon",style="filled",color="green" ];
+"533E" [ label="",shape="box",style="filled",color="grey" ];
+"178" [ label="07f8a9e55a16beddb3c9153b0",shape="hexagon",style="filled",color="green" ];
+"535E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ];
+"179" [ label="c1c30f30d40c4f1f84924622f",shape="hexagon",style="filled",color="green" ];
+"537E" [ label="c5d5be3942",shape="box",style="filled",color="grey" ];
+"180" [ label="86276bb1e23f2c7ffcbe82a0",shape="hexagon",style="filled",color="green" ];
+"539E" [ label="0f940646",shape="box",style="filled",color="grey" ];
+"181" [ label="f78e145a127014eb43345a0c",shape="hexagon",style="filled",color="green" ];
+"541E" [ label="d370c12dbc",shape="box",style="filled",color="grey" ];
+"182" [ label="a27037332d9fa5c43bcfe94c0",shape="hexagon",style="filled",color="green" ];
+"543E" [ label="80874aa8",shape="box",style="filled",color="grey" ];
+"183" [ label="c29ce10bb8d19b498355aa04",shape="hexagon",style="filled",color="green" ];
+"545E" [ label="1c08373",shape="box",style="filled",color="grey" ];
+"184" [ label="4f8c642b53c349c687534bda35db",shape="hexagon",style="filled",color="green" ];
+"547E" [ label="46969c4",shape="box",style="filled",color="grey" ];
+"185" [ label="30cc206b1878485",shape="hexagon",style="filled",color="green" ];
+"549E" [ label="23ad1",shape="box",style="filled",color="grey" ];
+"186" [ label="5d69639a5e3bdd3d",shape="hexagon",style="filled",color="green" ];
+"551E" [ label="6139fa6adc88d",shape="box",style="filled",color="grey" ];
+"187" [ label="b656f0ed2202b8e46eb",shape="hexagon",style="filled",color="green" ];
+"553E" [ label="f6e6236b48bc3",shape="box",style="filled",color="grey" ];
+"188" [ label="3b566eaa70ed401479d43a9",shape="hexagon",style="filled",color="green" ];
+"555E" [ label="4c6c8c",shape="box",style="filled",color="grey" ];
+"189" [ label="d6125ef42bd9958",shape="hexagon",style="filled",color="green" ];
+"557E" [ label="4c6c8c",shape="box",style="filled",color="grey" ];
+"190" [ label="dd12f26f8d9bb55",shape="hexagon",style="filled",color="green" ];
+"559E" [ label="83c397b8bf7f",shape="box",style="filled",color="grey" ];
+"191" [ label="ea890ccca2f7c2107351",shape="hexagon",style="filled",color="green" ];
+"561E" [ label="eb8",shape="box",style="filled",color="grey" ];
+"192" [ label="84e4f1c582427a98d7b",shape="hexagon",style="filled",color="green" ];
+"563E" [ label="eb8",shape="box",style="filled",color="grey" ];
+"193" [ label="d378760b814eaecb6efe636e0efc4",shape="hexagon",style="filled",color="green" ];
+"565E" [ label="81bcc35f82891",shape="box",style="filled",color="grey" ];
+"194" [ label="f722890f70a32dce3baff371a",shape="hexagon",style="filled",color="green" ];
+"567E" [ label="84e4ede82074",shape="box",style="filled",color="grey" ];
+"195" [ label="666f11bb45c3a8dcf26e1ed79",shape="hexagon",style="filled",color="green" ];
+"569E" [ label="c90f755c8b6612d",shape="box",style="filled",color="grey" ];
+"196" [ label="91ecbe29a71f00ed5a3",shape="hexagon",style="filled",color="green" ];
+"571E" [ label="0a963fef9",shape="box",style="filled",color="grey" ];
+"197" [ label="30c3f3bf8463d3843dc57d8e98",shape="hexagon",style="filled",color="green" ];
+"573E" [ label="3089106e3b",shape="box",style="filled",color="grey" ];
+"198" [ label="8ea965ab6ee8dedb6c3333e9",shape="hexagon",style="filled",color="green" ];
+"575E" [ label="84e4ede82074",shape="box",style="filled",color="grey" ];
+"199" [ label="3eecb304bab2136a76deda",shape="hexagon",style="filled",color="green" ];
+"577E" [ label="8df",shape="box",style="filled",color="grey" ];
+"200" [ label="d886e4b76537a99bc71b8a9331c94",shape="hexagon",style="filled",color="green" ];
+"579E" [ label="1172dca23",shape="box",style="filled",color="grey" ];
+"201" [ label="dcc5d5e9d6c4e",shape="hexagon",style="filled",color="green" ];
+"581E" [ label="a8e9",shape="box",style="filled",color="grey" ];
+"202" [ label="8292af691429f8d9ed481ff71ffd",shape="hexagon",style="filled",color="green" ];
+"583E" [ label="212af4",shape="box",style="filled",color="grey" ];
+"203" [ label="12fcb26b3de00ef98719c2ca",shape="hexagon",style="filled",color="green" ];
+"585E" [ label="",shape="box",style="filled",color="grey" ];
+"204" [ label="a141a557a60912051f3c135",shape="hexagon",style="filled",color="green" ];
+"587E" [ label="",shape="box",style="filled",color="grey" ];
+"205" [ label="64eeeddfc34489ff396",shape="hexagon",style="filled",color="green" ];
+"751E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ];
+"206" [ label="f5d636e14a6cd716362158d",shape="hexagon",style="filled",color="green" ];
+"589E" [ label="32c958c9997",shape="box",style="filled",color="grey" ];
+"207" [ label="84e4978afc069d5a1aecbf2b",shape="hexagon",style="filled",color="green" ];
+"593E" [ label="56caa96d171a9ac2da7c",shape="box",style="filled",color="grey" ];
+"208" [ label="52a6c2063bccd83110c32",shape="hexagon",style="filled",color="green" ];
+"597E" [ label="",shape="box",style="filled",color="grey" ];
+"209" [ label="46f754ea06f070dbc023e571a876",shape="hexagon",style="filled",color="green" ];
+"599E" [ label="ffccaa9e3",shape="box",style="filled",color="grey" ];
+"210" [ label="c10cb9baf4dcb43e24",shape="hexagon",style="filled",color="green" ];
+"601E" [ label="ac6e99186",shape="box",style="filled",color="grey" ];
+"211" [ label="3dafe1619016463f521f",shape="hexagon",style="filled",color="green" ];
+"603E" [ label="b9",shape="box",style="filled",color="grey" ];
+"212" [ label="0f5db6ce12751ddcc64e",shape="hexagon",style="filled",color="green" ];
+"605E" [ label="bb828f1a326",shape="box",style="filled",color="grey" ];
+"213" [ label="34c8c8dc0f6e41c7e7b2",shape="hexagon",style="filled",color="green" ];
+"607E" [ label="2832ed5cea6",shape="box",style="filled",color="grey" ];
+"214" [ label="0a49c95f107c0aa57c9b5748",shape="hexagon",style="filled",color="green" ];
+"609E" [ label="",shape="box",style="filled",color="grey" ];
+"215" [ label="3b4fdad8e0429d112",shape="hexagon",style="filled",color="green" ];
+"611E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"216" [ label="17dafa5ebaafd48440e3",shape="hexagon",style="filled",color="green" ];
+"613E" [ label="b5f038f79a3",shape="box",style="filled",color="grey" ];
+"217" [ label="f4c69e5e212f89348122e8",shape="hexagon",style="filled",color="green" ];
+"615E" [ label="396b16a892fe",shape="box",style="filled",color="grey" ];
+"218" [ label="4f2e020854dfacce46a12",shape="hexagon",style="filled",color="green" ];
+"617E" [ label="e079d2c",shape="box",style="filled",color="grey" ];
+"219" [ label="6448451ac2ceade90715378b",shape="hexagon",style="filled",color="green" ];
+"619E" [ label="",shape="box",style="filled",color="grey" ];
+"220" [ label="7d7b14baa649330",shape="hexagon",style="filled",color="green" ];
+"621E" [ label="77d145b32328880440c7a",shape="box",style="filled",color="grey" ];
+"221" [ label="d7c27cc6f7b02a31eb64d",shape="hexagon",style="filled",color="green" ];
+"623E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ];
+"222" [ label="8f5a69ece1",shape="hexagon",style="filled",color="green" ];
+"752E" [ label="eb9cf6456613d4cd06f7c0894bd6",shape="box",style="filled",color="grey" ];
+"223" [ label="eccf7c722ddf",shape="hexagon",style="filled",color="green" ];
+"625E" [ label="df61d5f5fc",shape="box",style="filled",color="grey" ];
+"224" [ label="86633c26be93ada8b",shape="hexagon",style="filled",color="green" ];
+"627E" [ label="08500a6044",shape="box",style="filled",color="grey" ];
+"225" [ label="3f9ddf1ffbc0d38b",shape="hexagon",style="filled",color="green" ];
+"629E" [ label="07",shape="box",style="filled",color="grey" ];
+"226" [ label="e33792703",shape="hexagon",style="filled",color="green" ];
+"631E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ];
+"227" [ label="293a225dc56dd1e0564e6bb",shape="hexagon",style="filled",color="green" ];
+"633E" [ label="e3aefac763",shape="box",style="filled",color="grey" ];
+"228" [ label="57c77c341f94afddef07e6",shape="hexagon",style="filled",color="green" ];
+"635E" [ label="5e80f85274",shape="box",style="filled",color="grey" ];
+"229" [ label="3bbfc7bfdbbb1ba1bfad7517",shape="hexagon",style="filled",color="green" ];
+"637E" [ label="",shape="box",style="filled",color="grey" ];
+"230" [ label="a7167d5eb5408b3839903",shape="hexagon",style="filled",color="green" ];
+"639E" [ label="8c8b5bde6",shape="box",style="filled",color="grey" ];
+"231" [ label="34d7bb6af4fcd8d630de72500c8",shape="hexagon",style="filled",color="green" ];
+"641E" [ label="32fe7eee5283",shape="box",style="filled",color="grey" ];
+"232" [ label="8e69341faa4489",shape="hexagon",style="filled",color="green" ];
+"643E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"233" [ label="459236f07c73814faf5",shape="hexagon",style="filled",color="green" ];
+"645E" [ label="18083a711d",shape="box",style="filled",color="grey" ];
+"234" [ label="c71aa521578164debd0c5",shape="hexagon",style="filled",color="green" ];
+"647E" [ label="78",shape="box",style="filled",color="grey" ];
+"235" [ label="a5520019b8a73bc141b5fd416a",shape="hexagon",style="filled",color="green" ];
+"649E" [ label="3219b6b71443",shape="box",style="filled",color="grey" ];
+"236" [ label="6c89dc59ee7aaebbbd6bb64",shape="hexagon",style="filled",color="green" ];
+"651E" [ label="8c8b5bde6",shape="box",style="filled",color="grey" ];
+"237" [ label="a9a36ef02f",shape="hexagon",style="filled",color="green" ];
+"653E" [ label="6a80cbe",shape="box",style="filled",color="grey" ];
+"238" [ label="3db761b596844f133c",shape="hexagon",style="filled",color="green" ];
+"655E" [ label="e920b915087",shape="box",style="filled",color="grey" ];
+"239" [ label="383db224d7508ef072bea21d0",shape="hexagon",style="filled",color="green" ];
+"657E" [ label="975fedfb64df",shape="box",style="filled",color="grey" ];
+"240" [ label="8e307415fb435445ced7",shape="hexagon",style="filled",color="green" ];
+"659E" [ label="21dff35936370ae5f",shape="box",style="filled",color="grey" ];
+"241" [ label="aff6d7896e0e142bbc3e78",shape="hexagon",style="filled",color="green" ];
+"661E" [ label="d2498",shape="box",style="filled",color="grey" ];
+"242" [ label="e153c6e676c7369b285b4e9033a",shape="hexagon",style="filled",color="green" ];
+"663E" [ label="",shape="box",style="filled",color="grey" ];
+"243" [ label="f3c4311de0e931f08c232b",shape="hexagon",style="filled",color="green" ];
+"665E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ];
+"244" [ label="0c72a426929600000f5",shape="hexagon",style="filled",color="green" ];
+"667E" [ label="45827dbdd8",shape="box",style="filled",color="grey" ];
+"245" [ label="38fa61352f5086d2cb51",shape="hexagon",style="filled",color="green" ];
+"669E" [ label="af0268dddd",shape="box",style="filled",color="grey" ];
+"246" [ label="ad1dd724f1c3e",shape="hexagon",style="filled",color="green" ];
+"671E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ];
+"247" [ label="11bb8ed3ae227d3acefc",shape="hexagon",style="filled",color="green" ];
+"673E" [ label="eb8",shape="box",style="filled",color="grey" ];
+"248" [ label="f2c7b3bb4d44f977d0ab8a42351",shape="hexagon",style="filled",color="green" ];
+"675E" [ label="",shape="box",style="filled",color="grey" ];
+"249" [ label="51e045ca826077ae765",shape="hexagon",style="filled",color="green" ];
+"679E" [ label="e842",shape="box",style="filled",color="grey" ];
+"250" [ label="aa0adc8978020629574",shape="hexagon",style="filled",color="green" ];
+"753E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ];
+"251" [ label="3b6b2c549de670d7bf5fc0ee",shape="hexagon",style="filled",color="green" ];
+"681E" [ label="",shape="box",style="filled",color="grey" ];
+"252" [ label="5eea496cc301b2a9721",shape="hexagon",style="filled",color="green" ];
+"683E" [ label="",shape="box",style="filled",color="grey" ];
+"253" [ label="bfc6564cbdeeffac00a141",shape="hexagon",style="filled",color="green" ];
+"685E" [ label="3b0a8a1c2e5050bd",shape="box",style="filled",color="grey" ];
+"254" [ label="c360aaeb167487c9578a8f",shape="hexagon",style="filled",color="green" ];
+"687E" [ label="d",shape="box",style="filled",color="grey" ];
+"255" [ label="39d025b265f9790490781cb201",shape="hexagon",style="filled",color="green" ];
+"689E" [ label="5e80f85274",shape="box",style="filled",color="grey" ];
+"256" [ label="b4ce21e0a3df1d097277d6",shape="hexagon",style="filled",color="green" ];
+"691E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ];
+"257" [ label="8bdb6a91c6dee925b557c705b3",shape="hexagon",style="filled",color="green" ];
+"693E" [ label="53069e384a2",shape="box",style="filled",color="grey" ];
+"258" [ label="ac487676a04e4",shape="hexagon",style="filled",color="green" ];
+"695E" [ label="a8e9",shape="box",style="filled",color="grey" ];
+"259" [ label="18115fa32ff1cb99",shape="hexagon",style="filled",color="green" ];
+"697E" [ label="45827dbdd8",shape="box",style="filled",color="grey" ];
+"260" [ label="b7b899dc8bc6a32b28cb098fa16",shape="hexagon",style="filled",color="green" ];
+"699E" [ label="32fe7eee5283",shape="box",style="filled",color="grey" ];
+"261" [ label="b69e426d974e1907e88",shape="hexagon",style="filled",color="green" ];
+"703E" [ label="e842",shape="box",style="filled",color="grey" ];
+"262" [ label="60d0128bdb61ae40e98638bd1391",shape="hexagon",style="filled",color="green" ];
+"705E" [ label="23ad1",shape="box",style="filled",color="grey" ];
+"264" [ label="8fb60d769e4c387",shape="hexagon",style="filled",color="green" ];
+"709E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ];
+"265" [ label="e1fa7f549e5a0893bb42da5",shape="hexagon",style="filled",color="green" ];
+"711E" [ label="6a3c6921b0aeceda3",shape="box",style="filled",color="grey" ];
+"266" [ label="a77622f2ff77ffeeb2",shape="hexagon",style="filled",color="green" ];
+"713E" [ label="21dff35936370ae5f",shape="box",style="filled",color="grey" ];
+"267" [ label="30d9d350943c0e3ff7594b50",shape="hexagon",style="filled",color="green" ];
+"715E" [ label="b5e86c73d1198f",shape="box",style="filled",color="grey" ];
+"268" [ label="89ced1a7906d58d687d5a04",shape="hexagon",style="filled",color="green" ];
+"717E" [ label="c0174bbe7ae8",shape="box",style="filled",color="grey" ];
+"269" [ label="1de26f6b12b0d292f94184",shape="hexagon",style="filled",color="green" ];
+"719E" [ label="65fd8495",shape="box",style="filled",color="grey" ];
+"270" [ label="26fa7360ab81be9d4434a",shape="hexagon",style="filled",color="green" ];
+"721E" [ label="af0268dddd",shape="box",style="filled",color="grey" ];
+"272" [ label="4a9d79c960b8d33e39251e5f66",shape="hexagon" ];
+"34E" [ label="330342f283ef2",shape="box",style="filled",color="grey" ];
+"252E" [ label="3dafb9a29c00",shape="box",style="filled",color="grey" ];
+"436E" [ label="8d5137b16a",shape="box",style="filled",color="grey" ];
+"274" [ label="10a7d61c201c67a5e78542807cd",shape="hexagon" ];
+"59E" [ label="ef6361295eba07",shape="box",style="filled",color="grey" ];
+"500E" [ label="a8f0fe2eb7bc1471",shape="box",style="filled",color="grey" ];
+"720E" [ label="cfff3acd8e9d",shape="box",style="filled",color="grey" ];
+"275" [ label="f8ff39eab120851f143bf19",shape="hexagon" ];
+"98E" [ label="4e3cfd27a",shape="box",style="filled",color="grey" ];
+"278" [ label="4995c71223c9f6067324d387a2",shape="hexagon" ];
+"35E" [ label="57948adb5dead",shape="box",style="filled",color="grey" ];
+"488E" [ label="a738ba39",shape="box",style="filled",color="grey" ];
+"598E" [ label="be7d637c50c",shape="box",style="filled",color="grey" ];
+"604E" [ label="8d52f183ec",shape="box",style="filled",color="grey" ];
+"628E" [ label="cef12b6",shape="box",style="filled",color="grey" ];
+"279" [ label="b9ae94e6935503603341ecf4",shape="hexagon" ];
+"99E" [ label="14a3c17f3d",shape="box",style="filled",color="grey" ];
+"280" [ label="fd28c194a46fde909b019c52f",shape="hexagon" ];
+"242E" [ label="9fe65061641",shape="box",style="filled",color="grey" ];
+"270E" [ label="34d06d1ed6",shape="box",style="filled",color="grey" ];
+"272E" [ label="713db1c1",shape="box",style="filled",color="grey" ];
+"284E" [ label="90dccb18c0",shape="box",style="filled",color="grey" ];
+"286E" [ label="e17fea65",shape="box",style="filled",color="grey" ];
+"288E" [ label="aebb7b91b",shape="box",style="filled",color="grey" ];
+"586E" [ label="4348f3abcb7716",shape="box",style="filled",color="grey" ];
+"763E" [ label="b082f7a5ff",shape="box",style="filled",color="grey" ];
+"281" [ label="7c0ab977f5a3c4ab6d625f5033",shape="hexagon" ];
+"45E" [ label="20949455f573f",shape="box",style="filled",color="grey" ];
+"470E" [ label="c338481d79773",shape="box",style="filled",color="grey" ];
+"670E" [ label="e1d01ef89f",shape="box",style="filled",color="grey" ];
+"722E" [ label="c4507c22d19",shape="box",style="filled",color="grey" ];
+"282" [ label="7e0b91491c8c8566892cd9a0889",shape="hexagon" ];
+"103E" [ label="de9efa12873949",shape="box",style="filled",color="grey" ];
+"283" [ label="d58478d9c273ad4f4b2e091324",shape="hexagon" ];
+"165E" [ label="1a220eb692c",shape="box",style="filled",color="grey" ];
+"284" [ label="8be0efdd94a6383e87fbfded4f",shape="hexagon" ];
+"39E" [ label="c8a6c26d4fd9f",shape="box",style="filled",color="grey" ];
+"224E" [ label="8cbae42a3900",shape="box",style="filled",color="grey" ];
+"268E" [ label="fc73",shape="box",style="filled",color="grey" ];
+"632E" [ label="",shape="box",style="filled",color="grey" ];
+"710E" [ label="102f1",shape="box",style="filled",color="grey" ];
+"285" [ label="3aeb78ea51020a44f2d2615436dae",shape="hexagon" ];
+"53E" [ label="96deede0c6b44119",shape="box",style="filled",color="grey" ];
+"286" [ label="6bbd5b422edb8e358dcc20eecf9",shape="hexagon" ];
+"38E" [ label="4f2de229621272",shape="box",style="filled",color="grey" ];
+"166E" [ label="d495de0b35f6",shape="box",style="filled",color="grey" ];
+"288" [ label="4856000a6802ddfc121ef40432297",shape="hexagon",style="filled",color="#ff0000" ];
+"40E" [ label="04904a458422a5b9",shape="box",style="filled",color="grey" ];
+"218E" [ label="8cd4d",shape="box",style="filled",color="grey" ];
+"244E" [ label="",shape="box",style="filled",color="grey" ];
+"246E" [ label="9be88247",shape="box",style="filled",color="grey" ];
+"258E" [ label="4f05b",shape="box",style="filled",color="grey" ];
+"290E" [ label="8b092",shape="box",style="filled",color="grey" ];
+"292E" [ label="c3bbf4",shape="box",style="filled",color="grey" ];
+"308E" [ label="6331b3f",shape="box",style="filled",color="grey" ];
+"318E" [ label="",shape="box",style="filled",color="grey" ];
+"388E" [ label="3711",shape="box",style="filled",color="grey" ];
+"472E" [ label="c5255d",shape="box",style="filled",color="grey" ];
+"478E" [ label="5c6a2",shape="box",style="filled",color="grey" ];
+"566E" [ label="51ec95518d1b3",shape="box",style="filled",color="grey" ];
+"570E" [ label="82a65ed4b69",shape="box",style="filled",color="grey" ];
+"574E" [ label="05fed5e",shape="box",style="filled",color="grey" ];
+"608E" [ label="bf",shape="box",style="filled",color="grey" ];
+"614E" [ label="ce",shape="box",style="filled",color="grey" ];
+"658E" [ label="1a830d9f",shape="box",style="filled",color="grey" ];
+"664E" [ label="",shape="box",style="filled",color="grey" ];
+"682E" [ label="",shape="box",style="filled",color="grey" ];
+"289" [ label="2e31175cbd52fcd08360fe86d20",shape="hexagon" ];
+"41E" [ label="4ad5d68f07981a",shape="box",style="filled",color="grey" ];
+"636E" [ label="51192117f9b4",shape="box",style="filled",color="grey" ];
+"642E" [ label="6bf214d9e7fa5f2df",shape="box",style="filled",color="grey" ];
+"690E" [ label="558d8534f92fddfe",shape="box",style="filled",color="grey" ];
+"700E" [ label="6819fd5a6cdd280dd",shape="box",style="filled",color="grey" ];
+"290" [ label="3aa0ce5efcf79bc3ecced1886e89",shape="hexagon" ];
+"56E" [ label="ff9d64ddf49a20f",shape="box",style="filled",color="grey" ];
+"264E" [ label="6c93f24516f01d",shape="box",style="filled",color="grey" ];
+"510E" [ label="32b98f11f3d01d6",shape="box",style="filled",color="grey" ];
+"718E" [ label="8f7c875500073",shape="box",style="filled",color="grey" ];
+"291" [ label="7c1767485953d9c2",shape="hexagon" ];
+"66E" [ label="086",shape="box",style="filled",color="grey" ];
+"76E" [ label="",shape="box",style="filled",color="grey" ];
+"610E" [ label="450d3a2d49cbfd",shape="box",style="filled",color="grey" ];
+"292" [ label="9c1305d59c37e9be9f13d7d049c",shape="hexagon" ];
+"73E" [ label="817",shape="box",style="filled",color="grey" ];
+"293" [ label="efe092824916a5637ee35d439589",shape="hexagon" ];
+"49E" [ label="",shape="box",style="filled",color="grey" ];
+"214E" [ label="",shape="box",style="filled",color="grey" ];
+"216E" [ label="",shape="box",style="filled",color="grey" ];
+"236E" [ label="",shape="box",style="filled",color="grey" ];
+"278E" [ label="",shape="box",style="filled",color="grey" ];
+"358E" [ label="",shape="box",style="filled",color="grey" ];
+"398E" [ label="",shape="box",style="filled",color="grey" ];
+"400E" [ label="",shape="box",style="filled",color="grey" ];
+"402E" [ label="",shape="box",style="filled",color="grey" ];
+"404E" [ label="",shape="box",style="filled",color="grey" ];
+"406E" [ label="",shape="box",style="filled",color="grey" ];
+"408E" [ label="",shape="box",style="filled",color="grey" ];
+"412E" [ label="",shape="box",style="filled",color="grey" ];
+"438E" [ label="",shape="box",style="filled",color="grey" ];
+"448E" [ label="",shape="box",style="filled",color="grey" ];
+"476E" [ label="",shape="box",style="filled",color="grey" ];
+"504E" [ label="",shape="box",style="filled",color="grey" ];
+"552E" [ label="",shape="box",style="filled",color="grey" ];
+"634E" [ label="",shape="box",style="filled",color="grey" ];
+"768E" [ label="",shape="box",style="filled",color="grey" ];
+"295" [ label="70815f0352b43dc1562133ab6eb",shape="hexagon",style="filled",color="#A52A2A" ];
+"44E" [ label="ef2d4636934472",shape="box",style="filled",color="grey" ];
+"92E" [ label="22bd92e302816",shape="box",style="filled",color="grey" ];
+"250E" [ label="74e86",shape="box",style="filled",color="grey" ];
+"316E" [ label="",shape="box",style="filled",color="grey" ];
+"380E" [ label="",shape="box",style="filled",color="grey" ];
+"424E" [ label="c",shape="box",style="filled",color="grey" ];
+"442E" [ label="a5a",shape="box",style="filled",color="grey" ];
+"446E" [ label="bce",shape="box",style="filled",color="grey" ];
+"454E" [ label="",shape="box",style="filled",color="grey" ];
+"460E" [ label="",shape="box",style="filled",color="grey" ];
+"462E" [ label="",shape="box",style="filled",color="grey" ];
+"648E" [ label="",shape="box",style="filled",color="grey" ];
+"656E" [ label="e9",shape="box",style="filled",color="grey" ];
+"666E" [ label="b701e7",shape="box",style="filled",color="grey" ];
+"692E" [ label="f2e7cc",shape="box",style="filled",color="grey" ];
+"712E" [ label="8a9eb2806b0aa",shape="box",style="filled",color="grey" ];
+"296" [ label="e287d497450664a4c0f4efc338",shape="hexagon",style="filled",color="#ff0000" ];
+"47E" [ label="06eff1db45cdf",shape="box",style="filled",color="grey" ];
+"330E" [ label="c0f34a600",shape="box",style="filled",color="grey" ];
+"514E" [ label="bd7aca295ca",shape="box",style="filled",color="grey" ];
+"516E" [ label="0da9135",shape="box",style="filled",color="grey" ];
+"518E" [ label="fe821bce",shape="box",style="filled",color="grey" ];
+"520E" [ label="e64f22a31",shape="box",style="filled",color="grey" ];
+"522E" [ label="46e412a3",shape="box",style="filled",color="grey" ];
+"526E" [ label="99da1f8a5",shape="box",style="filled",color="grey" ];
+"528E" [ label="0f167280",shape="box",style="filled",color="grey" ];
+"530E" [ label="82d201",shape="box",style="filled",color="grey" ];
+"532E" [ label="1d529eb4",shape="box",style="filled",color="grey" ];
+"534E" [ label="",shape="box",style="filled",color="grey" ];
+"536E" [ label="bf141dbce",shape="box",style="filled",color="grey" ];
+"538E" [ label="e3fd0c7b3",shape="box",style="filled",color="grey" ];
+"540E" [ label="c96cb3",shape="box",style="filled",color="grey" ];
+"542E" [ label="0fabab47",shape="box",style="filled",color="grey" ];
+"544E" [ label="1b82200",shape="box",style="filled",color="grey" ];
+"297" [ label="2ced414a91575a48f2dd29a",shape="hexagon" ];
+"46E" [ label="85221d5e9e",shape="box",style="filled",color="grey" ];
+"93E" [ label="97a7eea3f",shape="box",style="filled",color="grey" ];
+"206E" [ label="4d22e1",shape="box",style="filled",color="grey" ];
+"426E" [ label="e65185ca",shape="box",style="filled",color="grey" ];
+"550E" [ label="",shape="box",style="filled",color="grey" ];
+"706E" [ label="a9012b7bb5",shape="box",style="filled",color="grey" ];
+"298" [ label="38f162cf917ce7298663a1f1c607",shape="hexagon" ];
+"36E" [ label="a031c9192ae8e75",shape="box",style="filled",color="grey" ];
+"95E" [ label="062fc905b9eb35",shape="box",style="filled",color="grey" ];
+"364E" [ label="c8fc17180bea86",shape="box",style="filled",color="grey" ];
+"394E" [ label="09e64744536c5e1",shape="box",style="filled",color="grey" ];
+"420E" [ label="af4a1fac3e2076",shape="box",style="filled",color="grey" ];
+"456E" [ label="238805e2194c3",shape="box",style="filled",color="grey" ];
+"624E" [ label="73e6ed83012",shape="box",style="filled",color="grey" ];
+"299" [ label="549fa15d68f0b3bee6192f888cd8",shape="hexagon" ];
+"48E" [ label="d17f8f4eeb8e63d",shape="box",style="filled",color="grey" ];
+"168E" [ label="cca7040e47789",shape="box",style="filled",color="grey" ];
+"260E" [ label="47ebc3f17",shape="box",style="filled",color="grey" ];
+"282E" [ label="cf5a6049ad",shape="box",style="filled",color="grey" ];
+"554E" [ label="2a47a6a27",shape="box",style="filled",color="grey" ];
+"590E" [ label="eff3468631dd4",shape="box",style="filled",color="grey" ];
+"767E" [ label="efb52b499303115c33fd",shape="box",style="filled",color="grey" ];
+"300" [ label="8593dcf973b110d00cecdc1e756",shape="hexagon",style="filled",color="#ff7f00" ];
+"62E" [ label="472a156cf2b55f",shape="box",style="filled",color="grey" ];
+"190E" [ label="647",shape="box",style="filled",color="grey" ];
+"226E" [ label="",shape="box",style="filled",color="grey" ];
+"238E" [ label="8a",shape="box",style="filled",color="grey" ];
+"254E" [ label="",shape="box",style="filled",color="grey" ];
+"256E" [ label="",shape="box",style="filled",color="grey" ];
+"262E" [ label="",shape="box",style="filled",color="grey" ];
+"266E" [ label="e8b",shape="box",style="filled",color="grey" ];
+"274E" [ label="",shape="box",style="filled",color="grey" ];
+"276E" [ label="f",shape="box",style="filled",color="grey" ];
+"294E" [ label="",shape="box",style="filled",color="grey" ];
+"296E" [ label="",shape="box",style="filled",color="grey" ];
+"310E" [ label="1b34fb150",shape="box",style="filled",color="grey" ];
+"320E" [ label="",shape="box",style="filled",color="grey" ];
+"322E" [ label="a7d2",shape="box",style="filled",color="grey" ];
+"332E" [ label="",shape="box",style="filled",color="grey" ];
+"340E" [ label="",shape="box",style="filled",color="grey" ];
+"344E" [ label="f55670",shape="box",style="filled",color="grey" ];
+"346E" [ label="1ed67841",shape="box",style="filled",color="grey" ];
+"348E" [ label="07283",shape="box",style="filled",color="grey" ];
+"374E" [ label="73ba1714ee",shape="box",style="filled",color="grey" ];
+"378E" [ label="27709106",shape="box",style="filled",color="grey" ];
+"452E" [ label="93ea0",shape="box",style="filled",color="grey" ];
+"508E" [ label="",shape="box",style="filled",color="grey" ];
+"524E" [ label="1d792d81",shape="box",style="filled",color="grey" ];
+"612E" [ label="a",shape="box",style="filled",color="grey" ];
+"626E" [ label="",shape="box",style="filled",color="grey" ];
+"638E" [ label="",shape="box",style="filled",color="grey" ];
+"644E" [ label="",shape="box",style="filled",color="grey" ];
+"654E" [ label="",shape="box",style="filled",color="grey" ];
+"672E" [ label="",shape="box",style="filled",color="grey" ];
+"302" [ label="23f94655294d3ff537f2915fa",shape="hexagon" ];
+"797E" [ label="",shape="box",style="filled",color="grey" ];
+"798E" [ label="a2eab7c9fa641e5f",shape="box",style="filled",color="grey" ];
+"303" [ label="a9058241db5b6b6c25569acdf5",shape="hexagon" ];
+"52E" [ label="b2babf3244213",shape="box",style="filled",color="grey" ];
+"650E" [ label="b354cd9e9dbb0bfa",shape="box",style="filled",color="grey" ];
+"304" [ label="bdbdb31bd777fb65dd6dd2d0e7",shape="hexagon" ];
+"50E" [ label="3bec1c012b498",shape="box",style="filled",color="grey" ];
+"640E" [ label="c54f0fc1e05",shape="box",style="filled",color="grey" ];
+"646E" [ label="9ab6c66dc",shape="box",style="filled",color="grey" ];
+"652E" [ label="699e3db878047",shape="box",style="filled",color="grey" ];
+"306" [ label="1d4ea80c7194689d69f9592186",shape="hexagon" ];
+"55E" [ label="8066f87a88f4e",shape="box",style="filled",color="grey" ];
+"220E" [ label="3a8173d6c",shape="box",style="filled",color="grey" ];
+"338E" [ label="24dfe1a997a",shape="box",style="filled",color="grey" ];
+"368E" [ label="65a1",shape="box",style="filled",color="grey" ];
+"486E" [ label="59a8b435ccd",shape="box",style="filled",color="grey" ];
+"490E" [ label="86e9b0428",shape="box",style="filled",color="grey" ];
+"562E" [ label="5a7a610a8a",shape="box",style="filled",color="grey" ];
+"564E" [ label="8f143077e",shape="box",style="filled",color="grey" ];
+"600E" [ label="6472c2861e0e0dd681",shape="box",style="filled",color="grey" ];
+"668E" [ label="f0f45e707",shape="box",style="filled",color="grey" ];
+"674E" [ label="95e93c4a13",shape="box",style="filled",color="grey" ];
+"698E" [ label="33e1de",shape="box",style="filled",color="grey" ];
+"307" [ label="7204950f6233bf9c9e1f00d4a870",shape="hexagon" ];
+"107E" [ label="ccceeef40edda78",shape="box",style="filled",color="grey" ];
+"308" [ label="a2c4b1d72e2da483a86ae0c62e5",shape="hexagon" ];
+"108E" [ label="eedc819a68add6",shape="box",style="filled",color="grey" ];
+"309" [ label="f603819d560c5603259aa05dca",shape="hexagon" ];
+"109E" [ label="acacfc83af504",shape="box",style="filled",color="grey" ];
+"310" [ label="2f43cba12702078b4e0d3bfdae2bc",shape="hexagon" ];
+"110E" [ label="3c1edc8de4795936",shape="box",style="filled",color="grey" ];
+"311" [ label="8f9cdc26798117dd3e9ee4a8770",shape="hexagon" ];
+"58E" [ label="881d373",shape="box",style="filled",color="grey" ];
+"234E" [ label="",shape="box",style="filled",color="grey" ];
+"300E" [ label="",shape="box",style="filled",color="grey" ];
+"306E" [ label="8c7cd9b93b1cbe48e1",shape="box",style="filled",color="grey" ];
+"314E" [ label="616d8a7b",shape="box",style="filled",color="grey" ];
+"342E" [ label="",shape="box",style="filled",color="grey" ];
+"354E" [ label="",shape="box",style="filled",color="grey" ];
+"370E" [ label="",shape="box",style="filled",color="grey" ];
+"382E" [ label="",shape="box",style="filled",color="grey" ];
+"422E" [ label="",shape="box",style="filled",color="grey" ];
+"444E" [ label="",shape="box",style="filled",color="grey" ];
+"582E" [ label="",shape="box",style="filled",color="grey" ];
+"620E" [ label="",shape="box",style="filled",color="grey" ];
+"630E" [ label="",shape="box",style="filled",color="grey" ];
+"684E" [ label="",shape="box",style="filled",color="grey" ];
+"696E" [ label="",shape="box",style="filled",color="grey" ];
+"801E" [ label="",shape="box",style="filled",color="grey" ];
+"312" [ label="97c9d726e27304311901a52ce",shape="hexagon",style="filled",color="#ff0000" ];
+"42E" [ label="1112164c2f7a",shape="box",style="filled",color="grey" ];
+"192E" [ label="5c609b12c",shape="box",style="filled",color="grey" ];
+"194E" [ label="00265",shape="box",style="filled",color="grey" ];
+"196E" [ label="04767",shape="box",style="filled",color="grey" ];
+"198E" [ label="f0d99f16",shape="box",style="filled",color="grey" ];
+"200E" [ label="",shape="box",style="filled",color="grey" ];
+"202E" [ label="6e186b",shape="box",style="filled",color="grey" ];
+"204E" [ label="d382",shape="box",style="filled",color="grey" ];
+"312E" [ label="c6b5321a",shape="box",style="filled",color="grey" ];
+"336E" [ label="",shape="box",style="filled",color="grey" ];
+"376E" [ label="",shape="box",style="filled",color="grey" ];
+"384E" [ label="aeb8",shape="box",style="filled",color="grey" ];
+"386E" [ label="2e53009d4a375",shape="box",style="filled",color="grey" ];
+"428E" [ label="",shape="box",style="filled",color="grey" ];
+"474E" [ label="",shape="box",style="filled",color="grey" ];
+"484E" [ label="",shape="box",style="filled",color="grey" ];
+"546E" [ label="dea1d1",shape="box",style="filled",color="grey" ];
+"548E" [ label="5a0b4b906a",shape="box",style="filled",color="grey" ];
+"314" [ label="1727041c622518c9dd24f7c211",shape="hexagon" ];
+"113E" [ label="49704867bee95",shape="box",style="filled",color="grey" ];
+"315" [ label="31f2f9aef958979f9f3532b9b",shape="hexagon",style="filled",color="#ff0000" ];
+"43E" [ label="47cd70f",shape="box",style="filled",color="grey" ];
+"240E" [ label="248df40dae",shape="box",style="filled",color="grey" ];
+"298E" [ label="",shape="box",style="filled",color="grey" ];
+"334E" [ label="9dd5bf47f",shape="box",style="filled",color="grey" ];
+"360E" [ label="",shape="box",style="filled",color="grey" ];
+"390E" [ label="28533c",shape="box",style="filled",color="grey" ];
+"418E" [ label="",shape="box",style="filled",color="grey" ];
+"492E" [ label="a4c7d0",shape="box",style="filled",color="grey" ];
+"502E" [ label="4f6f7f",shape="box",style="filled",color="grey" ];
+"584E" [ label="7ab64a969",shape="box",style="filled",color="grey" ];
+"588E" [ label="",shape="box",style="filled",color="grey" ];
+"602E" [ label="69",shape="box",style="filled",color="grey" ];
+"606E" [ label="67513d",shape="box",style="filled",color="grey" ];
+"662E" [ label="cf",shape="box",style="filled",color="grey" ];
+"316" [ label="a54092a3033f7d5e41e0a76c1",shape="hexagon" ];
+"51E" [ label="1467f017b74e",shape="box",style="filled",color="grey" ];
+"317" [ label="2043b477ac0393676a4309514d0",shape="hexagon" ];
+"116E" [ label="bdec8c86db51b9",shape="box",style="filled",color="grey" ];
+"318" [ label="ab48d1f65812bc0f8ab6941c3b5",shape="hexagon" ];
+"74E" [ label="81",shape="box",style="filled",color="grey" ];
+"319" [ label="ca3d67754cf62fdafbf0a1e0",shape="hexagon" ];
+"57E" [ label="75b14f1719d",shape="box",style="filled",color="grey" ];
+"94E" [ label="62f36ea98a",shape="box",style="filled",color="grey" ];
+"350E" [ label="e3a76d31ca59a",shape="box",style="filled",color="grey" ];
+"440E" [ label="b3cadc253f7",shape="box",style="filled",color="grey" ];
+"466E" [ label="fb58e11",shape="box",style="filled",color="grey" ];
+"676E" [ label="8606837526d81cdec",shape="box",style="filled",color="grey" ];
+"320" [ label="a7a7f3681dad1250b01cf80bc17",shape="hexagon" ];
+"60E" [ label="2c514b0cd8f7d3",shape="box",style="filled",color="grey" ];
+"366E" [ label="7e494b",shape="box",style="filled",color="grey" ];
+"434E" [ label="15d44ab97",shape="box",style="filled",color="grey" ];
+"458E" [ label="78b2d75d00166",shape="box",style="filled",color="grey" ];
+"618E" [ label="761e0f72f95",shape="box",style="filled",color="grey" ];
+"321" [ label="275afb2b215b966d9fac51b96b9",shape="hexagon" ];
+"72E" [ label="ac284d73563",shape="box",style="filled",color="grey" ];
+"362E" [ label="7e74e1587f3a4d208",shape="box",style="filled",color="grey" ];
+"372E" [ label="ffd1b1af3b6864078f3",shape="box",style="filled",color="grey" ];
+"572E" [ label="b38049e00",shape="box",style="filled",color="grey" ];
+"322" [ label="c3c93c700edc0cb4f95f03c04",shape="hexagon" ];
+"54E" [ label="99237fce1358",shape="box",style="filled",color="grey" ];
+"222E" [ label="3dcf8f454",shape="box",style="filled",color="grey" ];
+"302E" [ label="c5acd20cad2",shape="box",style="filled",color="grey" ];
+"556E" [ label="6c998bf2a5edd",shape="box",style="filled",color="grey" ];
+"558E" [ label="4b683",shape="box",style="filled",color="grey" ];
+"323" [ label="63a3d4fb9d38a0182be6e39e76",shape="hexagon" ];
+"37E" [ label="bba6e6e194ccf",shape="box",style="filled",color="grey" ];
+"208E" [ label="01938827",shape="box",style="filled",color="grey" ];
+"210E" [ label="9",shape="box",style="filled",color="grey" ];
+"352E" [ label="64ef1d545",shape="box",style="filled",color="grey" ];
+"450E" [ label="b473716",shape="box",style="filled",color="grey" ];
+"568E" [ label="7c13bf753da",shape="box",style="filled",color="grey" ];
+"576E" [ label="4e4a79111d",shape="box",style="filled",color="grey" ];
+"686E" [ label="af4abb0d6a99",shape="box",style="filled",color="grey" ];
+"324" [ label="4399cf78123dedd0dfe9776104",shape="hexagon" ];
+"228E" [ label="af9c489df53",shape="box",style="filled",color="grey" ];
+"248E" [ label="3703059dbc5a8",shape="box",style="filled",color="grey" ];
+"304E" [ label="8a46e6",shape="box",style="filled",color="grey" ];
+"468E" [ label="f9d09",shape="box",style="filled",color="grey" ];
+"578E" [ label="cd1e9af3dec2",shape="box",style="filled",color="grey" ];
+"660E" [ label="9e650e89bb",shape="box",style="filled",color="grey" ];
+"688E" [ label="f62b136b2171",shape="box",style="filled",color="grey" ];
+"694E" [ label="4727c415d06bcbef",shape="box",style="filled",color="grey" ];
+"714E" [ label="38b3b0d9",shape="box",style="filled",color="grey" ];
+"766E" [ label="a153512d982",shape="box",style="filled",color="grey" ];
+"325" [ label="40f253cd228f7ac2d0aee",shape="hexagon" ];
+"97E" [ label="a3ff993",shape="box",style="filled",color="grey" ];
+"506E" [ label="7528dd86b",shape="box",style="filled",color="grey" ];
+"326" [ label="89a2505da6179a80202d4a6c3",shape="hexagon" ];
+"61E" [ label="75eea05672a5",shape="box",style="filled",color="grey" ];
+"175E" [ label="3b0c08dd2ca",shape="box",style="filled",color="grey" ];
+"482E" [ label="a3781072b",shape="box",style="filled",color="grey" ];
+"328" [ label="2601085bde1b2450d64509f36",shape="hexagon" ];
+"75E" [ label="0efbd",shape="box",style="filled",color="grey" ];
+"580E" [ label="bb92d1da1f38d52f8ff",shape="box",style="filled",color="grey" ];
+"329" [ label="5c81103c751345d0ee0f4bd",shape="hexagon" ];
+"96E" [ label="b23526044",shape="box",style="filled",color="grey" ];
+"330" [ label="fcbd9ad14139718bc6fcc8b4",shape="hexagon" ];
+"100E" [ label="73ca543bf1",shape="box",style="filled",color="grey" ];
+"170E" [ label="c2f32e2cf9",shape="box",style="filled",color="grey" ];
+"333" [ label="44cbb41a9cfc15497eacd294",color="yellow",style="filled",shape="doubleoctagon" ];
+"63E" [ label="6a91",shape="box",style="filled",color="grey" ];
+"67E" [ label="b074e",shape="box",style="filled",color="grey" ];
+"68E" [ label="06209",shape="box",style="filled",color="grey" ];
+"69E" [ label="58e3dcc618",shape="box",style="filled",color="grey" ];
+"70E" [ label="eee44624da",shape="box",style="filled",color="grey" ];
+"71E" [ label="6a91",shape="box",style="filled",color="grey" ];
+"802E" [ label="e1e8c",shape="box",style="filled",color="grey" ];
+"793E" [ label="",shape="box",style="filled",color="grey" ];
+"334" [ label="b46b0756dba915943839e90a55",color="yellow",style="filled",shape="doubleoctagon" ];
+"64E" [ label="5fdf",shape="box",style="filled",color="grey" ];
+"81E" [ label="3eca1f94dc181",shape="box",style="filled",color="grey" ];
+"82E" [ label="6b1bb9b0e",shape="box",style="filled",color="grey" ];
+"83E" [ label="a54d477232",shape="box",style="filled",color="grey" ];
+"84E" [ label="a164d9f60fbbdd",shape="box",style="filled",color="grey" ];
+"85E" [ label="78c8463ea",shape="box",style="filled",color="grey" ];
+"86E" [ label="c110ba7",shape="box",style="filled",color="grey" ];
+"87E" [ label="3b63cdc0f",shape="box",style="filled",color="grey" ];
+"88E" [ label="6f578c5128",shape="box",style="filled",color="grey" ];
+"89E" [ label="3e048573fd",shape="box",style="filled",color="grey" ];
+"336" [ URL="tes hi",area="test",label="825c7994d5da13afe519861818",color="#ff0000",style="filled",shape="tripleoctagon" ];
+"1E" [ label="f4bef37b6a94bfd00",shape="box",style="filled",color="grey" ];
+"2E" [ label="d2647f8b6d8661d08",shape="box",style="filled",color="grey" ];
+"3E" [ label="964cb56d8f69ff058",shape="box",style="filled",color="grey" ];
+"4E" [ label="4f35e206816c3bd22",shape="box",style="filled",color="grey" ];
+"5E" [ label="affb2d716803a2d3e",shape="box",style="filled",color="grey" ];
+"6E" [ label="e4ae306d9bd669c70",shape="box",style="filled",color="grey" ];
+"7E" [ label="4dbf4395236fb03ed",shape="box",style="filled",color="grey" ];
+"8E" [ label="15b3ad672cd2f713a",shape="box",style="filled",color="grey" ];
+"9E" [ label="8d6e6e0cd9b842a47",shape="box",style="filled",color="grey" ];
+"10E" [ label="00d0dd018fe879f96",shape="box",style="filled",color="grey" ];
+"11E" [ label="f28b78d4803c",shape="box",style="filled",color="grey" ];
+"12E" [ label="2d886da042b5384b4",shape="box",style="filled",color="grey" ];
+"13E" [ label="548c0081a62132b44",shape="box",style="filled",color="grey" ];
+"14E" [ label="52126553e52385d16",shape="box",style="filled",color="grey" ];
+"15E" [ label="9fe716e738eaea34e",shape="box",style="filled",color="grey" ];
+"16E" [ label="5782807b5f575e0a8",shape="box",style="filled",color="grey" ];
+"17E" [ label="792fd6f9df1fa1e33",shape="box",style="filled",color="grey" ];
+"18E" [ label="c471b6fdbfb852661",shape="box",style="filled",color="grey" ];
+"19E" [ label="a84844dfd0052b3b5",shape="box",style="filled",color="grey" ];
+"20E" [ label="724dabdce9744d061",shape="box",style="filled",color="grey" ];
+"21E" [ label="57f7fd2eecec93c8b",shape="box",style="filled",color="grey" ];
+"22E" [ label="baba65f670ee34a88",shape="box",style="filled",color="grey" ];
+"23E" [ label="ac34ec0f0488b17ec",shape="box",style="filled",color="grey" ];
+"24E" [ label="51e74bec5513083bb",shape="box",style="filled",color="grey" ];
+"25E" [ label="8e2d970b2f820ee35",shape="box",style="filled",color="grey" ];
+"26E" [ label="19398d3cd6b9c674f",shape="box",style="filled",color="grey" ];
+"27E" [ label="6505e29f4a11d9530",shape="box",style="filled",color="grey" ];
+"28E" [ label="bc4824f07a9d2bba6",shape="box",style="filled",color="grey" ];
+"29E" [ label="3acbf8a1537e4e1a1",shape="box",style="filled",color="grey" ];
+"30E" [ label="536264e787cf70469",shape="box",style="filled",color="grey" ];
+"31E" [ label="d",shape="box",style="filled",color="grey" ];
+"65E" [ label="d4b2",shape="box",style="filled",color="grey" ];
+"119E" [ label="2a9caef7",shape="box",style="filled",color="grey" ];
+"150E" [ label="73d12",shape="box",style="filled",color="grey" ];
+"176E" [ label="8896166adc0",shape="box",style="filled",color="grey" ];
+"743E" [ label="9f",shape="box",style="filled",color="grey" ];
+"744E" [ label="2e1313c",shape="box",style="filled",color="grey" ];
+"764E" [ label="cd6",shape="box",style="filled",color="grey" ];
+"337" [ label="8304a439f91fc90b3fe8dd35be8",color="yellow",style="filled",shape="doubleoctagon" ];
+"120E" [ label="345d26b3f821fe",shape="box",style="filled",color="grey" ];
+"121E" [ label="357679fea1e2f",shape="box",style="filled",color="grey" ];
+"122E" [ label="c71043819b6a79",shape="box",style="filled",color="grey" ];
+"123E" [ label="f9df653b86fb8df",shape="box",style="filled",color="grey" ];
+"124E" [ label="020df871874cd",shape="box",style="filled",color="grey" ];
+"125E" [ label="4c52fdd8e396692",shape="box",style="filled",color="grey" ];
+"126E" [ label="8b98c3ddbe0b336",shape="box",style="filled",color="grey" ];
+"127E" [ label="d9f4abac731a9e",shape="box",style="filled",color="grey" ];
+"128E" [ label="50f4d9b97aefe",shape="box",style="filled",color="grey" ];
+"129E" [ label="ea920d9f5b295119",shape="box",style="filled",color="grey" ];
+"130E" [ label="ff5c9b242337c",shape="box",style="filled",color="grey" ];
+"131E" [ label="4e12f7ff0918",shape="box",style="filled",color="grey" ];
+"132E" [ label="ee3b6be71d59b",shape="box",style="filled",color="grey" ];
+"133E" [ label="615cd6b5e3d21c",shape="box",style="filled",color="grey" ];
+"134E" [ label="6d52dd1b198bb",shape="box",style="filled",color="grey" ];
+"135E" [ label="8c932e1e502dca",shape="box",style="filled",color="grey" ];
+"136E" [ label="e84330eef281284a",shape="box",style="filled",color="grey" ];
+"137E" [ label="85fc23f1c88b4",shape="box",style="filled",color="grey" ];
+"138E" [ label="5997cb0c083422",shape="box",style="filled",color="grey" ];
+"339" [ label="b1ffbabb24d71f67d1e0ce23c51",color="yellow",style="filled",shape="doubleoctagon" ];
+"151E" [ label="",shape="box",style="filled",color="grey" ];
+"153E" [ label="41a8b095c7fd3",shape="box",style="filled",color="grey" ];
+"154E" [ label="151bcc2a8de7ea634",shape="box",style="filled",color="grey" ];
+"155E" [ label="6c541cad8de1b15",shape="box",style="filled",color="grey" ];
+"156E" [ label="c935c7f4d1090ac",shape="box",style="filled",color="grey" ];
+"157E" [ label="5ce1fcfb042b",shape="box",style="filled",color="grey" ];
+"158E" [ label="531806429433",shape="box",style="filled",color="grey" ];
+"159E" [ label="d285240b89cb",shape="box",style="filled",color="grey" ];
+"160E" [ label="f22c27c0f0a54e",shape="box",style="filled",color="grey" ];
+"161E" [ label="8d0d8314d211d80",shape="box",style="filled",color="grey" ];
+"162E" [ label="",shape="box",style="filled",color="grey" ];
+"347" [ label="9652ab8b55fdb2a36d1f3fe020",shape="hexagon" ];
+"139E" [ label="ef8b68bb5772f3",shape="box",style="filled",color="grey" ];
+"795E" [ label="16c3ae29c0bc713",shape="box",style="filled",color="grey" ];
+"348" [ label="676bbe7d1c1fb71742df534ce8",shape="hexagon" ];
+"799E" [ label="a78eb40ae56aaa9",shape="box",style="filled",color="grey" ];
+"800E" [ label="6aae8d25951",shape="box",style="filled",color="grey" ];
+"349" [ label="66c0220688a999aaf7f1702d1",shape="hexagon" ];
+"141E" [ label="67b6a4dca3a6d",shape="box",style="filled",color="grey" ];
+"350" [ label="1322fb0818783e6f9a4f173d47c52",shape="hexagon" ];
+"142E" [ label="9696c0950295d8cb5",shape="box",style="filled",color="grey" ];
+"678E" [ label="b5c747cc9",shape="box",style="filled",color="grey" ];
+"351" [ label="ff07977fca5513098d220d1eb3a",shape="hexagon" ];
+"143E" [ label="89a36b13f8c344b",shape="box",style="filled",color="grey" ];
+"232E" [ label="56292d076643",shape="box",style="filled",color="grey" ];
+"680E" [ label="b5c747cc9",shape="box",style="filled",color="grey" ];
+"704E" [ label="431430c49",shape="box",style="filled",color="grey" ];
+"352" [ label="a97ef281eafc34b1630d450a1df",shape="hexagon" ];
+"144E" [ label="4ff4e275c710c3b",shape="box",style="filled",color="grey" ];
+"432E" [ label="d13da6273c9b4da",shape="box",style="filled",color="grey" ];
+"353" [ label="72cbb37db85ed3c6eda5dcf8",shape="hexagon" ];
+"145E" [ label="33ff9e43d5ab",shape="box",style="filled",color="grey" ];
+"354" [ label="0f6784e49852c0be0da23b16",shape="hexagon" ];
+"146E" [ label="d4f958b03a98",shape="box",style="filled",color="grey" ];
+"396E" [ label="8e24e9b4e",shape="box",style="filled",color="grey" ];
+"355" [ label="383f5c65cc6c25aa0a0e6dbb",shape="hexagon" ];
+"147E" [ label="1ff8ff951ee9",shape="box",style="filled",color="grey" ];
+"356" [ label="f52a45620969f0df4e6ae1dcd7",shape="hexagon" ];
+"148E" [ label="5256925081c812",shape="box",style="filled",color="grey" ];
+"357" [ label="1f5df34ad75a55a76ef4afa0a47",shape="hexagon" ];
+"149E" [ label="26a185dde9a93dd",shape="box",style="filled",color="grey" ];
+"358" [ label="45ba4d4c61c9601a26d59e47e0260",shape="hexagon" ];
+"167E" [ label="99bd3e7feeb710",shape="box",style="filled",color="grey" ];
+"359" [ label="f95344b0ae31693f3a2746597d4",shape="hexagon" ];
+"169E" [ label="4e8259973f1f",shape="box",style="filled",color="grey" ];
+"360" [ label="b79798b186d6b82288e8be4017d",shape="hexagon" ];
+"171E" [ label="63b079bd5847",shape="box",style="filled",color="grey" ];
+"361" [ label="47e0067f4d853afd2012f04daa8",shape="hexagon" ];
+"172E" [ label="92fb5d4a0805",shape="box",style="filled",color="grey" ];
+"362" [ label="f2b6201774de40a29b504b1f716",shape="hexagon" ];
+"173E" [ label="d7203571944b",shape="box",style="filled",color="grey" ];
+"363" [ label="800422ab81d804eef3e7b91dfba91",shape="hexagon" ];
+"174E" [ label="952316a1a5a785",shape="box",style="filled",color="grey" ];
+"364" [ label="35b941379e1af658078cffb83a2",shape="hexagon" ];
+"101E" [ label="331675c046693f",shape="box",style="filled",color="grey" ];
+"365" [ label="d4f7b7fba7afcf7a72397353ec",shape="hexagon" ];
+"102E" [ label="32c4684b55361",shape="box",style="filled",color="grey" ];
+"367" [ label="e4b45b7a2f884d3734bfd5985656",shape="hexagon" ];
+"104E" [ label="1333074979f2d0b",shape="box",style="filled",color="grey" ];
+"368" [ label="02c2ba83680ab57f236a33d702",shape="hexagon" ];
+"105E" [ label="084d4bfa5853e",shape="box",style="filled",color="grey" ];
+"369" [ label="9ccd974150a18260b207b6584caa",shape="hexagon" ];
+"106E" [ label="28f7bfc40c88e6a",shape="box",style="filled",color="grey" ];
+"374" [ label="653ae44d45dcadeb481b53027d",shape="hexagon" ];
+"111E" [ label="8f95518f48528",shape="box",style="filled",color="grey" ];
+"375" [ label="d66f542ef1ce4d02c59bec65e",shape="hexagon" ];
+"112E" [ label="2ef209509e2a",shape="box",style="filled",color="grey" ];
+"377" [ label="a2984b7a11e49440420058c1d80",shape="hexagon" ];
+"114E" [ label="ef42184297591d",shape="box",style="filled",color="grey" ];
+"378" [ label="31055116421c96b37f72a262bb",shape="hexagon" ];
+"115E" [ label="be9c5958196ed",shape="box",style="filled",color="grey" ];
+"380" [ label="8462bb2eec1a62d19a15865e57c92",shape="hexagon" ];
+"117E" [ label="16a795a1d63f30df",shape="box",style="filled",color="grey" ];
+"392E" [ label="85a34bc9616ff",shape="box",style="filled",color="grey" ];
+"381" [ label="c21eb96fe100a1efaa128181b7",shape="hexagon" ];
+"118E" [ label="f1b0d754353a6",shape="box",style="filled",color="grey" ];
+"382" [ label="e3e284d0cc803d98d674f9c3f6d",color="yellow",style="filled",shape="doubleoctagon" ];
+"177E" [ label="30417faf916",shape="box",style="filled",color="grey" ];
+"178E" [ label="e618df70814a",shape="box",style="filled",color="grey" ];
+"179E" [ label="fa90ddf10bd574",shape="box",style="filled",color="grey" ];
+"180E" [ label="815cc0b83d733",shape="box",style="filled",color="grey" ];
+"181E" [ label="f787d827958c",shape="box",style="filled",color="grey" ];
+"182E" [ label="f20f7f513e",shape="box",style="filled",color="grey" ];
+"183E" [ label="290907417e13",shape="box",style="filled",color="grey" ];
+"184E" [ label="e8386a8e1c8a",shape="box",style="filled",color="grey" ];
+"185E" [ label="319bc900218b",shape="box",style="filled",color="grey" ];
+"186E" [ label="3ba7afb0e48ae1",shape="box",style="filled",color="grey" ];
+"187E" [ label="6ba0776fc8e",shape="box",style="filled",color="grey" ];
+"188E" [ label="09847696ae",shape="box",style="filled",color="grey" ];
+"383" [ label="908f9ad506eae9ab6ada185e3",color="yellow",style="filled",shape="doubleoctagon" ];
+"730E" [ label="65694ca6d575",shape="box",style="filled",color="grey" ];
+"732E" [ label="37f57e81ebed95",shape="box",style="filled",color="grey" ];
+"741E" [ label="9b6c",shape="box",style="filled",color="grey" ];
+"765E" [ label="88ebe2e8782c",shape="box",style="filled",color="grey" ];
+"796E" [ label="901b2105a902ee7791",shape="box",style="filled",color="grey" ];
+"384" [ label="593caebf2037317648bb451aa79",color="yellow",style="filled",shape="doubleoctagon" ];
+"726E" [ label="351dd0aefe480c",shape="box",style="filled",color="grey" ];
+"728E" [ label="56e1a896",shape="box",style="filled",color="grey" ];
+"742E" [ label="5ba4693031",shape="box",style="filled",color="grey" ];
+"385" [ label="717c254aeffbb527dabfc",shape="hexagon" ];
+"328E" [ label="123cc6d1ac",shape="box",style="filled",color="grey" ];
+"496E" [ label="",shape="box",style="filled",color="grey" ];
+"594E" [ label="7f8c557bcf3889",shape="box",style="filled",color="grey" ];
+"622E" [ label="da3d5",shape="box",style="filled",color="grey" ];
+"754E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ];
+"755E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ];
+"756E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ];
+"757E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ];
+"758E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ];
+"759E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ];
+"760E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ];
+"761E" [ label="eb9cf6456613d4cd06f7c0894bd6",shape="box",style="filled",color="grey" ];
+"762E" [ label="1e2298c4bb",shape="box",style="filled",color="grey" ];
+"1" -> "189E" [ label=" ",color="blue",arrowhead="dot" ];
+"1" -> "790E" [ label=" ",color="blue",arrowhead="dot" ];
+"2" -> "191E" [ label=" ",color="blue",arrowhead="dot" ];
+"3" -> "193E" [ label=" ",color="blue",arrowhead="dot" ];
+"4" -> "195E" [ label=" ",color="blue",arrowhead="dot" ];
+"5" -> "197E" [ label=" ",color="blue",arrowhead="dot" ];
+"6" -> "199E" [ label=" ",color="blue",arrowhead="dot" ];
+"7" -> "201E" [ label=" ",color="blue",arrowhead="dot" ];
+"8" -> "203E" [ label=" ",color="blue",arrowhead="dot" ];
+"9" -> "725E" [ label=" ",color="blue",arrowhead="dot" ];
+"9" -> "785E" [ label=" ",color="blue",arrowhead="dot" ];
+"10" -> "205E" [ label=" ",color="blue",arrowhead="dot" ];
+"11" -> "207E" [ label=" ",color="blue",arrowhead="dot" ];
+"12" -> "209E" [ label=" ",color="blue",arrowhead="dot" ];
+"13" -> "211E" [ label=" ",color="blue",arrowhead="dot" ];
+"14" -> "213E" [ label=" ",color="blue",arrowhead="dot" ];
+"15" -> "215E" [ label=" ",color="blue",arrowhead="dot" ];
+"16" -> "727E" [ label=" ",color="blue",arrowhead="dot" ];
+"16" -> "784E" [ label=" ",color="blue",arrowhead="dot" ];
+"17" -> "217E" [ label=" ",color="blue",arrowhead="dot" ];
+"17" -> "787E" [ label=" ",color="blue",arrowhead="dot" ];
+"18" -> "219E" [ label=" ",color="blue",arrowhead="dot" ];
+"19" -> "221E" [ label=" ",color="blue",arrowhead="dot" ];
+"20" -> "223E" [ label=" ",color="blue",arrowhead="dot" ];
+"21" -> "225E" [ label=" ",color="blue",arrowhead="dot" ];
+"22" -> "227E" [ label=" ",color="blue",arrowhead="dot" ];
+"22" -> "792E" [ label=" ",color="blue",arrowhead="dot" ];
+"23" -> "231E" [ label=" ",color="blue",arrowhead="dot" ];
+"24" -> "233E" [ label=" ",color="blue",arrowhead="dot" ];
+"25" -> "235E" [ label=" ",color="blue",arrowhead="dot" ];
+"26" -> "237E" [ label=" ",color="blue",arrowhead="dot" ];
+"27" -> "239E" [ label=" ",color="blue",arrowhead="dot" ];
+"27" -> "783E" [ label=" ",color="blue",arrowhead="dot" ];
+"28" -> "241E" [ label=" ",color="blue",arrowhead="dot" ];
+"28" -> "791E" [ label=" ",color="blue",arrowhead="dot" ];
+"29" -> "243E" [ label=" ",color="blue",arrowhead="dot" ];
+"30" -> "245E" [ label=" ",color="blue",arrowhead="dot" ];
+"31" -> "247E" [ label=" ",color="blue",arrowhead="dot" ];
+"32" -> "249E" [ label=" ",color="blue",arrowhead="dot" ];
+"33" -> "251E" [ label=" ",color="blue",arrowhead="dot" ];
+"34" -> "253E" [ label=" ",color="blue",arrowhead="dot" ];
+"35" -> "255E" [ label=" ",color="blue",arrowhead="dot" ];
+"36" -> "257E" [ label=" ",color="blue",arrowhead="dot" ];
+"37" -> "259E" [ label=" ",color="blue",arrowhead="dot" ];
+"38" -> "261E" [ label=" ",color="blue",arrowhead="dot" ];
+"39" -> "263E" [ label=" ",color="blue",arrowhead="dot" ];
+"40" -> "265E" [ label=" ",color="blue",arrowhead="dot" ];
+"41" -> "267E" [ label=" ",color="blue",arrowhead="dot" ];
+"42" -> "269E" [ label=" ",color="blue",arrowhead="dot" ];
+"43" -> "271E" [ label=" ",color="blue",arrowhead="dot" ];
+"44" -> "273E" [ label=" ",color="blue",arrowhead="dot" ];
+"45" -> "275E" [ label=" ",color="blue",arrowhead="dot" ];
+"46" -> "277E" [ label=" ",color="blue",arrowhead="dot" ];
+"47" -> "279E" [ label=" ",color="blue",arrowhead="dot" ];
+"48" -> "281E" [ label=" ",color="blue",arrowhead="dot" ];
+"49" -> "283E" [ label=" ",color="blue",arrowhead="dot" ];
+"50" -> "285E" [ label=" ",color="blue",arrowhead="dot" ];
+"51" -> "287E" [ label=" ",color="blue",arrowhead="dot" ];
+"52" -> "289E" [ label=" ",color="blue",arrowhead="dot" ];
+"53" -> "291E" [ label=" ",color="blue",arrowhead="dot" ];
+"54" -> "293E" [ label=" ",color="blue",arrowhead="dot" ];
+"55" -> "745E" [ label=" ",color="blue",arrowhead="dot" ];
+"56" -> "295E" [ label=" ",color="blue",arrowhead="dot" ];
+"57" -> "297E" [ label=" ",color="blue",arrowhead="dot" ];
+"58" -> "299E" [ label=" ",color="blue",arrowhead="dot" ];
+"59" -> "301E" [ label=" ",color="blue",arrowhead="dot" ];
+"59" -> "789E" [ label=" ",color="blue",arrowhead="dot" ];
+"60" -> "303E" [ label=" ",color="blue",arrowhead="dot" ];
+"61" -> "305E" [ label=" ",color="blue",arrowhead="dot" ];
+"62" -> "307E" [ label=" ",color="blue",arrowhead="dot" ];
+"63" -> "309E" [ label=" ",color="blue",arrowhead="dot" ];
+"64" -> "311E" [ label=" ",color="blue",arrowhead="dot" ];
+"65" -> "313E" [ label=" ",color="blue",arrowhead="dot" ];
+"66" -> "315E" [ label=" ",color="blue",arrowhead="dot" ];
+"67" -> "317E" [ label=" ",color="blue",arrowhead="dot" ];
+"68" -> "319E" [ label=" ",color="blue",arrowhead="dot" ];
+"69" -> "746E" [ label=" ",color="blue",arrowhead="dot" ];
+"70" -> "321E" [ label=" ",color="blue",arrowhead="dot" ];
+"71" -> "327E" [ label=" ",color="blue",arrowhead="dot" ];
+"72" -> "329E" [ label=" ",color="blue",arrowhead="dot" ];
+"73" -> "331E" [ label=" ",color="blue",arrowhead="dot" ];
+"74" -> "333E" [ label=" ",color="blue",arrowhead="dot" ];
+"75" -> "335E" [ label=" ",color="blue",arrowhead="dot" ];
+"76" -> "337E" [ label=" ",color="blue",arrowhead="dot" ];
+"77" -> "339E" [ label=" ",color="blue",arrowhead="dot" ];
+"78" -> "341E" [ label=" ",color="blue",arrowhead="dot" ];
+"79" -> "343E" [ label=" ",color="blue",arrowhead="dot" ];
+"80" -> "345E" [ label=" ",color="blue",arrowhead="dot" ];
+"81" -> "347E" [ label=" ",color="blue",arrowhead="dot" ];
+"82" -> "349E" [ label=" ",color="blue",arrowhead="dot" ];
+"83" -> "351E" [ label=" ",color="blue",arrowhead="dot" ];
+"84" -> "353E" [ label=" ",color="blue",arrowhead="dot" ];
+"85" -> "355E" [ label=" ",color="blue",arrowhead="dot" ];
+"85" -> "788E" [ label=" ",color="blue",arrowhead="dot" ];
+"86" -> "357E" [ label=" ",color="blue",arrowhead="dot" ];
+"87" -> "359E" [ label=" ",color="blue",arrowhead="dot" ];
+"88" -> "361E" [ label=" ",color="blue",arrowhead="dot" ];
+"89" -> "363E" [ label=" ",color="blue",arrowhead="dot" ];
+"90" -> "365E" [ label=" ",color="blue",arrowhead="dot" ];
+"91" -> "367E" [ label=" ",color="blue",arrowhead="dot" ];
+"92" -> "369E" [ label=" ",color="blue",arrowhead="dot" ];
+"93" -> "729E" [ label=" ",color="blue",arrowhead="dot" ];
+"94" -> "371E" [ label=" ",color="blue",arrowhead="dot" ];
+"95" -> "373E" [ label=" ",color="blue",arrowhead="dot" ];
+"96" -> "375E" [ label=" ",color="blue",arrowhead="dot" ];
+"97" -> "747E" [ label=" ",color="blue",arrowhead="dot" ];
+"98" -> "377E" [ label=" ",color="blue",arrowhead="dot" ];
+"99" -> "379E" [ label=" ",color="blue",arrowhead="dot" ];
+"100" -> "381E" [ label=" ",color="blue",arrowhead="dot" ];
+"101" -> "383E" [ label=" ",color="blue",arrowhead="dot" ];
+"102" -> "385E" [ label=" ",color="blue",arrowhead="dot" ];
+"103" -> "387E" [ label=" ",color="blue",arrowhead="dot" ];
+"104" -> "389E" [ label=" ",color="blue",arrowhead="dot" ];
+"105" -> "391E" [ label=" ",color="blue",arrowhead="dot" ];
+"106" -> "393E" [ label=" ",color="blue",arrowhead="dot" ];
+"107" -> "395E" [ label=" ",color="blue",arrowhead="dot" ];
+"108" -> "397E" [ label=" ",color="blue",arrowhead="dot" ];
+"109" -> "399E" [ label=" ",color="blue",arrowhead="dot" ];
+"110" -> "401E" [ label=" ",color="blue",arrowhead="dot" ];
+"111" -> "403E" [ label=" ",color="blue",arrowhead="dot" ];
+"112" -> "405E" [ label=" ",color="blue",arrowhead="dot" ];
+"113" -> "407E" [ label=" ",color="blue",arrowhead="dot" ];
+"114" -> "409E" [ label=" ",color="blue",arrowhead="dot" ];
+"115" -> "411E" [ label=" ",color="blue",arrowhead="dot" ];
+"116" -> "413E" [ label=" ",color="blue",arrowhead="dot" ];
+"117" -> "415E" [ label=" ",color="blue",arrowhead="dot" ];
+"118" -> "417E" [ label=" ",color="blue",arrowhead="dot" ];
+"119" -> "419E" [ label=" ",color="blue",arrowhead="dot" ];
+"120" -> "421E" [ label=" ",color="blue",arrowhead="dot" ];
+"121" -> "423E" [ label=" ",color="blue",arrowhead="dot" ];
+"122" -> "748E" [ label=" ",color="blue",arrowhead="dot" ];
+"123" -> "425E" [ label=" ",color="blue",arrowhead="dot" ];
+"124" -> "427E" [ label=" ",color="blue",arrowhead="dot" ];
+"124" -> "786E" [ label=" ",color="blue",arrowhead="dot" ];
+"125" -> "431E" [ label=" ",color="blue",arrowhead="dot" ];
+"126" -> "433E" [ label=" ",color="blue",arrowhead="dot" ];
+"127" -> "435E" [ label=" ",color="blue",arrowhead="dot" ];
+"128" -> "437E" [ label=" ",color="blue",arrowhead="dot" ];
+"129" -> "439E" [ label=" ",color="blue",arrowhead="dot" ];
+"130" -> "441E" [ label=" ",color="blue",arrowhead="dot" ];
+"131" -> "443E" [ label=" ",color="blue",arrowhead="dot" ];
+"132" -> "445E" [ label=" ",color="blue",arrowhead="dot" ];
+"133" -> "749E" [ label=" ",color="blue",arrowhead="dot" ];
+"134" -> "447E" [ label=" ",color="blue",arrowhead="dot" ];
+"135" -> "449E" [ label=" ",color="blue",arrowhead="dot" ];
+"135" -> "769E" [ label=" ",color="blue",arrowhead="dot" ];
+"135" -> "770E" [ label=" ",color="blue",arrowhead="dot" ];
+"136" -> "451E" [ label=" ",color="blue",arrowhead="dot" ];
+"137" -> "453E" [ label=" ",color="blue",arrowhead="dot" ];
+"138" -> "455E" [ label=" ",color="blue",arrowhead="dot" ];
+"139" -> "457E" [ label=" ",color="blue",arrowhead="dot" ];
+"140" -> "459E" [ label=" ",color="blue",arrowhead="dot" ];
+"141" -> "461E" [ label=" ",color="blue",arrowhead="dot" ];
+"142" -> "463E" [ label=" ",color="blue",arrowhead="dot" ];
+"143" -> "465E" [ label=" ",color="blue",arrowhead="dot" ];
+"144" -> "467E" [ label=" ",color="blue",arrowhead="dot" ];
+"145" -> "469E" [ label=" ",color="blue",arrowhead="dot" ];
+"146" -> "471E" [ label=" ",color="blue",arrowhead="dot" ];
+"147" -> "473E" [ label=" ",color="blue",arrowhead="dot" ];
+"148" -> "475E" [ label=" ",color="blue",arrowhead="dot" ];
+"149" -> "477E" [ label=" ",color="blue",arrowhead="dot" ];
+"150" -> "479E" [ label=" ",color="blue",arrowhead="dot" ];
+"151" -> "481E" [ label=" ",color="blue",arrowhead="dot" ];
+"152" -> "483E" [ label=" ",color="blue",arrowhead="dot" ];
+"153" -> "731E" [ label=" ",color="blue",arrowhead="dot" ];
+"154" -> "750E" [ label=" ",color="blue",arrowhead="dot" ];
+"155" -> "485E" [ label=" ",color="blue",arrowhead="dot" ];
+"156" -> "487E" [ label=" ",color="blue",arrowhead="dot" ];
+"157" -> "489E" [ label=" ",color="blue",arrowhead="dot" ];
+"158" -> "491E" [ label=" ",color="blue",arrowhead="dot" ];
+"159" -> "495E" [ label=" ",color="blue",arrowhead="dot" ];
+"160" -> "499E" [ label=" ",color="blue",arrowhead="dot" ];
+"161" -> "501E" [ label=" ",color="blue",arrowhead="dot" ];
+"162" -> "503E" [ label=" ",color="blue",arrowhead="dot" ];
+"163" -> "505E" [ label=" ",color="blue",arrowhead="dot" ];
+"164" -> "507E" [ label=" ",color="blue",arrowhead="dot" ];
+"165" -> "509E" [ label=" ",color="blue",arrowhead="dot" ];
+"166" -> "511E" [ label=" ",color="blue",arrowhead="dot" ];
+"167" -> "513E" [ label=" ",color="blue",arrowhead="dot" ];
+"168" -> "515E" [ label=" ",color="blue",arrowhead="dot" ];
+"169" -> "517E" [ label=" ",color="blue",arrowhead="dot" ];
+"170" -> "519E" [ label=" ",color="blue",arrowhead="dot" ];
+"171" -> "521E" [ label=" ",color="blue",arrowhead="dot" ];
+"172" -> "523E" [ label=" ",color="blue",arrowhead="dot" ];
+"173" -> "525E" [ label=" ",color="blue",arrowhead="dot" ];
+"174" -> "527E" [ label=" ",color="blue",arrowhead="dot" ];
+"175" -> "529E" [ label=" ",color="blue",arrowhead="dot" ];
+"176" -> "531E" [ label=" ",color="blue",arrowhead="dot" ];
+"177" -> "533E" [ label=" ",color="blue",arrowhead="dot" ];
+"178" -> "535E" [ label=" ",color="blue",arrowhead="dot" ];
+"179" -> "537E" [ label=" ",color="blue",arrowhead="dot" ];
+"180" -> "539E" [ label=" ",color="blue",arrowhead="dot" ];
+"181" -> "541E" [ label=" ",color="blue",arrowhead="dot" ];
+"182" -> "543E" [ label=" ",color="blue",arrowhead="dot" ];
+"183" -> "545E" [ label=" ",color="blue",arrowhead="dot" ];
+"184" -> "547E" [ label=" ",color="blue",arrowhead="dot" ];
+"185" -> "549E" [ label=" ",color="blue",arrowhead="dot" ];
+"186" -> "551E" [ label=" ",color="blue",arrowhead="dot" ];
+"187" -> "553E" [ label=" ",color="blue",arrowhead="dot" ];
+"188" -> "555E" [ label=" ",color="blue",arrowhead="dot" ];
+"189" -> "557E" [ label=" ",color="blue",arrowhead="dot" ];
+"190" -> "559E" [ label=" ",color="blue",arrowhead="dot" ];
+"191" -> "561E" [ label=" ",color="blue",arrowhead="dot" ];
+"192" -> "563E" [ label=" ",color="blue",arrowhead="dot" ];
+"193" -> "565E" [ label=" ",color="blue",arrowhead="dot" ];
+"194" -> "567E" [ label=" ",color="blue",arrowhead="dot" ];
+"195" -> "569E" [ label=" ",color="blue",arrowhead="dot" ];
+"196" -> "571E" [ label=" ",color="blue",arrowhead="dot" ];
+"197" -> "573E" [ label=" ",color="blue",arrowhead="dot" ];
+"198" -> "575E" [ label=" ",color="blue",arrowhead="dot" ];
+"199" -> "577E" [ label=" ",color="blue",arrowhead="dot" ];
+"200" -> "579E" [ label=" ",color="blue",arrowhead="dot" ];
+"201" -> "581E" [ label=" ",color="blue",arrowhead="dot" ];
+"202" -> "583E" [ label=" ",color="blue",arrowhead="dot" ];
+"203" -> "585E" [ label=" ",color="blue",arrowhead="dot" ];
+"204" -> "587E" [ label=" ",color="blue",arrowhead="dot" ];
+"205" -> "751E" [ label=" ",color="blue",arrowhead="dot" ];
+"206" -> "589E" [ label=" ",color="blue",arrowhead="dot" ];
+"207" -> "593E" [ label=" ",color="blue",arrowhead="dot" ];
+"208" -> "597E" [ label=" ",color="blue",arrowhead="dot" ];
+"209" -> "599E" [ label=" ",color="blue",arrowhead="dot" ];
+"210" -> "601E" [ label=" ",color="blue",arrowhead="dot" ];
+"211" -> "603E" [ label=" ",color="blue",arrowhead="dot" ];
+"212" -> "605E" [ label=" ",color="blue",arrowhead="dot" ];
+"213" -> "607E" [ label=" ",color="blue",arrowhead="dot" ];
+"214" -> "609E" [ label=" ",color="blue",arrowhead="dot" ];
+"215" -> "611E" [ label=" ",color="blue",arrowhead="dot" ];
+"216" -> "613E" [ label=" ",color="blue",arrowhead="dot" ];
+"217" -> "615E" [ label=" ",color="blue",arrowhead="dot" ];
+"218" -> "617E" [ label=" ",color="blue",arrowhead="dot" ];
+"219" -> "619E" [ label=" ",color="blue",arrowhead="dot" ];
+"220" -> "621E" [ label=" ",color="blue",arrowhead="dot" ];
+"221" -> "623E" [ label=" ",color="blue",arrowhead="dot" ];
+"222" -> "752E" [ label=" ",color="blue",arrowhead="dot" ];
+"223" -> "625E" [ label=" ",color="blue",arrowhead="dot" ];
+"224" -> "627E" [ label=" ",color="blue",arrowhead="dot" ];
+"225" -> "629E" [ label=" ",color="blue",arrowhead="dot" ];
+"226" -> "631E" [ label=" ",color="blue",arrowhead="dot" ];
+"227" -> "633E" [ label=" ",color="blue",arrowhead="dot" ];
+"228" -> "635E" [ label=" ",color="blue",arrowhead="dot" ];
+"229" -> "637E" [ label=" ",color="blue",arrowhead="dot" ];
+"230" -> "639E" [ label=" ",color="blue",arrowhead="dot" ];
+"231" -> "641E" [ label=" ",color="blue",arrowhead="dot" ];
+"232" -> "643E" [ label=" ",color="blue",arrowhead="dot" ];
+"233" -> "645E" [ label=" ",color="blue",arrowhead="dot" ];
+"234" -> "647E" [ label=" ",color="blue",arrowhead="dot" ];
+"235" -> "649E" [ label=" ",color="blue",arrowhead="dot" ];
+"236" -> "651E" [ label=" ",color="blue",arrowhead="dot" ];
+"237" -> "653E" [ label=" ",color="blue",arrowhead="dot" ];
+"238" -> "655E" [ label=" ",color="blue",arrowhead="dot" ];
+"239" -> "657E" [ label=" ",color="blue",arrowhead="dot" ];
+"240" -> "659E" [ label=" ",color="blue",arrowhead="dot" ];
+"241" -> "661E" [ label=" ",color="blue",arrowhead="dot" ];
+"242" -> "663E" [ label=" ",color="blue",arrowhead="dot" ];
+"243" -> "665E" [ label=" ",color="blue",arrowhead="dot" ];
+"244" -> "667E" [ label=" ",color="blue",arrowhead="dot" ];
+"245" -> "669E" [ label=" ",color="blue",arrowhead="dot" ];
+"246" -> "671E" [ label=" ",color="blue",arrowhead="dot" ];
+"247" -> "673E" [ label=" ",color="blue",arrowhead="dot" ];
+"248" -> "675E" [ label=" ",color="blue",arrowhead="dot" ];
+"249" -> "679E" [ label=" ",color="blue",arrowhead="dot" ];
+"250" -> "753E" [ label=" ",color="blue",arrowhead="dot" ];
+"251" -> "681E" [ label=" ",color="blue",arrowhead="dot" ];
+"252" -> "683E" [ label=" ",color="blue",arrowhead="dot" ];
+"253" -> "685E" [ label=" ",color="blue",arrowhead="dot" ];
+"254" -> "687E" [ label=" ",color="blue",arrowhead="dot" ];
+"255" -> "689E" [ label=" ",color="blue",arrowhead="dot" ];
+"256" -> "691E" [ label=" ",color="blue",arrowhead="dot" ];
+"257" -> "693E" [ label=" ",color="blue",arrowhead="dot" ];
+"258" -> "695E" [ label=" ",color="blue",arrowhead="dot" ];
+"259" -> "697E" [ label=" ",color="blue",arrowhead="dot" ];
+"260" -> "699E" [ label=" ",color="blue",arrowhead="dot" ];
+"261" -> "703E" [ label=" ",color="blue",arrowhead="dot" ];
+"262" -> "705E" [ label=" ",color="blue",arrowhead="dot" ];
+"264" -> "709E" [ label=" ",color="blue",arrowhead="dot" ];
+"265" -> "711E" [ label=" ",color="blue",arrowhead="dot" ];
+"266" -> "713E" [ label=" ",color="blue",arrowhead="dot" ];
+"267" -> "715E" [ label=" ",color="blue",arrowhead="dot" ];
+"268" -> "717E" [ label=" ",color="blue",arrowhead="dot" ];
+"269" -> "719E" [ label=" ",color="blue",arrowhead="dot" ];
+"270" -> "721E" [ label=" ",color="blue",arrowhead="dot" ];
+"272" -> "34E" [ label=" ",color="blue",arrowhead="dot" ];
+"272" -> "252E" [ label=" ",color="blue",arrowhead="dot" ];
+"272" -> "436E" [ label=" ",color="blue",arrowhead="dot" ];
+"274" -> "59E" [ label=" ",color="blue",arrowhead="dot" ];
+"274" -> "500E" [ label=" ",color="blue",arrowhead="dot" ];
+"274" -> "720E" [ label=" ",color="blue",arrowhead="dot" ];
+"275" -> "98E" [ label=" ",color="blue",arrowhead="dot" ];
+"278" -> "35E" [ label=" ",color="blue",arrowhead="dot" ];
+"278" -> "488E" [ label=" ",color="blue",arrowhead="dot" ];
+"278" -> "598E" [ label=" ",color="blue",arrowhead="dot" ];
+"278" -> "604E" [ label=" ",color="blue",arrowhead="dot" ];
+"278" -> "628E" [ label=" ",color="blue",arrowhead="dot" ];
+"279" -> "99E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "242E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "270E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "272E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "284E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "286E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "288E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "586E" [ label=" ",color="blue",arrowhead="dot" ];
+"280" -> "763E" [ label=" ",color="blue",arrowhead="dot" ];
+"281" -> "45E" [ label=" ",color="blue",arrowhead="dot" ];
+"281" -> "470E" [ label=" ",color="blue",arrowhead="dot" ];
+"281" -> "670E" [ label=" ",color="blue",arrowhead="dot" ];
+"281" -> "722E" [ label=" ",color="blue",arrowhead="dot" ];
+"282" -> "103E" [ label=" ",color="blue",arrowhead="dot" ];
+"283" -> "165E" [ label=" ",color="blue",arrowhead="dot" ];
+"284" -> "39E" [ label=" ",color="blue",arrowhead="dot" ];
+"284" -> "224E" [ label=" ",color="blue",arrowhead="dot" ];
+"284" -> "268E" [ label=" ",color="blue",arrowhead="dot" ];
+"284" -> "632E" [ label=" ",color="blue",arrowhead="dot" ];
+"284" -> "710E" [ label=" ",color="blue",arrowhead="dot" ];
+"285" -> "53E" [ label=" ",color="blue",arrowhead="dot" ];
+"286" -> "38E" [ label=" ",color="blue",arrowhead="dot" ];
+"286" -> "166E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "40E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "218E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "244E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "246E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "258E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "290E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "292E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "308E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "318E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "388E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "472E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "478E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "566E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "570E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "574E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "608E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "614E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "658E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "664E" [ label=" ",color="blue",arrowhead="dot" ];
+"288" -> "682E" [ label=" ",color="blue",arrowhead="dot" ];
+"289" -> "41E" [ label=" ",color="blue",arrowhead="dot" ];
+"289" -> "636E" [ label=" ",color="blue",arrowhead="dot" ];
+"289" -> "642E" [ label=" ",color="blue",arrowhead="dot" ];
+"289" -> "690E" [ label=" ",color="blue",arrowhead="dot" ];
+"289" -> "700E" [ label=" ",color="blue",arrowhead="dot" ];
+"290" -> "56E" [ label=" ",color="blue",arrowhead="dot" ];
+"290" -> "264E" [ label=" ",color="blue",arrowhead="dot" ];
+"290" -> "510E" [ label=" ",color="blue",arrowhead="dot" ];
+"290" -> "718E" [ label=" ",color="blue",arrowhead="dot" ];
+"291" -> "66E" [ label=" ",color="blue",arrowhead="dot" ];
+"291" -> "76E" [ label=" ",color="blue",arrowhead="dot" ];
+"291" -> "610E" [ label=" ",color="blue",arrowhead="dot" ];
+"292" -> "73E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "49E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "214E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "216E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "236E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "278E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "358E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "398E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "400E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "402E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "404E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "406E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "408E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "412E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "438E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "448E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "476E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "504E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "552E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "634E" [ label=" ",color="blue",arrowhead="dot" ];
+"293" -> "768E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "44E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "92E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "250E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "316E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "380E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "424E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "442E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "446E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "454E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "460E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "462E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "648E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "656E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "666E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "692E" [ label=" ",color="blue",arrowhead="dot" ];
+"295" -> "712E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "47E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "330E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "514E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "516E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "518E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "520E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "522E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "526E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "528E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "530E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "532E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "534E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "536E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "538E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "540E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "542E" [ label=" ",color="blue",arrowhead="dot" ];
+"296" -> "544E" [ label=" ",color="blue",arrowhead="dot" ];
+"297" -> "46E" [ label=" ",color="blue",arrowhead="dot" ];
+"297" -> "93E" [ label=" ",color="blue",arrowhead="dot" ];
+"297" -> "206E" [ label=" ",color="blue",arrowhead="dot" ];
+"297" -> "426E" [ label=" ",color="blue",arrowhead="dot" ];
+"297" -> "550E" [ label=" ",color="blue",arrowhead="dot" ];
+"297" -> "706E" [ label=" ",color="blue",arrowhead="dot" ];
+"298" -> "36E" [ label=" ",color="blue",arrowhead="dot" ];
+"298" -> "95E" [ label=" ",color="blue",arrowhead="dot" ];
+"298" -> "364E" [ label=" ",color="blue",arrowhead="dot" ];
+"298" -> "394E" [ label=" ",color="blue",arrowhead="dot" ];
+"298" -> "420E" [ label=" ",color="blue",arrowhead="dot" ];
+"298" -> "456E" [ label=" ",color="blue",arrowhead="dot" ];
+"298" -> "624E" [ label=" ",color="blue",arrowhead="dot" ];
+"299" -> "48E" [ label=" ",color="blue",arrowhead="dot" ];
+"299" -> "168E" [ label=" ",color="blue",arrowhead="dot" ];
+"299" -> "260E" [ label=" ",color="blue",arrowhead="dot" ];
+"299" -> "282E" [ label=" ",color="blue",arrowhead="dot" ];
+"299" -> "554E" [ label=" ",color="blue",arrowhead="dot" ];
+"299" -> "590E" [ label=" ",color="blue",arrowhead="dot" ];
+"299" -> "767E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "62E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "190E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "226E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "238E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "254E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "256E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "262E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "266E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "274E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "276E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "294E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "296E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "310E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "320E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "322E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "332E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "340E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "344E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "346E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "348E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "374E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "378E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "452E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "508E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "524E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "612E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "626E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "638E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "644E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "654E" [ label=" ",color="blue",arrowhead="dot" ];
+"300" -> "672E" [ label=" ",color="blue",arrowhead="dot" ];
+"302" -> "797E" [ label=" ",color="blue",arrowhead="dot" ];
+"302" -> "798E" [ label=" ",color="blue",arrowhead="dot" ];
+"303" -> "52E" [ label=" ",color="blue",arrowhead="dot" ];
+"303" -> "650E" [ label=" ",color="blue",arrowhead="dot" ];
+"304" -> "50E" [ label=" ",color="blue",arrowhead="dot" ];
+"304" -> "640E" [ label=" ",color="blue",arrowhead="dot" ];
+"304" -> "646E" [ label=" ",color="blue",arrowhead="dot" ];
+"304" -> "652E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "55E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "220E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "338E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "368E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "486E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "490E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "562E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "564E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "600E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "668E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "674E" [ label=" ",color="blue",arrowhead="dot" ];
+"306" -> "698E" [ label=" ",color="blue",arrowhead="dot" ];
+"307" -> "107E" [ label=" ",color="blue",arrowhead="dot" ];
+"308" -> "108E" [ label=" ",color="blue",arrowhead="dot" ];
+"309" -> "109E" [ label=" ",color="blue",arrowhead="dot" ];
+"310" -> "110E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "58E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "234E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "300E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "306E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "314E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "342E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "354E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "370E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "382E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "422E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "444E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "582E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "620E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "630E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "684E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "696E" [ label=" ",color="blue",arrowhead="dot" ];
+"311" -> "801E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "42E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "192E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "194E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "196E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "198E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "200E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "202E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "204E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "312E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "336E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "376E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "384E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "386E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "428E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "474E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "484E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "546E" [ label=" ",color="blue",arrowhead="dot" ];
+"312" -> "548E" [ label=" ",color="blue",arrowhead="dot" ];
+"314" -> "113E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "43E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "240E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "298E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "334E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "360E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "390E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "418E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "492E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "502E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "584E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "588E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "602E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "606E" [ label=" ",color="blue",arrowhead="dot" ];
+"315" -> "662E" [ label=" ",color="blue",arrowhead="dot" ];
+"316" -> "51E" [ label=" ",color="blue",arrowhead="dot" ];
+"317" -> "116E" [ label=" ",color="blue",arrowhead="dot" ];
+"318" -> "74E" [ label=" ",color="blue",arrowhead="dot" ];
+"319" -> "57E" [ label=" ",color="blue",arrowhead="dot" ];
+"319" -> "94E" [ label=" ",color="blue",arrowhead="dot" ];
+"319" -> "350E" [ label=" ",color="blue",arrowhead="dot" ];
+"319" -> "440E" [ label=" ",color="blue",arrowhead="dot" ];
+"319" -> "466E" [ label=" ",color="blue",arrowhead="dot" ];
+"319" -> "676E" [ label=" ",color="blue",arrowhead="dot" ];
+"320" -> "60E" [ label=" ",color="blue",arrowhead="dot" ];
+"320" -> "366E" [ label=" ",color="blue",arrowhead="dot" ];
+"320" -> "434E" [ label=" ",color="blue",arrowhead="dot" ];
+"320" -> "458E" [ label=" ",color="blue",arrowhead="dot" ];
+"320" -> "618E" [ label=" ",color="blue",arrowhead="dot" ];
+"321" -> "72E" [ label=" ",color="blue",arrowhead="dot" ];
+"321" -> "362E" [ label=" ",color="blue",arrowhead="dot" ];
+"321" -> "372E" [ label=" ",color="blue",arrowhead="dot" ];
+"321" -> "572E" [ label=" ",color="blue",arrowhead="dot" ];
+"322" -> "54E" [ label=" ",color="blue",arrowhead="dot" ];
+"322" -> "222E" [ label=" ",color="blue",arrowhead="dot" ];
+"322" -> "302E" [ label=" ",color="blue",arrowhead="dot" ];
+"322" -> "556E" [ label=" ",color="blue",arrowhead="dot" ];
+"322" -> "558E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "37E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "208E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "210E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "352E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "450E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "568E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "576E" [ label=" ",color="blue",arrowhead="dot" ];
+"323" -> "686E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "228E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "248E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "304E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "468E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "578E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "660E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "688E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "694E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "714E" [ label=" ",color="blue",arrowhead="dot" ];
+"324" -> "766E" [ label=" ",color="blue",arrowhead="dot" ];
+"325" -> "97E" [ label=" ",color="blue",arrowhead="dot" ];
+"325" -> "506E" [ label=" ",color="blue",arrowhead="dot" ];
+"326" -> "61E" [ label=" ",color="blue",arrowhead="dot" ];
+"326" -> "175E" [ label=" ",color="blue",arrowhead="dot" ];
+"326" -> "482E" [ label=" ",color="blue",arrowhead="dot" ];
+"328" -> "75E" [ label=" ",color="blue",arrowhead="dot" ];
+"328" -> "580E" [ label=" ",color="blue",arrowhead="dot" ];
+"329" -> "96E" [ label=" ",color="blue",arrowhead="dot" ];
+"330" -> "100E" [ label=" ",color="blue",arrowhead="dot" ];
+"330" -> "170E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "63E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "67E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "68E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "69E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "70E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "71E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "802E" [ label=" ",color="blue",arrowhead="dot" ];
+"333" -> "793E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "64E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "81E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "82E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "83E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "84E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "85E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "86E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "87E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "88E" [ label=" ",color="blue",arrowhead="dot" ];
+"334" -> "89E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "1E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "2E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "3E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "4E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "5E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "6E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "7E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "8E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "9E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "10E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "11E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "12E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "13E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "14E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "15E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "16E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "17E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "18E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "19E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "20E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "21E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "22E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "23E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "24E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "25E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "26E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "27E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "28E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "29E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "30E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "31E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "65E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "119E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "150E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "176E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "743E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "744E" [ label=" ",color="blue",arrowhead="dot" ];
+"336" -> "764E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "120E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "121E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "122E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "123E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "124E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "125E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "126E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "127E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "128E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "129E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "130E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "131E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "132E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "133E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "134E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "135E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "136E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "137E" [ label=" ",color="blue",arrowhead="dot" ];
+"337" -> "138E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "151E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "153E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "154E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "155E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "156E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "157E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "158E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "159E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "160E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "161E" [ label=" ",color="blue",arrowhead="dot" ];
+"339" -> "162E" [ label=" ",color="blue",arrowhead="dot" ];
+"347" -> "139E" [ label=" ",color="blue",arrowhead="dot" ];
+"347" -> "795E" [ label=" ",color="blue",arrowhead="dot" ];
+"348" -> "799E" [ label=" ",color="blue",arrowhead="dot" ];
+"348" -> "800E" [ label=" ",color="blue",arrowhead="dot" ];
+"349" -> "141E" [ label=" ",color="blue",arrowhead="dot" ];
+"350" -> "142E" [ label=" ",color="blue",arrowhead="dot" ];
+"350" -> "678E" [ label=" ",color="blue",arrowhead="dot" ];
+"351" -> "143E" [ label=" ",color="blue",arrowhead="dot" ];
+"351" -> "232E" [ label=" ",color="blue",arrowhead="dot" ];
+"351" -> "680E" [ label=" ",color="blue",arrowhead="dot" ];
+"351" -> "704E" [ label=" ",color="blue",arrowhead="dot" ];
+"352" -> "144E" [ label=" ",color="blue",arrowhead="dot" ];
+"352" -> "432E" [ label=" ",color="blue",arrowhead="dot" ];
+"353" -> "145E" [ label=" ",color="blue",arrowhead="dot" ];
+"354" -> "146E" [ label=" ",color="blue",arrowhead="dot" ];
+"354" -> "396E" [ label=" ",color="blue",arrowhead="dot" ];
+"355" -> "147E" [ label=" ",color="blue",arrowhead="dot" ];
+"356" -> "148E" [ label=" ",color="blue",arrowhead="dot" ];
+"357" -> "149E" [ label=" ",color="blue",arrowhead="dot" ];
+"358" -> "167E" [ label=" ",color="blue",arrowhead="dot" ];
+"359" -> "169E" [ label=" ",color="blue",arrowhead="dot" ];
+"360" -> "171E" [ label=" ",color="blue",arrowhead="dot" ];
+"361" -> "172E" [ label=" ",color="blue",arrowhead="dot" ];
+"362" -> "173E" [ label=" ",color="blue",arrowhead="dot" ];
+"363" -> "174E" [ label=" ",color="blue",arrowhead="dot" ];
+"364" -> "101E" [ label=" ",color="blue",arrowhead="dot" ];
+"365" -> "102E" [ label=" ",color="blue",arrowhead="dot" ];
+"367" -> "104E" [ label=" ",color="blue",arrowhead="dot" ];
+"368" -> "105E" [ label=" ",color="blue",arrowhead="dot" ];
+"369" -> "106E" [ label=" ",color="blue",arrowhead="dot" ];
+"374" -> "111E" [ label=" ",color="blue",arrowhead="dot" ];
+"375" -> "112E" [ label=" ",color="blue",arrowhead="dot" ];
+"377" -> "114E" [ label=" ",color="blue",arrowhead="dot" ];
+"378" -> "115E" [ label=" ",color="blue",arrowhead="dot" ];
+"380" -> "117E" [ label=" ",color="blue",arrowhead="dot" ];
+"380" -> "392E" [ label=" ",color="blue",arrowhead="dot" ];
+"381" -> "118E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "177E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "178E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "179E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "180E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "181E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "182E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "183E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "184E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "185E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "186E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "187E" [ label=" ",color="blue",arrowhead="dot" ];
+"382" -> "188E" [ label=" ",color="blue",arrowhead="dot" ];
+"383" -> "730E" [ label=" ",color="blue",arrowhead="dot" ];
+"383" -> "732E" [ label=" ",color="blue",arrowhead="dot" ];
+"383" -> "741E" [ label=" ",color="blue",arrowhead="dot" ];
+"383" -> "765E" [ label=" ",color="blue",arrowhead="dot" ];
+"383" -> "796E" [ label=" ",color="blue",arrowhead="dot" ];
+"384" -> "726E" [ label=" ",color="blue",arrowhead="dot" ];
+"384" -> "728E" [ label=" ",color="blue",arrowhead="dot" ];
+"384" -> "742E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "328E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "496E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "594E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "622E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "754E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "755E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "756E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "757E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "758E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "759E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "760E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "761E" [ label=" ",color="blue",arrowhead="dot" ];
+"385" -> "762E" [ label=" ",color="blue",arrowhead="dot" ];
+"1E" -> "34E" [ color="purple",arrowhead="none" ];
+"2E" -> "35E" [ color="purple",arrowhead="none" ];
+"3E" -> "36E" [ color="purple",arrowhead="none" ];
+"4E" -> "37E" [ color="purple",arrowhead="none" ];
+"5E" -> "38E" [ color="purple",arrowhead="none" ];
+"6E" -> "39E" [ color="purple",arrowhead="none" ];
+"7E" -> "40E" [ color="purple",arrowhead="none" ];
+"9E" -> "41E" [ color="purple",arrowhead="none" ];
+"10E" -> "42E" [ color="purple",arrowhead="none" ];
+"11E" -> "43E" [ color="purple",arrowhead="none" ];
+"12E" -> "44E" [ color="purple",arrowhead="none" ];
+"13E" -> "45E" [ color="purple",arrowhead="none" ];
+"14E" -> "46E" [ color="purple",arrowhead="none" ];
+"15E" -> "47E" [ color="purple",arrowhead="none" ];
+"16E" -> "48E" [ color="purple",arrowhead="none" ];
+"49E" -> "17E" [ color="purple",arrowhead="none" ];
+"18E" -> "50E" [ color="purple",arrowhead="none" ];
+"19E" -> "51E" [ color="purple",arrowhead="none" ];
+"20E" -> "52E" [ color="purple",arrowhead="none" ];
+"21E" -> "53E" [ color="purple",arrowhead="none" ];
+"22E" -> "54E" [ color="purple",arrowhead="none" ];
+"23E" -> "55E" [ color="purple",arrowhead="none" ];
+"24E" -> "56E" [ color="purple",arrowhead="none" ];
+"25E" -> "57E" [ color="purple",arrowhead="none" ];
+"26E" -> "58E" [ color="purple",arrowhead="none" ];
+"27E" -> "59E" [ color="purple",arrowhead="none" ];
+"28E" -> "60E" [ color="purple",arrowhead="none" ];
+"29E" -> "61E" [ color="purple",arrowhead="none" ];
+"30E" -> "62E" [ color="purple",arrowhead="none" ];
+"31E" -> "63E" [ color="purple",arrowhead="none" ];
+"64E" -> "65E" [ color="purple",arrowhead="none" ];
+"66E" -> "8E" [ color="purple",arrowhead="none" ];
+"71E" -> "76E" [ color="purple",arrowhead="none" ];
+"67E" -> "72E" [ color="purple",arrowhead="none" ];
+"68E" -> "73E" [ color="purple",arrowhead="none" ];
+"69E" -> "74E" [ color="purple",arrowhead="none" ];
+"70E" -> "75E" [ color="purple",arrowhead="none" ];
+"81E" -> "92E" [ color="purple",arrowhead="none" ];
+"82E" -> "93E" [ color="purple",arrowhead="none" ];
+"83E" -> "94E" [ color="purple",arrowhead="none" ];
+"84E" -> "95E" [ color="purple",arrowhead="none" ];
+"85E" -> "96E" [ color="purple",arrowhead="none" ];
+"86E" -> "97E" [ color="purple",arrowhead="none" ];
+"87E" -> "98E" [ color="purple",arrowhead="none" ];
+"88E" -> "99E" [ color="purple",arrowhead="none" ];
+"89E" -> "100E" [ color="purple",arrowhead="none" ];
+"101E" -> "120E" [ color="purple",arrowhead="none" ];
+"102E" -> "121E" [ color="purple",arrowhead="none" ];
+"103E" -> "122E" [ color="purple",arrowhead="none" ];
+"104E" -> "123E" [ color="purple",arrowhead="none" ];
+"105E" -> "124E" [ color="purple",arrowhead="none" ];
+"106E" -> "125E" [ color="purple",arrowhead="none" ];
+"107E" -> "126E" [ color="purple",arrowhead="none" ];
+"108E" -> "127E" [ color="purple",arrowhead="none" ];
+"109E" -> "128E" [ color="purple",arrowhead="none" ];
+"110E" -> "129E" [ color="purple",arrowhead="none" ];
+"111E" -> "130E" [ color="purple",arrowhead="none" ];
+"112E" -> "131E" [ color="purple",arrowhead="none" ];
+"113E" -> "132E" [ color="purple",arrowhead="none" ];
+"114E" -> "133E" [ color="purple",arrowhead="none" ];
+"115E" -> "134E" [ color="purple",arrowhead="none" ];
+"116E" -> "135E" [ color="purple",arrowhead="none" ];
+"117E" -> "136E" [ color="purple",arrowhead="none" ];
+"118E" -> "137E" [ color="purple",arrowhead="none" ];
+"119E" -> "138E" [ color="purple",arrowhead="none" ];
+"139E" -> "151E" [ color="purple",arrowhead="none" ];
+"141E" -> "153E" [ color="purple",arrowhead="none" ];
+"142E" -> "154E" [ color="purple",arrowhead="none" ];
+"143E" -> "155E" [ color="purple",arrowhead="none" ];
+"144E" -> "156E" [ color="purple",arrowhead="none" ];
+"145E" -> "157E" [ color="purple",arrowhead="none" ];
+"146E" -> "158E" [ color="purple",arrowhead="none" ];
+"147E" -> "159E" [ color="purple",arrowhead="none" ];
+"148E" -> "160E" [ color="purple",arrowhead="none" ];
+"149E" -> "161E" [ color="purple",arrowhead="none" ];
+"150E" -> "162E" [ color="purple",arrowhead="none" ];
+"165E" -> "177E" [ color="purple",arrowhead="none" ];
+"166E" -> "178E" [ color="purple",arrowhead="none" ];
+"167E" -> "179E" [ color="purple",arrowhead="none" ];
+"168E" -> "180E" [ color="purple",arrowhead="none" ];
+"169E" -> "181E" [ color="purple",arrowhead="none" ];
+"170E" -> "182E" [ color="purple",arrowhead="none" ];
+"171E" -> "183E" [ color="purple",arrowhead="none" ];
+"172E" -> "184E" [ color="purple",arrowhead="none" ];
+"173E" -> "185E" [ color="purple",arrowhead="none" ];
+"174E" -> "186E" [ color="purple",arrowhead="none" ];
+"175E" -> "187E" [ color="purple",arrowhead="none" ];
+"176E" -> "188E" [ color="purple",arrowhead="none" ];
+"189E" -> "190E" [ color="purple",arrowhead="none" ];
+"191E" -> "192E" [ color="purple",arrowhead="none" ];
+"193E" -> "194E" [ color="purple",arrowhead="none" ];
+"195E" -> "196E" [ color="purple",arrowhead="none" ];
+"197E" -> "198E" [ color="purple",arrowhead="none" ];
+"199E" -> "200E" [ color="purple",arrowhead="none" ];
+"201E" -> "202E" [ color="purple",arrowhead="none" ];
+"203E" -> "204E" [ color="purple",arrowhead="none" ];
+"205E" -> "206E" [ color="purple",arrowhead="none" ];
+"207E" -> "208E" [ color="purple",arrowhead="none" ];
+"209E" -> "210E" [ color="purple",arrowhead="none" ];
+"412E" -> "211E" [ color="purple",arrowhead="none" ];
+"214E" -> "213E" [ color="purple",arrowhead="none" ];
+"216E" -> "215E" [ color="purple",arrowhead="none" ];
+"217E" -> "218E" [ color="purple",arrowhead="none" ];
+"219E" -> "220E" [ color="purple",arrowhead="none" ];
+"221E" -> "222E" [ color="purple",arrowhead="none" ];
+"223E" -> "224E" [ color="purple",arrowhead="none" ];
+"225E" -> "226E" [ color="purple",arrowhead="none" ];
+"227E" -> "228E" [ color="purple",arrowhead="none" ];
+"231E" -> "232E" [ color="purple",arrowhead="none" ];
+"233E" -> "234E" [ color="purple",arrowhead="none" ];
+"236E" -> "235E" [ color="purple",arrowhead="none" ];
+"237E" -> "238E" [ color="purple",arrowhead="none" ];
+"239E" -> "240E" [ color="purple",arrowhead="none" ];
+"241E" -> "242E" [ color="purple",arrowhead="none" ];
+"243E" -> "244E" [ color="purple",arrowhead="none" ];
+"245E" -> "246E" [ color="purple",arrowhead="none" ];
+"247E" -> "248E" [ color="purple",arrowhead="none" ];
+"249E" -> "250E" [ color="purple",arrowhead="none" ];
+"251E" -> "252E" [ color="purple",arrowhead="none" ];
+"253E" -> "254E" [ color="purple",arrowhead="none" ];
+"255E" -> "256E" [ color="purple",arrowhead="none" ];
+"257E" -> "258E" [ color="purple",arrowhead="none" ];
+"259E" -> "260E" [ color="purple",arrowhead="none" ];
+"261E" -> "262E" [ color="purple",arrowhead="none" ];
+"263E" -> "264E" [ color="purple",arrowhead="none" ];
+"265E" -> "266E" [ color="purple",arrowhead="none" ];
+"267E" -> "268E" [ color="purple",arrowhead="none" ];
+"269E" -> "270E" [ color="purple",arrowhead="none" ];
+"271E" -> "272E" [ color="purple",arrowhead="none" ];
+"273E" -> "274E" [ color="purple",arrowhead="none" ];
+"275E" -> "276E" [ color="purple",arrowhead="none" ];
+"278E" -> "277E" [ color="purple",arrowhead="none" ];
+"279E" -> "767E" [ color="purple",arrowhead="none" ];
+"281E" -> "282E" [ color="purple",arrowhead="none" ];
+"283E" -> "284E" [ color="purple",arrowhead="none" ];
+"285E" -> "286E" [ color="purple",arrowhead="none" ];
+"768E" -> "287E" [ color="purple",arrowhead="none" ];
+"289E" -> "290E" [ color="purple",arrowhead="none" ];
+"291E" -> "292E" [ color="purple",arrowhead="none" ];
+"293E" -> "294E" [ color="purple",arrowhead="none" ];
+"295E" -> "296E" [ color="purple",arrowhead="none" ];
+"297E" -> "298E" [ color="purple",arrowhead="none" ];
+"299E" -> "300E" [ color="purple",arrowhead="none" ];
+"301E" -> "302E" [ color="purple",arrowhead="none" ];
+"303E" -> "304E" [ color="purple",arrowhead="none" ];
+"305E" -> "306E" [ color="purple",arrowhead="none" ];
+"307E" -> "308E" [ color="purple",arrowhead="none" ];
+"309E" -> "310E" [ color="purple",arrowhead="none" ];
+"311E" -> "312E" [ color="purple",arrowhead="none" ];
+"313E" -> "314E" [ color="purple",arrowhead="none" ];
+"315E" -> "316E" [ color="purple",arrowhead="none" ];
+"317E" -> "318E" [ color="purple",arrowhead="none" ];
+"319E" -> "320E" [ color="purple",arrowhead="none" ];
+"321E" -> "322E" [ color="purple",arrowhead="none" ];
+"327E" -> "800E" [ color="purple",arrowhead="none" ];
+"329E" -> "330E" [ color="purple",arrowhead="none" ];
+"331E" -> "332E" [ color="purple",arrowhead="none" ];
+"333E" -> "334E" [ color="purple",arrowhead="none" ];
+"335E" -> "336E" [ color="purple",arrowhead="none" ];
+"337E" -> "338E" [ color="purple",arrowhead="none" ];
+"339E" -> "340E" [ color="purple",arrowhead="none" ];
+"341E" -> "342E" [ color="purple",arrowhead="none" ];
+"343E" -> "344E" [ color="purple",arrowhead="none" ];
+"345E" -> "346E" [ color="purple",arrowhead="none" ];
+"347E" -> "348E" [ color="purple",arrowhead="none" ];
+"349E" -> "350E" [ color="purple",arrowhead="none" ];
+"351E" -> "352E" [ color="purple",arrowhead="none" ];
+"353E" -> "354E" [ color="purple",arrowhead="none" ];
+"412E" -> "355E" [ color="purple",arrowhead="none" ];
+"357E" -> "358E" [ color="purple",arrowhead="none" ];
+"359E" -> "360E" [ color="purple",arrowhead="none" ];
+"361E" -> "362E" [ color="purple",arrowhead="none" ];
+"363E" -> "364E" [ color="purple",arrowhead="none" ];
+"365E" -> "366E" [ color="purple",arrowhead="none" ];
+"367E" -> "368E" [ color="purple",arrowhead="none" ];
+"369E" -> "370E" [ color="purple",arrowhead="none" ];
+"371E" -> "372E" [ color="purple",arrowhead="none" ];
+"373E" -> "374E" [ color="purple",arrowhead="none" ];
+"375E" -> "376E" [ color="purple",arrowhead="none" ];
+"377E" -> "378E" [ color="purple",arrowhead="none" ];
+"379E" -> "380E" [ color="purple",arrowhead="none" ];
+"381E" -> "382E" [ color="purple",arrowhead="none" ];
+"383E" -> "384E" [ color="purple",arrowhead="none" ];
+"385E" -> "386E" [ color="purple",arrowhead="none" ];
+"387E" -> "388E" [ color="purple",arrowhead="none" ];
+"389E" -> "390E" [ color="purple",arrowhead="none" ];
+"391E" -> "392E" [ color="purple",arrowhead="none" ];
+"393E" -> "394E" [ color="purple",arrowhead="none" ];
+"395E" -> "396E" [ color="purple",arrowhead="none" ];
+"397E" -> "398E" [ color="purple",arrowhead="none" ];
+"399E" -> "400E" [ color="purple",arrowhead="none" ];
+"402E" -> "401E" [ color="purple",arrowhead="none" ];
+"404E" -> "403E" [ color="purple",arrowhead="none" ];
+"406E" -> "405E" [ color="purple",arrowhead="none" ];
+"408E" -> "407E" [ color="purple",arrowhead="none" ];
+"236E" -> "409E" [ color="purple",arrowhead="none" ];
+"412E" -> "411E" [ color="purple",arrowhead="none" ];
+"412E" -> "413E" [ color="purple",arrowhead="none" ];
+"278E" -> "415E" [ color="purple",arrowhead="none" ];
+"417E" -> "418E" [ color="purple",arrowhead="none" ];
+"419E" -> "420E" [ color="purple",arrowhead="none" ];
+"421E" -> "422E" [ color="purple",arrowhead="none" ];
+"423E" -> "424E" [ color="purple",arrowhead="none" ];
+"425E" -> "426E" [ color="purple",arrowhead="none" ];
+"427E" -> "428E" [ color="purple",arrowhead="none" ];
+"431E" -> "432E" [ color="purple",arrowhead="none" ];
+"433E" -> "434E" [ color="purple",arrowhead="none" ];
+"435E" -> "436E" [ color="purple",arrowhead="none" ];
+"438E" -> "437E" [ color="purple",arrowhead="none" ];
+"439E" -> "440E" [ color="purple",arrowhead="none" ];
+"441E" -> "442E" [ color="purple",arrowhead="none" ];
+"443E" -> "444E" [ color="purple",arrowhead="none" ];
+"445E" -> "446E" [ color="purple",arrowhead="none" ];
+"448E" -> "447E" [ color="purple",arrowhead="none" ];
+"449E" -> "450E" [ color="purple",arrowhead="none" ];
+"451E" -> "452E" [ color="purple",arrowhead="none" ];
+"453E" -> "454E" [ color="purple",arrowhead="none" ];
+"455E" -> "456E" [ color="purple",arrowhead="none" ];
+"457E" -> "458E" [ color="purple",arrowhead="none" ];
+"459E" -> "460E" [ color="purple",arrowhead="none" ];
+"461E" -> "462E" [ color="purple",arrowhead="none" ];
+"236E" -> "463E" [ color="purple",arrowhead="none" ];
+"465E" -> "466E" [ color="purple",arrowhead="none" ];
+"467E" -> "468E" [ color="purple",arrowhead="none" ];
+"469E" -> "470E" [ color="purple",arrowhead="none" ];
+"471E" -> "472E" [ color="purple",arrowhead="none" ];
+"473E" -> "474E" [ color="purple",arrowhead="none" ];
+"476E" -> "475E" [ color="purple",arrowhead="none" ];
+"477E" -> "478E" [ color="purple",arrowhead="none" ];
+"479E" -> "358E" [ color="purple",arrowhead="none" ];
+"481E" -> "482E" [ color="purple",arrowhead="none" ];
+"483E" -> "484E" [ color="purple",arrowhead="none" ];
+"485E" -> "486E" [ color="purple",arrowhead="none" ];
+"487E" -> "488E" [ color="purple",arrowhead="none" ];
+"489E" -> "490E" [ color="purple",arrowhead="none" ];
+"491E" -> "492E" [ color="purple",arrowhead="none" ];
+"495E" -> "795E" [ color="purple",arrowhead="none" ];
+"499E" -> "500E" [ color="purple",arrowhead="none" ];
+"501E" -> "502E" [ color="purple",arrowhead="none" ];
+"504E" -> "503E" [ color="purple",arrowhead="none" ];
+"505E" -> "506E" [ color="purple",arrowhead="none" ];
+"507E" -> "508E" [ color="purple",arrowhead="none" ];
+"509E" -> "510E" [ color="purple",arrowhead="none" ];
+"412E" -> "511E" [ color="purple",arrowhead="none" ];
+"513E" -> "514E" [ color="purple",arrowhead="none" ];
+"515E" -> "516E" [ color="purple",arrowhead="none" ];
+"517E" -> "518E" [ color="purple",arrowhead="none" ];
+"519E" -> "520E" [ color="purple",arrowhead="none" ];
+"521E" -> "522E" [ color="purple",arrowhead="none" ];
+"523E" -> "524E" [ color="purple",arrowhead="none" ];
+"525E" -> "526E" [ color="purple",arrowhead="none" ];
+"527E" -> "528E" [ color="purple",arrowhead="none" ];
+"529E" -> "530E" [ color="purple",arrowhead="none" ];
+"531E" -> "532E" [ color="purple",arrowhead="none" ];
+"533E" -> "534E" [ color="purple",arrowhead="none" ];
+"535E" -> "536E" [ color="purple",arrowhead="none" ];
+"537E" -> "538E" [ color="purple",arrowhead="none" ];
+"539E" -> "540E" [ color="purple",arrowhead="none" ];
+"541E" -> "542E" [ color="purple",arrowhead="none" ];
+"543E" -> "544E" [ color="purple",arrowhead="none" ];
+"545E" -> "546E" [ color="purple",arrowhead="none" ];
+"547E" -> "548E" [ color="purple",arrowhead="none" ];
+"549E" -> "550E" [ color="purple",arrowhead="none" ];
+"551E" -> "552E" [ color="purple",arrowhead="none" ];
+"553E" -> "554E" [ color="purple",arrowhead="none" ];
+"555E" -> "556E" [ color="purple",arrowhead="none" ];
+"557E" -> "558E" [ color="purple",arrowhead="none" ];
+"278E" -> "559E" [ color="purple",arrowhead="none" ];
+"561E" -> "562E" [ color="purple",arrowhead="none" ];
+"563E" -> "564E" [ color="purple",arrowhead="none" ];
+"565E" -> "566E" [ color="purple",arrowhead="none" ];
+"567E" -> "568E" [ color="purple",arrowhead="none" ];
+"569E" -> "570E" [ color="purple",arrowhead="none" ];
+"571E" -> "572E" [ color="purple",arrowhead="none" ];
+"573E" -> "574E" [ color="purple",arrowhead="none" ];
+"575E" -> "576E" [ color="purple",arrowhead="none" ];
+"577E" -> "578E" [ color="purple",arrowhead="none" ];
+"579E" -> "580E" [ color="purple",arrowhead="none" ];
+"581E" -> "582E" [ color="purple",arrowhead="none" ];
+"583E" -> "584E" [ color="purple",arrowhead="none" ];
+"585E" -> "586E" [ color="purple",arrowhead="none" ];
+"587E" -> "588E" [ color="purple",arrowhead="none" ];
+"589E" -> "590E" [ color="purple",arrowhead="none" ];
+"593E" -> "594E" [ color="purple",arrowhead="none" ];
+"597E" -> "598E" [ color="purple",arrowhead="none" ];
+"599E" -> "600E" [ color="purple",arrowhead="none" ];
+"601E" -> "602E" [ color="purple",arrowhead="none" ];
+"603E" -> "604E" [ color="purple",arrowhead="none" ];
+"605E" -> "606E" [ color="purple",arrowhead="none" ];
+"607E" -> "608E" [ color="purple",arrowhead="none" ];
+"609E" -> "610E" [ color="purple",arrowhead="none" ];
+"611E" -> "612E" [ color="purple",arrowhead="none" ];
+"613E" -> "614E" [ color="purple",arrowhead="none" ];
+"615E" -> "358E" [ color="purple",arrowhead="none" ];
+"617E" -> "618E" [ color="purple",arrowhead="none" ];
+"619E" -> "620E" [ color="purple",arrowhead="none" ];
+"621E" -> "622E" [ color="purple",arrowhead="none" ];
+"623E" -> "624E" [ color="purple",arrowhead="none" ];
+"625E" -> "626E" [ color="purple",arrowhead="none" ];
+"627E" -> "628E" [ color="purple",arrowhead="none" ];
+"629E" -> "630E" [ color="purple",arrowhead="none" ];
+"631E" -> "632E" [ color="purple",arrowhead="none" ];
+"634E" -> "633E" [ color="purple",arrowhead="none" ];
+"635E" -> "636E" [ color="purple",arrowhead="none" ];
+"637E" -> "638E" [ color="purple",arrowhead="none" ];
+"639E" -> "640E" [ color="purple",arrowhead="none" ];
+"641E" -> "642E" [ color="purple",arrowhead="none" ];
+"643E" -> "644E" [ color="purple",arrowhead="none" ];
+"645E" -> "646E" [ color="purple",arrowhead="none" ];
+"647E" -> "648E" [ color="purple",arrowhead="none" ];
+"649E" -> "650E" [ color="purple",arrowhead="none" ];
+"651E" -> "652E" [ color="purple",arrowhead="none" ];
+"653E" -> "654E" [ color="purple",arrowhead="none" ];
+"655E" -> "656E" [ color="purple",arrowhead="none" ];
+"657E" -> "658E" [ color="purple",arrowhead="none" ];
+"659E" -> "660E" [ color="purple",arrowhead="none" ];
+"661E" -> "662E" [ color="purple",arrowhead="none" ];
+"663E" -> "664E" [ color="purple",arrowhead="none" ];
+"665E" -> "666E" [ color="purple",arrowhead="none" ];
+"667E" -> "668E" [ color="purple",arrowhead="none" ];
+"669E" -> "670E" [ color="purple",arrowhead="none" ];
+"671E" -> "672E" [ color="purple",arrowhead="none" ];
+"673E" -> "674E" [ color="purple",arrowhead="none" ];
+"675E" -> "676E" [ color="purple",arrowhead="none" ];
+"679E" -> "680E" [ color="purple",arrowhead="none" ];
+"681E" -> "682E" [ color="purple",arrowhead="none" ];
+"683E" -> "684E" [ color="purple",arrowhead="none" ];
+"685E" -> "686E" [ color="purple",arrowhead="none" ];
+"687E" -> "688E" [ color="purple",arrowhead="none" ];
+"689E" -> "690E" [ color="purple",arrowhead="none" ];
+"691E" -> "692E" [ color="purple",arrowhead="none" ];
+"693E" -> "694E" [ color="purple",arrowhead="none" ];
+"695E" -> "696E" [ color="purple",arrowhead="none" ];
+"697E" -> "698E" [ color="purple",arrowhead="none" ];
+"699E" -> "700E" [ color="purple",arrowhead="none" ];
+"703E" -> "704E" [ color="purple",arrowhead="none" ];
+"705E" -> "706E" [ color="purple",arrowhead="none" ];
+"709E" -> "710E" [ color="purple",arrowhead="none" ];
+"711E" -> "712E" [ color="purple",arrowhead="none" ];
+"713E" -> "714E" [ color="purple",arrowhead="none" ];
+"715E" -> "398E" [ color="purple",arrowhead="none" ];
+"717E" -> "718E" [ color="purple",arrowhead="none" ];
+"719E" -> "720E" [ color="purple",arrowhead="none" ];
+"721E" -> "722E" [ color="purple",arrowhead="none" ];
+"725E" -> "726E" [ color="purple",arrowhead="none" ];
+"727E" -> "728E" [ color="purple",arrowhead="none" ];
+"729E" -> "730E" [ color="purple",arrowhead="none" ];
+"731E" -> "732E" [ color="purple",arrowhead="none" ];
+"741E" -> "743E" [ color="purple",arrowhead="none" ];
+"742E" -> "744E" [ color="purple",arrowhead="none" ];
+"745E" -> "754E" [ color="purple",arrowhead="none" ];
+"746E" -> "755E" [ color="purple",arrowhead="none" ];
+"747E" -> "756E" [ color="purple",arrowhead="none" ];
+"748E" -> "757E" [ color="purple",arrowhead="none" ];
+"749E" -> "758E" [ color="purple",arrowhead="none" ];
+"750E" -> "759E" [ color="purple",arrowhead="none" ];
+"751E" -> "760E" [ color="purple",arrowhead="none" ];
+"752E" -> "761E" [ color="purple",arrowhead="none" ];
+"753E" -> "762E" [ color="purple",arrowhead="none" ];
+"763E" -> "764E" [ color="purple",arrowhead="none" ];
+"765E" -> "766E" [ color="purple",arrowhead="none" ];
+"770E" -> "783E" [ color="purple",arrowhead="none" ];
+"770E" -> "784E" [ color="purple",arrowhead="none" ];
+"769E" -> "785E" [ color="purple",arrowhead="none" ];
+"769E" -> "786E" [ color="purple",arrowhead="none" ];
+"769E" -> "787E" [ color="purple",arrowhead="none" ];
+"770E" -> "788E" [ color="purple",arrowhead="none" ];
+"770E" -> "789E" [ color="purple",arrowhead="none" ];
+"769E" -> "790E" [ color="purple",arrowhead="none" ];
+"770E" -> "791E" [ color="purple",arrowhead="none" ];
+"769E" -> "792E" [ color="purple",arrowhead="none" ];
+"793E" -> "769E" [ color="purple",arrowhead="none" ];
+"769E" -> "784E" [ color="purple",arrowhead="none" ];
+"770E" -> "785E" [ color="purple",arrowhead="none" ];
+"788E" -> "787E" [ color="purple",arrowhead="none" ];
+"770E" -> "792E" [ color="purple",arrowhead="none" ];
+"798E" -> "799E" [ color="purple",arrowhead="none" ];
+"796E" -> "797E" [ color="purple",arrowhead="none" ];
+"793E" -> "789E" [ color="purple",arrowhead="none" ];
+"783E" -> "787E" [ color="purple",arrowhead="none" ];
+"784E" -> "792E" [ color="purple",arrowhead="none" ];
+"787E" -> "789E" [ color="purple",arrowhead="none" ];
+"769E" -> "791E" [ color="purple",arrowhead="none" ];
+"802E" -> "801E" [ color="purple",arrowhead="none" ];
+}
diff --git a/examples/network/data/dotLanguage/graphvizGallery/unix.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/unix.gv.txt
new file mode 100644
index 0000000000..431ab655c2
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/unix.gv.txt
@@ -0,0 +1,55 @@
+/* courtesy Ian Darwin and Geoff Collyer, Softquad Inc. */
+digraph unix {
+ size="6,6";
+ node [color=lightblue, style=filled];
+ "5th Edition" -> "6th Edition";
+ "5th Edition" -> "PWB 1.0";
+ "6th Edition" -> "LSX";
+ "6th Edition" -> "1 BSD";
+ "6th Edition" -> "Mini Unix";
+ "6th Edition" -> "Wollongong";
+ "6th Edition" -> "Interdata";
+ "Interdata" -> "Unix/TS 3.0";
+ "Interdata" -> "PWB 2.0";
+ "Interdata" -> "7th Edition";
+ "7th Edition" -> "8th Edition";
+ "7th Edition" -> "32V";
+ "7th Edition" -> "V7M";
+ "7th Edition" -> "Ultrix-11";
+ "7th Edition" -> "Xenix";
+ "7th Edition" -> "UniPlus+";
+ "V7M" -> "Ultrix-11";
+ "8th Edition" -> "9th Edition";
+ "1 BSD" -> "2 BSD";
+ "2 BSD" -> "2.8 BSD";
+ "2.8 BSD" -> "Ultrix-11";
+ "2.8 BSD" -> "2.9 BSD";
+ "32V" -> "3 BSD";
+ "3 BSD" -> "4 BSD";
+ "4 BSD" -> "4.1 BSD";
+ "4.1 BSD" -> "4.2 BSD";
+ "4.1 BSD" -> "2.8 BSD";
+ "4.1 BSD" -> "8th Edition";
+ "4.2 BSD" -> "4.3 BSD";
+ "4.2 BSD" -> "Ultrix-32";
+ "PWB 1.0" -> "PWB 1.2";
+ "PWB 1.0" -> "USG 1.0";
+ "PWB 1.2" -> "PWB 2.0";
+ "USG 1.0" -> "CB Unix 1";
+ "USG 1.0" -> "USG 2.0";
+ "CB Unix 1" -> "CB Unix 2";
+ "CB Unix 2" -> "CB Unix 3";
+ "CB Unix 3" -> "Unix/TS++";
+ "CB Unix 3" -> "PDP-11 Sys V";
+ "USG 2.0" -> "USG 3.0";
+ "USG 3.0" -> "Unix/TS 3.0";
+ "PWB 2.0" -> "Unix/TS 3.0";
+ "Unix/TS 1.0" -> "Unix/TS 3.0";
+ "Unix/TS 3.0" -> "TS 4.0";
+ "Unix/TS++" -> "TS 4.0";
+ "CB Unix 3" -> "TS 4.0";
+ "TS 4.0" -> "System V.0";
+ "System V.0" -> "System V.2";
+ "System V.2" -> "System V.3";
+}
+
diff --git a/examples/network/data/dotLanguage/graphvizGallery/world.gv.txt b/examples/network/data/dotLanguage/graphvizGallery/world.gv.txt
new file mode 100644
index 0000000000..3e6e4e3708
--- /dev/null
+++ b/examples/network/data/dotLanguage/graphvizGallery/world.gv.txt
@@ -0,0 +1,67 @@
+digraph world {
+size="7,7";
+ {rank=same; S8 S24 S1 S35 S30;}
+ {rank=same; T8 T24 T1 T35 T30;}
+ {rank=same; 43 37 36 10 2;}
+ {rank=same; 25 9 38 40 13 17 12 18;}
+ {rank=same; 26 42 11 3 33 19 39 14 16;}
+ {rank=same; 4 31 34 21 41 28 20;}
+ {rank=same; 27 5 22 32 29 15;}
+ {rank=same; 6 23;}
+ {rank=same; 7;}
+
+ S8 -> 9;
+ S24 -> 25;
+ S24 -> 27;
+ S1 -> 2;
+ S1 -> 10;
+ S35 -> 43;
+ S35 -> 36;
+ S30 -> 31;
+ S30 -> 33;
+ 9 -> 42;
+ 9 -> T1;
+ 25 -> T1;
+ 25 -> 26;
+ 27 -> T24;
+ 2 -> {3 ; 16 ; 17 ; T1 ; 18}
+ 10 -> { 11 ; 14 ; T1 ; 13; 12;}
+ 31 -> T1;
+ 31 -> 32;
+ 33 -> T30;
+ 33 -> 34;
+ 42 -> 4;
+ 26 -> 4;
+ 3 -> 4;
+ 16 -> 15;
+ 17 -> 19;
+ 18 -> 29;
+ 11 -> 4;
+ 14 -> 15;
+ 37 -> {39 ; 41 ; 38 ; 40;}
+ 13 -> 19;
+ 12 -> 29;
+ 43 -> 38;
+ 43 -> 40;
+ 36 -> 19;
+ 32 -> 23;
+ 34 -> 29;
+ 39 -> 15;
+ 41 -> 29;
+ 38 -> 4;
+ 40 -> 19;
+ 4 -> 5;
+ 19 -> {21 ; 20 ; 28;}
+ 5 -> {6 ; T35 ; 23;}
+ 21 -> 22;
+ 20 -> 15;
+ 28 -> 29;
+ 6 -> 7;
+ 15 -> T1;
+ 22 -> T35;
+ 22 -> 23;
+ 29 -> T30;
+ 7 -> T8;
+ 23 -> T24;
+ 23 -> T1;
+}
diff --git a/examples/network/data/dynamicData.html b/examples/network/data/dynamicData.html
new file mode 100644
index 0000000000..5b5c413c4c
--- /dev/null
+++ b/examples/network/data/dynamicData.html
@@ -0,0 +1,266 @@
+
+
+
+
Network | DataSet
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This example demonstrates dynamically adding, updating and removing nodes
+ and edges using a DataSet.
+
+
+
Adjust
+
+
+
+ Node
+
+
+
+ Edge
+
+
+
+
+
+
+
View
+
+
+
+
+
+
+
+
+ Nodes
+
+
+
+
+ Edges
+
+
+
+
+ Network
+
+
+
+
+
+
+
+
diff --git a/examples/network/data/importingFromGephi.html b/examples/network/data/importingFromGephi.html
new file mode 100644
index 0000000000..bfb7415318
--- /dev/null
+++ b/examples/network/data/importingFromGephi.html
@@ -0,0 +1,174 @@
+
+
+
+
+
+
Dynamic Data - Importing from Gephi (JSON)
+
+
+
+
+
+
+
+
+
+
+
+
Dynamic Data - Importing from Gephi (JSON)
+
+
+ This example shows how to import a JSON file exported by Gephi. The two
+ options available for the import are
+ available through the checkboxes. You can download the Gephi JSON exporter
+ here:
+
https://marketplace.gephi.org/plugin/json-exporter/ .
+ All of Gephi's attributes are also contained within the node elements. This
+ means you can access all of this data through the DataSet.
+
+
+
+
+ Fix in place after import.
+ Parse the color instead of
+ copy (adds borders, highlights etc.)
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/data/scalingCustom.html b/examples/network/data/scalingCustom.html
new file mode 100644
index 0000000000..b906444601
--- /dev/null
+++ b/examples/network/data/scalingCustom.html
@@ -0,0 +1,86 @@
+
+
+
+
Network | Sizing
+
+
+
+
+
+
+
+
+
+
+
+ Scale nodes and edges depending on their value. Hover over nodes and edges to get more information.
+
+
+
+
diff --git a/examples/network/data/scalingNodesEdges.html b/examples/network/data/scalingNodesEdges.html
new file mode 100644
index 0000000000..392653efa3
--- /dev/null
+++ b/examples/network/data/scalingNodesEdges.html
@@ -0,0 +1,79 @@
+
+
+
+
Network | Sizing
+
+
+
+
+
+
+
+
+
+
+
+ Scale nodes and edges depending on their value. Hover over the edges to get a popup with more information.
+
+
+
+
diff --git a/examples/network/data/scalingNodesEdgesLabels.html b/examples/network/data/scalingNodesEdgesLabels.html
new file mode 100644
index 0000000000..fc52b99616
--- /dev/null
+++ b/examples/network/data/scalingNodesEdgesLabels.html
@@ -0,0 +1,85 @@
+
+
+
+
Network | Sizing
+
+
+
+
+
+
+
+
+
+
+
+ Scale nodes and edges depending on their value. Hover over edges to get a popup with more information.
+
+
+
+
diff --git a/examples/network/datasources/WorldCup2014.js b/examples/network/datasources/WorldCup2014.js
new file mode 100644
index 0000000000..f08a4a41c3
--- /dev/null
+++ b/examples/network/datasources/WorldCup2014.js
@@ -0,0 +1,9970 @@
+var nodes = [
+ {id: 1, label: 'Abdelmoumene Djabou', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Club Africain', value: 22, group: 24, x: -1392.5499, y: 1124.1614},
+ {id: 2, label: 'Abel Aguilar', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Toulouse', value: 24, group: 11, x: -660.82574, y: 1009.18976},
+ {id: 3, label: 'Abel Hernández', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Palermo', value: 22, group: 6, x: -85.6025, y: -6.6782646},
+ {id: 4, label: 'Adam Kwarasey', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Strømsgodset', value: 22, group: 5, x: 427.39853, y: 1398.1719},
+ {id: 5, label: 'Adam Lallana', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Southampton', value: 26, group: 28, x: -133.68427, y: -732.50476},
+ {id: 6, label: 'Adam Taggart', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Newcastle Jets', value: 22, group: 12, x: 2042.4272, y: -579.6042},
+ {id: 7, label: 'Admir Mehmedi', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'SC Freiburg', value: 24, group: 0, x: 126.91814, y: 115.84123},
+ {id: 8, label: 'Adnan Januzaj', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Manchester United', value: 34, group: 28, x: -638.503, y: -663.07904},
+ {id: 9, label: 'Adrián Bone', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'El Nacional', value: 22, group: 4, x: -1657.1593, y: -645.2429},
+ {id: 10, label: 'Adrián Ramos', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Hertha BSC', value: 23, group: 11, x: -712.13385, y: 1053.3159},
+ {id: 11, label: 'Afriyie Acquah', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Parma', value: 26, group: 5, x: 358.25735, y: 1238.4801},
+ {id: 12, label: 'AgustÃn Orión', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Boca Juniors', value: 22, group: 19, x: -1115.8746, y: 250.34308},
+ {id: 13, label: 'Ahmad Alenemeh', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Naft Tehran', value: 22, group: 1, x: 2028.4565, y: 1067.9126},
+ {id: 14, label: 'Ahmed Musa', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'CSKA Moscow', value: 27, group: 14, x: -341.64163, y: -1640.5049},
+ {id: 15, label: 'Aïssa Mandi', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Reims', value: 22, group: 24, x: -1380.8287, y: 1169.2931},
+ {id: 16, label: 'Alan Dzagoev', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'CSKA Moscow', value: 23, group: 2, x: -1268.165, y: -1469.7052},
+ {id: 17, label: 'Alan Pulido', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'UANL', value: 22, group: 21, x: -2016.3092, y: 442.13663},
+ {id: 18, label: 'Albert Adomah', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Middlesbrough', value: 23, group: 5, x: 449.02316, y: 1183.7205},
+ {id: 19, label: 'Alberto Aquilani', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Fiorentina', value: 24, group: 3, x: 51.16946, y: 883.6703},
+ {id: 20, label: 'Alejandro Bedoya', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Nantes', value: 22, group: 26, x: 784.4289, y: -1547.6515},
+ {id: 21, label: 'Aleksandr Kerzhakov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 26, group: 2, x: -1228.8892, y: -1267.067},
+ {id: 22, label: 'Aleksandr Kokorin', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Dynamo Moscow', value: 23, group: 2, x: -1414.3739, y: -1377.2596},
+ {id: 23, label: 'Aleksandr Samedov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Lokomotiv Moscow', value: 23, group: 2, x: -1362.3624, y: -1347.75},
+ {id: 24, label: 'Aleksei Ionov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Dynamo Moscow', value: 23, group: 2, x: -1428.0071, y: -1427.2177},
+ {id: 25, label: 'Aleksei Kozlov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Dynamo Moscow', value: 23, group: 2, x: -1463.2527, y: -1376.6138},
+ {id: 26, label: 'Alessio Cerci', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Torino', value: 23, group: 3, x: 276.62708, y: 826.51605},
+ {id: 27, label: 'Alex Oxlade-Chamberlain', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Arsenal', value: 30, group: 28, x: -56.50232, y: -825.3445},
+ {id: 28, label: 'Alex Song', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Barcelona', value: 37, group: 17, x: -256.07828, y: 56.990772},
+ {id: 29, label: 'Alex Wilkinson', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Jeonbuk Hyundai Motors', value: 22, group: 12, x: 2120.3818, y: -724.748},
+ {id: 30, label: 'Alexander DomÃnguez', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'LDU Quito', value: 22, group: 4, x: -1643.0283, y: -689.7502},
+ {id: 31, label: 'Alexander MejÃa', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Atlético Nacional', value: 22, group: 11, x: -761.32623, y: 1152.3298},
+ {id: 32, label: 'Alexandros Tziolis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Kayserispor', value: 22, group: 15, x: 1617.3293, y: 542.81915},
+ {id: 33, label: 'Alexis Sánchez', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Barcelona', value: 37, group: 18, x: -613.0529, y: 828.08685},
+ {id: 34, label: 'Alfredo Talavera', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Toluca', value: 22, group: 21, x: -1995.7101, y: 401.94843},
+ {id: 35, label: 'Alireza Haghighi', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Sporting Covilhã', value: 22, group: 1, x: 1910.1731, y: 1066.8309},
+ {id: 36, label: 'Alireza Jahanbakhsh', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'NEC', value: 22, group: 1, x: 1942.0732, y: 1034.9001},
+ {id: 37, label: 'Allan Nyom', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Granada', value: 24, group: 17, x: 381.53027, y: 285.77576},
+ {id: 38, label: 'Ãlvaro González', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Lazio', value: 28, group: 6, x: 13.4137335, y: -43.777435},
+ {id: 39, label: 'Ãlvaro Pereira', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'São Paulo', value: 22, group: 6, x: -93.8017, y: 34.243332},
+ {id: 40, label: 'Amir Hossein Sadeghi', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Esteghlal', value: 22, group: 1, x: 1990.1855, y: 1052.6255},
+ {id: 41, label: 'Andranik Teymourian', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Esteghlal', value: 22, group: 1, x: 1940.6577, y: 1114.8914},
+ {id: 42, label: 'André Almeida', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Benfica', value: 25, group: 8, x: -733.05725, y: 266.987},
+ {id: 43, label: 'André Ayew', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Marseille', value: 24, group: 5, x: 486.66187, y: 1226.3735},
+ {id: 44, label: 'André Schürrle', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Chelsea', value: 33, group: 13, x: 130.8471, y: -528.93024},
+ {id: 45, label: 'Andrea Barzagli', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Juventus', value: 28, group: 3, x: 109.97049, y: 937.16266},
+ {id: 46, label: 'Andrea Pirlo', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Juventus', value: 28, group: 3, x: 108.0534, y: 870.1171},
+ {id: 47, label: 'Andreas Samaris', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Olympiacos', value: 23, group: 15, x: 1692.9755, y: 475.92816},
+ {id: 48, label: 'Andrei Semyonov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Terek Grozny', value: 22, group: 2, x: -1427.7258, y: -1522.6016},
+ {id: 49, label: 'Andrés Guardado', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Bayer Leverkusen', value: 24, group: 21, x: -1822.0682, y: 449.03262},
+ {id: 50, label: 'Andrés Iniesta', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Barcelona', value: 31, group: 23, x: -1067.9244, y: -187.44284},
+ {id: 51, label: 'Andrey Yeshchenko', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Anzhi Makhachkala', value: 22, group: 2, x: -1412.1168, y: -1477.2361},
+ {id: 52, label: 'Andy Najar', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Anderlecht', value: 23, group: 7, x: 1494.2014, y: -1172.4867},
+ {id: 53, label: 'Anel Hadžic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Sturm Graz', value: 22, group: 20, x: 1149.5178, y: -490.41513},
+ {id: 54, label: 'Ãngel di MarÃa', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Real Madrid', value: 33, group: 19, x: -968.5764, y: 161.48494},
+ {id: 55, label: 'Ante Rebic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Fiorentina', value: 24, group: 25, x: -308.12177, y: 744.399},
+ {id: 56, label: 'Anthony Vanden Borre', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Anderlecht', value: 23, group: 28, x: -577.6633, y: -888.84265},
+ {id: 57, label: 'Antoine Griezmann', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Real Sociedad', value: 25, group: 16, x: 63.922184, y: -173.65816},
+ {id: 58, label: 'Antonio Candreva', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Lazio', value: 28, group: 3, x: 180.96414, y: 574.7693},
+ {id: 59, label: 'Antonio Cassano', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Parma', value: 24, group: 3, x: 193.04764, y: 758.9299},
+ {id: 60, label: 'Antonio Valencia (c)', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Manchester United', value: 35, group: 4, x: -1293.8275, y: -612.48834},
+ {id: 61, label: 'Arjen Robben', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Bayern Munich', value: 35, group: 22, x: 630.80566, y: -143.44237},
+ {id: 62, label: 'Aron Jóhannsson', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'AZ', value: 22, group: 26, x: 819.32007, y: -1520.0212},
+ {id: 63, label: 'Arthur Boka', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'VfB Stuttgart', value: 25, group: 9, x: 447.86835, y: -798.1806},
+ {id: 64, label: 'Arturo Vidal', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Juventus', value: 32, group: 18, x: -116.507996, y: 1233.55},
+ {id: 65, label: 'Asamoah Gyan (c)', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Al-Ain', value: 22, group: 5, x: 384.49658, y: 1385.8724},
+ {id: 66, label: 'Ashkan Dejagah', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Fulham', value: 24, group: 1, x: 1842.1604, y: 978.62915},
+ {id: 67, label: 'Asmir Avdukic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Borac Banja Luka', value: 22, group: 20, x: 1126.5564, y: -529.6863},
+ {id: 68, label: 'Asmir Begovic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Stoke City', value: 25, group: 20, x: 1126.9225, y: -656.7364},
+ {id: 69, label: 'Atsuto Uchida', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Schalke 04', value: 28, group: 27, x: 789.175, y: 479.11423},
+ {id: 70, label: 'Augusto Fernández', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Celta Vigo', value: 23, group: 19, x: -1096.7728, y: 332.52386},
+ {id: 71, label: 'Aurélien Chedjou', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Galatasaray', value: 26, group: 17, x: 479.9816, y: 42.06589},
+ {id: 72, label: 'Austin Ejide', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Hapoel Beer Sheva', value: 22, group: 14, x: -127.8801, y: -1587.7189},
+ {id: 73, label: 'Avdija Vršajevic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Hajduk Split', value: 22, group: 20, x: 1155.9982, y: -446.01266},
+ {id: 74, label: 'Axel Witsel', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 28, group: 28, x: -844.52124, y: -894.0247},
+ {id: 75, label: 'Azubuike Egwuekwe', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Warri Wolves', value: 22, group: 14, x: -40.194813, y: -1612.7229},
+ {id: 76, label: 'Bacary Sagna', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Arsenal', value: 29, group: 16, x: -102.573074, y: -365.21664},
+ {id: 77, label: 'Bailey Wright', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Preston North End', value: 22, group: 12, x: 2074.923, y: -613.972},
+ {id: 78, label: 'Bakhtiar Rahmani', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Foolad', value: 22, group: 1, x: 2063.0938, y: 1033.574},
+ {id: 79, label: 'Bastian Schweinsteiger', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Bayern Munich', value: 29, group: 13, x: 244.85414, y: -373.98276},
+ {id: 80, label: 'Ben Foster', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'West Bromwich Albion', value: 23, group: 28, x: -170.48405, y: -869.56903},
+ {id: 81, label: 'Ben Halloran', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Fortuna Düsseldorf', value: 23, group: 12, x: 1954.242, y: -623.5981},
+ {id: 82, label: 'Benedikt Höwedes', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Schalke 04', value: 27, group: 13, x: 472.64325, y: -229.06421},
+ {id: 83, label: 'Benjamin Moukandjo', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Nancy', value: 22, group: 17, x: 415.3849, y: 99.65612},
+ {id: 84, label: 'Benoît Assou-Ekotto', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Queens Park Rangers', value: 23, group: 17, x: 484.1712, y: 273.5127},
+ {id: 85, label: 'Bernard', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Shakhtar Donetsk', value: 24, group: 23, x: -458.8, y: -206.65053},
+ {id: 86, label: 'Beto', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Sevilla', value: 25, group: 8, x: -614.7038, y: 392.89618},
+ {id: 87, label: 'Blaise Matuidi', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 29, group: 16, x: -108.933846, y: -90.56801},
+ {id: 88, label: 'Blerim Džemaili', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Napoli', value: 31, group: 0, x: -243.03868, y: 290.13797},
+ {id: 89, label: 'Boubacar Barry', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Lokeren', value: 22, group: 9, x: 488.79492, y: -907.9203},
+ {id: 90, label: 'Brad Davis', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Houston Dynamo', value: 23, group: 26, x: 915.66956, y: -1565.8953},
+ {id: 91, label: 'Brad Guzan', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Aston Villa', value: 23, group: 26, x: 829.8172, y: -1411.8826},
+ {id: 92, label: 'Brayan Beckeles', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Olimpia', value: 22, group: 7, x: 1616.757, y: -1172.5592},
+ {id: 93, label: 'Bruno Alves', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Fenerbahçe', value: 25, group: 8, x: -538.8344, y: 183.03185},
+ {id: 94, label: 'Bruno Martins Indi', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Feyenoord', value: 22, group: 22, x: 870.94403, y: 71.02484},
+ {id: 95, label: 'Bryan Ruiz (c)', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'PSV', value: 25, group: 29, x: 2006.2959, y: 332.36353},
+ {id: 96, label: 'Camilo Vargas', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Santa Fe', value: 23, group: 11, x: -870.7738, y: 1102.7423},
+ {id: 97, label: 'Carl Medjani', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Valenciennes', value: 23, group: 24, x: -1275.9651, y: 1205.1012},
+ {id: 98, label: 'Carlo Costly', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Real España', value: 22, group: 7, x: 1569.5697, y: -1167.269},
+ {id: 99, label: 'Carlos Bacca', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Sevilla', value: 25, group: 11, x: -687.1921, y: 1106.8958},
+ {id: 100, label: 'Carlos Carbonero', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'River Plate', value: 22, group: 11, x: -742.21783, y: 1199.1262},
+ {id: 101, label: 'Carlos Carmona', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Atalanta', value: 23, group: 18, x: -345.68073, y: 1473.0652},
+ {id: 102, label: 'Carlos Gruezo', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'VfB Stuttgart', value: 25, group: 4, x: -1417.159, y: -636.35205},
+ {id: 103, label: 'Carlos Peña', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'León', value: 22, group: 21, x: -2037.2489, y: 386.77597},
+ {id: 104, label: 'Carlos Salcido', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'UANL', value: 22, group: 21, x: -2011.8602, y: 347.69363},
+ {id: 105, label: 'Carlos Sánchez', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Elche', value: 22, group: 11, x: -775.67804, y: 1232.4089},
+ {id: 106, label: 'Carlos Valdés', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'San Lorenzo', value: 22, group: 11, x: -788.68494, y: 1186.096},
+ {id: 107, label: 'Cédric Djeugoué', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Coton Sport', value: 22, group: 17, x: 458.03027, y: 113.75822},
+ {id: 108, label: 'Cédric Si Mohamed', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'CS Constantine', value: 22, group: 24, x: -1432.4459, y: 1140.2423},
+ {id: 109, label: 'Celso Borges', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'AIK', value: 22, group: 29, x: 2214.5396, y: 283.79788},
+ {id: 110, label: 'César Azpilicueta', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Chelsea', value: 32, group: 23, x: -780.85876, y: -518.6595},
+ {id: 111, label: 'Cesc FÃ bregas', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Barcelona', value: 31, group: 23, x: -1070.0735, y: -271.46603},
+ {id: 112, label: 'Charles Aránguiz', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Internacional', value: 22, group: 18, x: -251.59665, y: 1476.4546},
+ {id: 113, label: 'Charles Itandje', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Konyaspor', value: 23, group: 17, x: 514.87463, y: 203.30963},
+ {id: 114, label: 'Cheick Tioté', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Newcastle United', value: 27, group: 9, x: 389.42743, y: -827.5475},
+ {id: 115, label: 'Chigozie Agbim', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Gombe United', value: 22, group: 14, x: -67.006065, y: -1575.516},
+ {id: 116, label: 'Chris Smalling', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Manchester United', value: 32, group: 28, x: -375.02072, y: -737.6564},
+ {id: 117, label: 'Chris Wondolowski', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'San Jose Earthquakes', value: 23, group: 26, x: 915.553, y: -1512.6752},
+ {id: 118, label: 'Christian Atsu', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Vitesse', value: 23, group: 5, x: 298.6339, y: 1290.5527},
+ {id: 119, label: 'Christian Bolaños', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Copenhagen', value: 22, group: 29, x: 2234.7017, y: 376.9046},
+ {id: 120, label: 'Christian Noboa', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Dynamo Moscow', value: 28, group: 4, x: -1672.2358, y: -885.3366},
+ {id: 121, label: 'Christian Stuani', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Espanyol', value: 23, group: 6, x: -159.9744, y: 40.993885},
+ {id: 122, label: 'Christoph Kramer', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Borussia Mönchengladbach', value: 23, group: 13, x: 422.9451, y: -364.46622},
+ {id: 123, label: 'Ciro Immobile', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Torino', value: 23, group: 3, x: 317.4282, y: 794.25037},
+ {id: 124, label: 'Claudio Bravo (c)', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Real Sociedad', value: 25, group: 18, x: -193.70801, y: 1267.7544},
+ {id: 125, label: 'Claudio Marchisio', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Juventus', value: 28, group: 3, x: 71.69534, y: 813.5998},
+ {id: 126, label: 'Clint Dempsey (c)', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Seattle Sounders FC', value: 22, group: 26, x: 742.0546, y: -1547.4186},
+ {id: 127, label: 'Constant Djakpa', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Eintracht Frankfurt', value: 23, group: 9, x: 513.1434, y: -809.9959},
+ {id: 128, label: 'Cristian Gamboa', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Rosenborg', value: 23, group: 29, x: 2154.0825, y: 199.01004},
+ {id: 129, label: 'Cristian RodrÃguez', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Atlético Madrid', value: 28, group: 6, x: -272.89346, y: -76.41096},
+ {id: 130, label: 'Cristián Zapata', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Milan', value: 29, group: 11, x: -503.784, y: 1159.0504},
+ {id: 131, label: 'Cristiano Ronaldo (c)', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Real Madrid', value: 31, group: 8, x: -705.8994, y: 163.73811},
+ {id: 132, label: 'Cristopher Toselli', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Universidad Católica', value: 22, group: 18, x: -291.25885, y: 1453.383},
+ {id: 133, label: 'Daley Blind', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Ajax', value: 22, group: 22, x: 865.13696, y: -4.895512},
+ {id: 134, label: 'DaMarcus Beasley', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Puebla', value: 22, group: 26, x: 860.4318, y: -1509.4606},
+ {id: 135, label: 'Dani Alves', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Barcelona', value: 36, group: 23, x: -742.1678, y: -271.698},
+ {id: 136, label: 'Daniel Cambronero', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Herediano', value: 22, group: 29, x: 2228.9766, y: 327.5744},
+ {id: 137, label: 'Daniel Davari', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Eintracht Braunschweig', value: 23, group: 1, x: 1905.6099, y: 955.88916},
+ {id: 138, label: 'Daniel Opare', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Standard Liège', value: 24, group: 5, x: 399.65134, y: 1199.5255},
+ {id: 139, label: 'Daniel Sturridge', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Liverpool', value: 27, group: 28, x: -202.59894, y: -933.40094},
+ {id: 140, label: 'Daniel Van Buyten', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Bayern Munich', value: 35, group: 28, x: -361.6232, y: -626.74445},
+ {id: 141, label: 'Daniele De Rossi', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Roma', value: 26, group: 3, x: 294.1721, y: 656.48535},
+ {id: 142, label: 'Danijel Pranjic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Panathinaikos', value: 23, group: 25, x: -193.00035, y: 612.0998},
+ {id: 143, label: 'Danijel Subašic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'AS Monaco', value: 25, group: 25, x: -426.1968, y: 636.2631},
+ {id: 144, label: 'Danny Welbeck', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Manchester United', value: 32, group: 28, x: -294.47705, y: -689.56665},
+ {id: 145, label: 'Dante', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Bayern Munich', value: 35, group: 23, x: -212.9895, y: -416.65964},
+ {id: 146, label: 'Dany Nounkeu', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Be?ikta?', value: 24, group: 17, x: 382.6164, y: 41.81477},
+ {id: 147, label: 'Darijo Srna (c)', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Shakhtar Donetsk', value: 23, group: 25, x: -317.20358, y: 580.4689},
+ {id: 148, label: 'Dario Vidošic', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Sion', value: 22, group: 12, x: 2016.2832, y: -666.32526},
+ {id: 149, label: 'Daryl Janmaat', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Feyenoord', value: 22, group: 22, x: 832.52924, y: 28.84025},
+ {id: 150, label: 'David de Gea', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Manchester United', value: 34, group: 23, x: -916.8024, y: -469.95193},
+ {id: 151, label: 'David Luiz', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Chelsea', value: 30, group: 23, x: -401.12976, y: -483.5873},
+ {id: 152, label: 'David Myrie', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Herediano', value: 22, group: 29, x: 2254.471, y: 256.6007},
+ {id: 153, label: 'David Ospina', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Nice', value: 22, group: 11, x: -821.8875, y: 1214.6177},
+ {id: 154, label: 'David Silva', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Manchester City', value: 31, group: 23, x: -782.84827, y: -359.3023},
+ {id: 155, label: 'David Villa', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Atlético Madrid', value: 27, group: 23, x: -854.8254, y: -313.94424},
+ {id: 156, label: 'DeAndre Yedlin', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Seattle Sounders FC', value: 22, group: 26, x: 776.44666, y: -1500.7616},
+ {id: 157, label: 'Dejan Lovren', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Southampton', value: 28, group: 25, x: -235.10854, y: 422.88907},
+ {id: 158, label: 'Denis Glushakov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Spartak Moscow', value: 22, group: 2, x: -1381.3909, y: -1518.6675},
+ {id: 159, label: 'Didier Drogba (c)', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Galatasaray', value: 26, group: 9, x: 598.48517, y: -735.1734},
+ {id: 160, label: 'Didier Ya Konan', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Hannover 96', value: 24, group: 9, x: 543.872, y: -767.347},
+ {id: 161, label: 'Didier Zokora', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Trabzonspor', value: 22, group: 9, x: 526.23566, y: -881.0933},
+ {id: 162, label: 'Diego Benaglio', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'VfL Wolfsburg', value: 27, group: 0, x: -65.30554, y: 256.20117},
+ {id: 163, label: 'Diego Calvo', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'VÃ¥lerenga', value: 22, group: 29, x: 2308.558, y: 341.58264},
+ {id: 164, label: 'Diego Costa', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Atlético Madrid', value: 27, group: 23, x: -946.3432, y: -379.19135},
+ {id: 165, label: 'Diego Forlán', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Cerezo Osaka', value: 24, group: 6, x: 22.544487, y: 32.103252},
+ {id: 166, label: 'Diego GodÃn', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Atlético Madrid', value: 28, group: 6, x: -229.68459, y: -28.488848},
+ {id: 167, label: 'Diego Lugano (c)', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'West Bromwich Albion', value: 23, group: 6, x: -32.813736, y: -13.457554},
+ {id: 168, label: 'Diego Pérez', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Bologna', value: 24, group: 6, x: 71.02754, y: 37.87593},
+ {id: 169, label: 'Diego Reyes', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Porto', value: 29, group: 21, x: -1751.0813, y: 432.33847},
+ {id: 170, label: 'Dimitris Salpingidis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'PAOK', value: 22, group: 15, x: 1578.1974, y: 570.63684},
+ {id: 171, label: 'Dirk Kuyt', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Fenerbahçe', value: 26, group: 22, x: 698.83246, y: -15.171172},
+ {id: 172, label: 'Divock Origi', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Lille', value: 25, group: 28, x: -634.9317, y: -895.1274},
+ {id: 173, label: 'Djamel Mesbah', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Livorno', value: 22, group: 24, x: -1360.7583, y: 1211.4519},
+ {id: 174, label: 'Dmitri Kombarov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Spartak Moscow', value: 22, group: 2, x: -1369.3798, y: -1467.8458},
+ {id: 175, label: 'Domagoj Vida', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Dynamo Kyiv', value: 24, group: 25, x: -257.23795, y: 568.68097},
+ {id: 176, label: 'Donis Escober', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Olimpia', value: 22, group: 7, x: 1653.151, y: -1192.2112},
+ {id: 177, label: 'Dries Mertens', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Napoli', value: 33, group: 28, x: -646.4434, y: -473.2636},
+ {id: 178, label: 'Edder Delgado', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Real España', value: 22, group: 7, x: 1622.0984, y: -1283.4814},
+ {id: 179, label: 'Eden Hazard', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Chelsea', value: 33, group: 28, x: -567.4557, y: -819.40875},
+ {id: 180, label: 'Éder', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Braga', value: 22, group: 8, x: -652.50696, y: 328.93912},
+ {id: 181, label: 'Éder Ãlvarez Balanta', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'River Plate', value: 22, group: 11, x: -862.32965, y: 1190.2361},
+ {id: 182, label: 'Edgar Salli', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Lens', value: 22, group: 17, x: 416.1859, y: 196.34885},
+ {id: 183, label: 'Edin Džeko', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Manchester City', value: 31, group: 20, x: 747.8557, y: -487.7818},
+ {id: 184, label: 'Edin Višca', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + '?stanbul Ba?ak?ehir', value: 22, group: 20, x: 1198.7845, y: -465.6674},
+ {id: 185, label: 'Edinson Cavani', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 31, group: 6, x: -109.8151, y: 97.26505},
+ {id: 186, label: 'Édison Méndez', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Santa Fe', value: 23, group: 4, x: -1680.7289, y: -523.78754},
+ {id: 187, label: 'Eduardo da Silva', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Shakhtar Donetsk', value: 23, group: 25, x: -364.4046, y: 586.62573},
+ {id: 188, label: 'Eduardo dos Reis Carvalho', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Braga', value: 22, group: 8, x: -685.56335, y: 299.7952},
+ {id: 189, label: 'Eduardo Vargas', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Valencia', value: 26, group: 18, x: -348.8911, y: 1339.4359},
+ {id: 190, label: 'Efe Ambrose', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Celtic', value: 25, group: 14, x: 91.53676, y: -1502.4221},
+ {id: 191, label: 'Egidio Arévalo RÃos', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Morelia', value: 23, group: 6, x: -140.449, y: -11.467088},
+ {id: 192, label: 'Ehsan Hajsafi', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Sepahan', value: 22, group: 1, x: 1992.8684, y: 1102.4463},
+ {id: 193, label: 'Eiji Kawashima', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Standard Liège', value: 24, group: 27, x: 599.24896, y: 588.35046},
+ {id: 194, label: 'Ejike Uzoenyi', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Enugu Rangers', value: 22, group: 14, x: -90.413765, y: -1613.6277},
+ {id: 195, label: 'El Arbi Hillel Soudani', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Dinamo Zagreb', value: 23, group: 24, x: -1331.9408, y: 1124.3699},
+ {id: 196, label: 'Eliaquim Mangala', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Porto', value: 30, group: 16, x: -347.64447, y: -15.025993},
+ {id: 197, label: 'Emilio Izaguirre', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Celtic', value: 25, group: 7, x: 1455.9241, y: -1104.4338},
+ {id: 198, label: 'Emir Spahic (c)', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Bayer Leverkusen', value: 24, group: 20, x: 1039.7502, y: -336.38666},
+ {id: 199, label: 'Emmanuel Agyemang-Badu', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Udinese', value: 23, group: 5, x: 311.23798, y: 1367.9753},
+ {id: 200, label: 'Emmanuel Emenike', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Fenerbahçe', value: 26, group: 14, x: -64.248405, y: -1362.0144},
+ {id: 201, label: 'Enner Valencia', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Pachuca', value: 22, group: 4, x: -1712.6265, y: -633.4451},
+ {id: 202, label: 'Enzo Pérez', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Benfica', value: 25, group: 19, x: -1057.396, y: 279.50247},
+ {id: 203, label: 'Erik Durm', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Borussia Dortmund', value: 24, group: 13, x: 553.0518, y: -438.38715},
+ {id: 204, label: 'Ermin Bicakcic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Eintracht Braunschweig', value: 23, group: 20, x: 1292.2596, y: -362.45374},
+ {id: 205, label: 'Essaïd Belkalem', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Watford', value: 23, group: 24, x: -1238.1655, y: 1250.7357},
+ {id: 206, label: 'Esteban Granados', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Herediano', value: 22, group: 29, x: 2281.05, y: 393.73032},
+ {id: 207, label: 'Esteban Paredes', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Colo-Colo', value: 22, group: 18, x: -262.22748, y: 1531.8533},
+ {id: 208, label: 'Eugene Galekovic', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Adelaide United', value: 22, group: 12, x: 2152.1602, y: -634.9465},
+ {id: 209, label: 'Eugenio Mena', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Santos', value: 22, group: 18, x: -294.9122, y: 1499.1805},
+ {id: 210, label: 'Eyong Enoh', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Antalyaspor', value: 22, group: 17, x: 420.98795, y: 149.03363},
+ {id: 211, label: 'Ezequiel Garay', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Benfica', value: 25, group: 19, x: -1064.4406, y: 219.37395},
+ {id: 212, label: 'Ezequiel Lavezzi', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 31, group: 19, x: -846.7565, y: 254.65596},
+ {id: 213, label: 'Fabian Johnson', title: 'Country: ' + 'United States' + '
' + 'Team: ' + '1899 Hoffenheim', value: 23, group: 26, x: 879.29755, y: -1453.8761},
+ {id: 214, label: 'Fabián Orellana', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Celta Vigo', value: 23, group: 18, x: -331.13403, y: 1411.2639},
+ {id: 215, label: 'Fabian Schär', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Basel', value: 25, group: 0, x: 38.159084, y: 161.5354},
+ {id: 216, label: 'Fábio Coentrão', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Real Madrid', value: 31, group: 8, x: -620.60266, y: 152.43254},
+ {id: 217, label: 'Fabrice Olinga', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Zulte Waregem', value: 23, group: 17, x: 342.78528, y: 88.49571},
+ {id: 218, label: 'Faouzi Ghoulam', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Napoli', value: 33, group: 24, x: -1163.7886, y: 887.72974},
+ {id: 219, label: 'Faryd Mondragón', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Deportivo Cali', value: 22, group: 11, x: -825.1312, y: 1158.5756},
+ {id: 220, label: 'Fatau Dauda', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Orlando Pirates', value: 22, group: 5, x: 508.3159, y: 1362.8381},
+ {id: 221, label: 'Federico Fernández', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Napoli', value: 32, group: 19, x: -945.41595, y: 329.4419},
+ {id: 222, label: 'Felipe Caicedo', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Al-Jazira', value: 22, group: 4, x: -1726.1598, y: -587.78546},
+ {id: 223, label: 'Felipe Gutiérrez', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Twente', value: 22, group: 18, x: -184.13504, y: 1490.4882},
+ {id: 224, label: 'Fernandinho', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Manchester City', value: 31, group: 23, x: -442.97876, y: -336.2658},
+ {id: 225, label: 'Fernando Gago', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Boca Juniors', value: 22, group: 19, x: -1147.289, y: 214.82018},
+ {id: 226, label: 'Fernando Muslera', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Galatasaray', value: 26, group: 6, x: 73.75355, y: -37.71824},
+ {id: 227, label: 'Fernando Torres', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Chelsea', value: 32, group: 23, x: -744.538, y: -446.911},
+ {id: 228, label: 'Fidel MartÃnez', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Tijuana', value: 22, group: 4, x: -1762.2454, y: -617.66486},
+ {id: 229, label: 'Francisco Javier RodrÃguez', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'América', value: 22, group: 21, x: -2058.6445, y: 342.12747},
+ {id: 230, label: 'Francisco Silva', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Osasuna', value: 22, group: 18, x: -207.91714, y: 1451.4407},
+ {id: 231, label: 'Frank Lampard', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Chelsea', value: 32, group: 28, x: -247.65233, y: -855.8526},
+ {id: 232, label: 'Fraser Forster', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Celtic', value: 25, group: 28, x: 12.960639, y: -928.6838},
+ {id: 233, label: 'Fred', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Fluminense', value: 22, group: 23, x: -513.3818, y: -260.2743},
+ {id: 234, label: 'Fredy GuarÃn', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Internazionale', value: 29, group: 11, x: -787.85443, y: 1018.71765},
+ {id: 235, label: 'Frickson Erazo', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Flamengo', value: 22, group: 4, x: -1740.3123, y: -668.11096},
+ {id: 236, label: 'Gabriel Achilier', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Emelec', value: 22, group: 4, x: -1682.2622, y: -719.3627},
+ {id: 237, label: 'Gabriel Paletta', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Parma', value: 24, group: 3, x: 206.93822, y: 845.00073},
+ {id: 238, label: 'Gary Cahill', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Chelsea', value: 32, group: 28, x: -301.79718, y: -918.2849},
+ {id: 239, label: 'Gary Medel', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Cardiff City', value: 23, group: 18, x: -135.52126, y: 1534.2073},
+ {id: 240, label: 'Gastón RamÃrez', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Southampton', value: 28, group: 6, x: -52.539005, y: -56.373035},
+ {id: 241, label: 'Gelson Fernandes', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'SC Freiburg', value: 24, group: 0, x: 151.71802, y: 158.9506},
+ {id: 242, label: 'Geoff Cameron', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Stoke City', value: 25, group: 26, x: 820.3439, y: -1464.1147},
+ {id: 243, label: 'Georgi Shchennikov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'CSKA Moscow', value: 23, group: 2, x: -1330.4204, y: -1544.3962},
+ {id: 244, label: 'Georginio Wijnaldum', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'PSV', value: 24, group: 22, x: 874.0655, y: 135.79485},
+ {id: 245, label: 'Gerard Piqué', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Barcelona', value: 31, group: 23, x: -1126.4338, y: -326.65405},
+ {id: 246, label: 'Gervinho', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Roma', value: 26, group: 9, x: 560.3703, y: -680.46234},
+ {id: 247, label: 'Ghasem Haddadifar', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Zob Ahan', value: 22, group: 1, x: 1942.6196, y: 1184.3281},
+ {id: 248, label: 'Giancarlo González', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Columbus Crew', value: 22, group: 29, x: 2265.3667, y: 299.92572},
+ {id: 249, label: 'Gianluigi Buffon (c)', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Juventus', value: 28, group: 3, x: 152.25356, y: 824.18774},
+ {id: 250, label: 'Giannis Fetfatzidis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Genoa', value: 24, group: 15, x: 1469.2073, y: 587.92706},
+ {id: 251, label: 'Giannis Maniatis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Olympiacos', value: 23, group: 15, x: 1675.6614, y: 562.7533},
+ {id: 252, label: 'Giorgio Chiellini', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Juventus', value: 28, group: 3, x: 168.9661, y: 898.16156},
+ {id: 253, label: 'Giorgos Karagounis (c)', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Fulham', value: 23, group: 15, x: 1659.2035, y: 651.7564},
+ {id: 254, label: 'Giorgos Samaras', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Celtic', value: 25, group: 15, x: 1468.0847, y: 290.17197},
+ {id: 255, label: 'Giorgos Tzavellas', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'PAOK', value: 22, group: 15, x: 1582.3857, y: 615.66473},
+ {id: 256, label: 'Giovani dos Santos', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Villarreal', value: 22, group: 21, x: -2058.4065, y: 426.69418},
+ {id: 257, label: 'Giovanni Sio', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Basel', value: 26, group: 9, x: 405.23972, y: -662.28076},
+ {id: 258, label: 'Glen Johnson', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Liverpool', value: 27, group: 28, x: -77.03864, y: -917.1485},
+ {id: 259, label: 'Godfrey Oboabona', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Çaykur Rizespor', value: 23, group: 14, x: 9.590389, y: -1597.5946},
+ {id: 260, label: 'Gökhan Inler (c)', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Napoli', value: 31, group: 0, x: -228.73499, y: 213.29607},
+ {id: 261, label: 'Gonzalo HiguaÃn', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Napoli', value: 32, group: 19, x: -976.805, y: 255.482},
+ {id: 262, label: 'Gonzalo Jara', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Nottingham Forest', value: 22, group: 18, x: -235.43576, y: 1571.7034},
+ {id: 263, label: 'Gordon Schildenfeld', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Panathinaikos', value: 23, group: 25, x: -217.73817, y: 655.73315},
+ {id: 264, label: 'Gotoku Sakai', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'VfB Stuttgart', value: 25, group: 27, x: 626.25525, y: 448.10638},
+ {id: 265, label: 'Graham Zusi', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Sporting Kansas City', value: 22, group: 26, x: 821.1794, y: -1568.8907},
+ {id: 266, label: 'Granit Xhaka', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Borussia Mönchengladbach', value: 23, group: 0, x: 60.45976, y: 205.48042},
+ {id: 267, label: 'Guillermo Ochoa', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Ajaccio', value: 23, group: 21, x: -2012.4979, y: 495.58713},
+ {id: 268, label: 'Ha Dae-sung', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Beijing Guoan', value: 22, group: 10, x: 1235.4569, y: 1551.8241},
+ {id: 269, label: 'Han Kook-young', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Kashiwa Reysol', value: 22, group: 10, x: 1158.8308, y: 1599.3705},
+ {id: 270, label: 'Haris Medunjanin', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Gaziantepspor', value: 22, group: 20, x: 1200.2539, y: -418.55362},
+ {id: 271, label: 'Haris Seferovic', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Real Sociedad', value: 25, group: 0, x: 141.21535, y: 262.27655},
+ {id: 272, label: 'Harrison Afful', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Espérance', value: 22, group: 5, x: 468.08853, y: 1387.6926},
+ {id: 273, label: 'Hashem Beikzadeh', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Esteghlal', value: 22, group: 1, x: 1986.3362, y: 1189.6459},
+ {id: 274, label: 'Hassan Yebda', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Udinese', value: 23, group: 24, x: -1303.4868, y: 1254.4517},
+ {id: 275, label: 'Héctor Herrera', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Porto', value: 29, group: 21, x: -1799.6183, y: 372.85077},
+ {id: 276, label: 'Héctor Moreno', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Espanyol', value: 23, group: 21, x: -1943.8708, y: 364.62497},
+ {id: 277, label: 'Hélder Postiga', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Lazio', value: 28, group: 8, x: -469.8896, y: 192.226},
+ {id: 278, label: 'Henri Bedimo', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Lyon', value: 22, group: 17, x: 380.54697, y: 174.65756},
+ {id: 279, label: 'Henrique', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Napoli', value: 33, group: 23, x: -572.6227, y: -84.16057},
+ {id: 280, label: 'Hernanes', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Internazionale', value: 29, group: 23, x: -528.0018, y: -15.909561},
+ {id: 281, label: 'Hiroki Sakai', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Hannover 96', value: 24, group: 27, x: 714.5649, y: 462.32593},
+ {id: 282, label: 'Hiroshi Kiyotake', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + '1. FC Nürnberg', value: 24, group: 27, x: 729.62537, y: 516.7272},
+ {id: 283, label: 'Hong Jeong-ho', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'FC Augsburg', value: 23, group: 10, x: 1189.0176, y: 1491.9882},
+ {id: 284, label: 'Hossein Mahini', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Persepolis', value: 22, group: 1, x: 1969.5181, y: 1144.5435},
+ {id: 285, label: 'Hotaru Yamaguchi', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Cerezo Osaka', value: 23, group: 27, x: 665.15576, y: 571.1557},
+ {id: 286, label: 'Hugo Almeida', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Be?ikta?', value: 24, group: 8, x: -570.7293, y: 230.924},
+ {id: 287, label: 'Hugo Campagnaro', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Internazionale', value: 27, group: 19, x: -1030.6344, y: 363.07056},
+ {id: 288, label: 'Hugo Lloris (c)', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Tottenham Hotspur', value: 27, group: 16, x: -181.9427, y: -259.68008},
+ {id: 289, label: 'Hulk', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 29, group: 23, x: -676.12946, y: -547.05255},
+ {id: 290, label: 'Hwang Seok-ho', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Sanfrecce Hiroshima', value: 23, group: 10, x: 1138.2103, y: 1544.5535},
+ {id: 291, label: 'Ignazio Abate', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Milan', value: 27, group: 3, x: 229.40173, y: 946.202},
+ {id: 292, label: 'Igor Akinfeev', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'CSKA Moscow', value: 23, group: 2, x: -1278.871, y: -1521.6796},
+ {id: 293, label: 'Igor Denisov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Dynamo Moscow', value: 23, group: 2, x: -1478.4519, y: -1427.1252},
+ {id: 294, label: 'Iker Casillas (c)', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Real Madrid', value: 31, group: 23, x: -800.62396, y: -169.28741},
+ {id: 295, label: 'Isaác Brizuela', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Toluca', value: 22, group: 21, x: -2104.4573, y: 342.27985},
+ {id: 296, label: 'Islam Slimani', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Sporting CP', value: 25, group: 24, x: -1357.2412, y: 1056.6638},
+ {id: 297, label: 'Ismaël Diomandé', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Saint-Étienne', value: 23, group: 9, x: 445.33255, y: -874.95105},
+ {id: 298, label: 'Ivan Franjic', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Brisbane Roar', value: 22, group: 12, x: 2090.495, y: -571.4816},
+ {id: 299, label: 'Ivan Perišic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'VfL Wolfsburg', value: 27, group: 25, x: -294.81628, y: 494.7712},
+ {id: 300, label: 'Ivan Rakitic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Sevilla', value: 25, group: 25, x: -359.27826, y: 645.7861},
+ {id: 301, label: 'Ivica Olic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'VfL Wolfsburg', value: 27, group: 25, x: -356.225, y: 503.76892},
+ {id: 302, label: 'Izet Hajrovic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Galatasaray', value: 26, group: 20, x: 1073.4325, y: -468.65955},
+ {id: 303, label: 'Jack Wilshere', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Arsenal', value: 30, group: 28, x: -130.01361, y: -811.2897},
+ {id: 304, label: 'Jackson MartÃnez', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Porto', value: 29, group: 11, x: -870.14624, y: 947.02435},
+ {id: 305, label: 'Jaime AyovÃ', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Tijuana', value: 22, group: 4, x: -1695.5747, y: -675.85455},
+ {id: 306, label: 'Jalal Hosseini', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Persepolis', value: 22, group: 1, x: 2076.0352, y: 1075.6108},
+ {id: 307, label: 'James Holland', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Austria Wien', value: 22, group: 12, x: 2105.7495, y: -645.33295},
+ {id: 308, label: 'James Milner', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Manchester City', value: 30, group: 28, x: -219.63795, y: -778.5797},
+ {id: 309, label: 'James RodrÃguez', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'AS Monaco', value: 25, group: 11, x: -798.6743, y: 1094.4689},
+ {id: 310, label: 'James Troisi', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Melbourne Victory', value: 22, group: 12, x: 2041.5525, y: -703.14703},
+ {id: 311, label: 'Jan Vertonghen', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Tottenham Hotspur', value: 25, group: 28, x: -726.46454, y: -735.5794},
+ {id: 312, label: 'Jasmin Fejzic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'VfR Aalen', value: 22, group: 20, x: 1170.3435, y: -544.8657},
+ {id: 313, label: 'Jason Davidson', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Heracles Almelo', value: 22, group: 12, x: 2027.0093, y: -621.23444},
+ {id: 314, label: 'Jasper Cillessen', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Ajax', value: 22, group: 22, x: 884.7674, y: 31.967285},
+ {id: 315, label: 'Javad Nekounam (c)', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Al-Kuwait', value: 22, group: 1, x: 1956.9619, y: 1077.9049},
+ {id: 316, label: 'Javi MartÃnez', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Bayern Munich', value: 35, group: 23, x: -549.74335, y: -388.08502},
+ {id: 317, label: 'Javier Aquino', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Villarreal', value: 22, group: 21, x: -2081.5557, y: 384.58026},
+ {id: 318, label: 'Javier Hernández', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Manchester United', value: 35, group: 21, x: -1606.5636, y: 123.67082},
+ {id: 319, label: 'Javier Mascherano', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Barcelona', value: 36, group: 19, x: -1221.5325, y: 91.23916},
+ {id: 320, label: 'Jean Beausejour', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Wigan Athletic', value: 24, group: 18, x: -67.39274, y: 1286.5491},
+ {id: 321, label: 'Jean Makoun', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Rennes', value: 23, group: 17, x: 430.8337, y: 257.74985},
+ {id: 322, label: 'Jean-Daniel Akpa-Akpro', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Toulouse', value: 23, group: 9, x: 413.52197, y: -756.9924},
+ {id: 323, label: 'Jefferson', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Botafogo', value: 22, group: 23, x: -426.49158, y: -267.58475},
+ {id: 324, label: 'Jefferson Montero', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Morelia', value: 23, group: 4, x: -1599.2291, y: -622.97186},
+ {id: 325, label: 'Jeremain Lens', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Dynamo Kyiv', value: 25, group: 22, x: 718.188, y: 97.2607},
+ {id: 326, label: 'Jermaine Jones', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Be?ikta?', value: 24, group: 26, x: 734.773, y: -1356.2697},
+ {id: 327, label: 'Jérôme Boateng', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Bayern Munich', value: 29, group: 13, x: 313.90338, y: -414.42447},
+ {id: 328, label: 'Jerry Bengtson', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'New England Revolution', value: 22, group: 7, x: 1590.5161, y: -1207.1145},
+ {id: 329, label: 'Jerry Palacios', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Alajuelense', value: 24, group: 7, x: 1713.397, y: -1049.3608},
+ {id: 330, label: 'Ji Dong-won', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'FC Augsburg', value: 23, group: 10, x: 1240.8452, y: 1492.1494},
+ {id: 331, label: 'Jô', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Atlético Mineiro', value: 22, group: 23, x: -470.48615, y: -271.38748},
+ {id: 332, label: 'João Moutinho', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'AS Monaco', value: 25, group: 8, x: -709.12415, y: 410.8603},
+ {id: 333, label: 'João Pereira', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Valencia', value: 25, group: 8, x: -649.96454, y: 448.82736},
+ {id: 334, label: 'Joao Rojas', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Cruz Azul', value: 24, group: 4, x: -1776.6962, y: -531.8545},
+ {id: 335, label: 'Joe Hart', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Manchester City', value: 30, group: 28, x: -212.69391, y: -704.6478},
+ {id: 336, label: 'Joel Campbell', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Olympiacos', value: 26, group: 29, x: 2111.164, y: 365.17755},
+ {id: 337, label: 'Joël Matip', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Schalke 04', value: 28, group: 17, x: 540.77966, y: 139.58159},
+ {id: 338, label: 'Joël Veltman', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Ajax', value: 22, group: 22, x: 921.6833, y: 59.578938},
+ {id: 339, label: 'Johan Djourou', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Hamburger SV', value: 23, group: 0, x: 57.06974, y: 323.02927},
+ {id: 340, label: 'John Boye', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Rennes', value: 23, group: 5, x: 493.59833, y: 1298.41},
+ {id: 341, label: 'John Brooks', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Hertha BSC', value: 23, group: 26, x: 729.48096, y: -1409.5938},
+ {id: 342, label: 'John Obi Mikel', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Chelsea', value: 33, group: 14, x: -197.90224, y: -1324.3247},
+ {id: 343, label: 'Johnny Acosta', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Alajuelense', value: 23, group: 29, x: 2202.928, y: 222.98761},
+ {id: 344, label: 'Johnny Herrera', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Universidad de Chile', value: 22, group: 18, x: -225.40228, y: 1509.603},
+ {id: 345, label: 'Jonathan de Guzmán', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Swansea City', value: 23, group: 22, x: 917.89813, y: -45.654217},
+ {id: 346, label: 'Jonathan Mensah', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Évian', value: 22, group: 5, x: 461.7189, y: 1342.4531},
+ {id: 347, label: 'Jordan Ayew', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Sochaux', value: 22, group: 5, x: 418.20883, y: 1351.9128},
+ {id: 348, label: 'Jordan Henderson', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Liverpool', value: 27, group: 28, x: -137.00108, y: -918.78546},
+ {id: 349, label: 'Jordi Alba', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Barcelona', value: 31, group: 23, x: -1139.679, y: -237.86505},
+ {id: 350, label: 'Jordy Clasie', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Feyenoord', value: 22, group: 22, x: 920.4804, y: 7.368482},
+ {id: 351, label: 'Jorge Claros', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Motagua', value: 22, group: 7, x: 1693.2894, y: -1172.8019},
+ {id: 352, label: 'Jorge Fucile', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Porto', value: 30, group: 6, x: -342.37836, y: 145.54729},
+ {id: 353, label: 'Jorge Guagua', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Emelec', value: 22, group: 4, x: -1678.4408, y: -602.871},
+ {id: 354, label: 'Jorge Valdivia', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Palmeiras', value: 22, group: 18, x: -250.0152, y: 1428.506},
+ {id: 355, label: 'José de Jesús Corona', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Cruz Azul', value: 23, group: 21, x: -2099.094, y: 287.12247},
+ {id: 356, label: 'José Holebas', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Olympiacos', value: 23, group: 15, x: 1657.0046, y: 513.2496},
+ {id: 357, label: 'José Juan Vázquez', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'León', value: 22, group: 21, x: -2102.5596, y: 434.67215},
+ {id: 358, label: 'José MarÃa Basanta', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Monterrey', value: 22, group: 19, x: -1144.7311, y: 286.0747},
+ {id: 359, label: 'José MarÃa Giménez', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Atlético Madrid', value: 28, group: 6, x: -198.00406, y: -82.70489},
+ {id: 360, label: 'José Miguel Cubero', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Herediano', value: 22, group: 29, x: 2268.5837, y: 346.56885},
+ {id: 361, label: 'José Pedro Fuenzalida', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Colo-Colo', value: 22, group: 18, x: -198.39777, y: 1545.6372},
+ {id: 362, label: 'José Rojas', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Universidad de Chile', value: 22, group: 18, x: -307.82147, y: 1544.147},
+ {id: 363, label: 'Joseph Yobo (c)', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Norwich City', value: 23, group: 14, x: 3.3988526, y: -1540.3546},
+ {id: 364, label: 'Josip Drmic', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + '1. FC Nürnberg', value: 25, group: 0, x: 179.9546, y: 206.55292},
+ {id: 365, label: 'Jozy Altidore', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Sunderland', value: 23, group: 26, x: 866.4315, y: -1353.6399},
+ {id: 366, label: 'Juan Camilo Zúñiga', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Napoli', value: 33, group: 11, x: -759.6773, y: 893.11926},
+ {id: 367, label: 'Juan Carlos GarcÃa', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Wigan Athletic', value: 23, group: 7, x: 1576.5138, y: -1044.397},
+ {id: 368, label: 'Juan Carlos Paredes', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Barcelona', value: 35, group: 4, x: -1452.1322, y: -446.39807},
+ {id: 369, label: 'Juan Fernando Quintero', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Porto', value: 29, group: 11, x: -908.9095, y: 1006.1945},
+ {id: 370, label: 'Juan Guillermo Cuadrado', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Fiorentina', value: 24, group: 11, x: -683.1348, y: 1184.008},
+ {id: 371, label: 'Juan Mata', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Manchester United', value: 34, group: 23, x: -837.1373, y: -428.5978},
+ {id: 372, label: 'Juan Pablo Montes', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Motagua', value: 22, group: 7, x: 1592.682, y: -1250.384},
+ {id: 373, label: 'Juanfran', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Atlético Madrid', value: 27, group: 23, x: -888.2895, y: -365.17215},
+ {id: 374, label: 'Julian Draxler', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Schalke 04', value: 27, group: 13, x: 528.5164, y: -263.55563},
+ {id: 375, label: 'Julian Green', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Bayern Munich', value: 35, group: 26, x: 627.9602, y: -1176.4528},
+ {id: 376, label: 'Júlio César', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Toronto FC', value: 23, group: 23, x: -374.46234, y: -336.27332},
+ {id: 377, label: 'Jung Sung-ryong', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Suwon Bluewings', value: 22, group: 10, x: 1253.4236, y: 1593.7097},
+ {id: 378, label: 'Júnior DÃaz', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Mainz 05', value: 26, group: 29, x: 2052.3333, y: 457.91708},
+ {id: 379, label: 'Juwon Oshaniwa', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Ashdod', value: 22, group: 14, x: -3.9951146, y: -1656.1483},
+ {id: 380, label: 'Karim Ansarifard', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Tractor Sazi', value: 22, group: 1, x: 2030.3977, y: 1187.764},
+ {id: 381, label: 'Karim Benzema', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Real Madrid', value: 32, group: 16, x: -255.21576, y: -165.30316},
+ {id: 382, label: 'Keisuke Honda', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Milan', value: 29, group: 27, x: 610.39655, y: 750.20026},
+ {id: 383, label: 'Kenneth Omeruo', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Middlesbrough', value: 23, group: 14, x: -33.32675, y: -1484.3856},
+ {id: 384, label: 'Kevin De Bruyne', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'VfL Wolfsburg', value: 28, group: 28, x: -581.4455, y: -583.9621},
+ {id: 385, label: 'Kevin Großkreutz', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Borussia Dortmund', value: 24, group: 13, x: 553.73175, y: -380.0992},
+ {id: 386, label: 'Kevin Mirallas', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Everton', value: 26, group: 28, x: -563.9285, y: -964.3166},
+ {id: 387, label: 'Kevin-Prince Boateng', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Schalke 04', value: 28, group: 5, x: 528.2719, y: 1086.7677},
+ {id: 388, label: 'Keylor Navas', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Levante', value: 23, group: 29, x: 2179.6377, y: 330.61267},
+ {id: 389, label: 'Khosro Heydari', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Esteghlal', value: 22, group: 1, x: 2085.2766, y: 1118.5546},
+ {id: 390, label: 'Ki Sung-yueng', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Sunderland', value: 23, group: 10, x: 1168.5514, y: 1424.8241},
+ {id: 391, label: 'Kim Bo-kyung', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Cardiff City', value: 23, group: 10, x: 1094.6575, y: 1613.0087},
+ {id: 392, label: 'Kim Chang-soo', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Kashiwa Reysol', value: 22, group: 10, x: 1182.648, y: 1681.8923},
+ {id: 393, label: 'Kim Seung-gyu', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Ulsan Hyundai', value: 22, group: 10, x: 1189.8958, y: 1559.8545},
+ {id: 394, label: 'Kim Shin-wook', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Ulsan Hyundai', value: 22, group: 10, x: 1231.2048, y: 1679.3086},
+ {id: 395, label: 'Kim Young-gwon', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Guangzhou Evergrande', value: 22, group: 10, x: 1284.3221, y: 1556.8948},
+ {id: 396, label: 'Klaas-Jan Huntelaar', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Schalke 04', value: 28, group: 22, x: 809.16656, y: 91.84488},
+ {id: 397, label: 'Koke', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Atlético Madrid', value: 27, group: 23, x: -921.22095, y: -304.28424},
+ {id: 398, label: 'Kolo Touré', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Liverpool', value: 31, group: 9, x: 297.04135, y: -918.4601},
+ {id: 399, label: 'Koo Ja-cheol (c)', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Mainz 05', value: 25, group: 10, x: 1210.03, y: 1383.6355},
+ {id: 400, label: 'Kostas Katsouranis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'PAOK', value: 22, group: 15, x: 1625.112, y: 590.2659},
+ {id: 401, label: 'Kostas Manolas', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Olympiacos', value: 23, group: 15, x: 1643.8208, y: 458.0363},
+ {id: 402, label: 'Kostas Mitroglou', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Fulham', value: 23, group: 15, x: 1704.107, y: 623.1121},
+ {id: 403, label: 'Kunle Odunlami', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Sunshine Stars', value: 22, group: 14, x: -51.509785, y: -1656.867},
+ {id: 404, label: 'Kwadwo Asamoah', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Juventus', value: 33, group: 5, x: 285.16757, y: 1193.1697},
+ {id: 405, label: 'Kwak Tae-hwi', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Al-Hilal', value: 22, group: 10, x: 1276.5813, y: 1652.845},
+ {id: 406, label: 'Kyle Beckerman', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Real Salt Lake', value: 22, group: 26, x: 814.4154, y: -1616.4198},
+ {id: 407, label: 'Landry N Guémo', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Bordeaux', value: 22, group: 17, x: 380.33423, y: 127.532715},
+ {id: 408, label: 'Laurent Ciman', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Standard Liège', value: 24, group: 28, x: -542.0193, y: -660.84076},
+ {id: 409, label: 'Laurent Koscielny', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Arsenal', value: 29, group: 16, x: -15.0555935, y: -387.5162},
+ {id: 410, label: 'Lazaros Christodoulopoulos', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Bologna', value: 23, group: 15, x: 1501.5779, y: 504.68384},
+ {id: 411, label: 'Lee Bum-young', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Busan IPark', value: 22, group: 10, x: 1190.9927, y: 1637.5756},
+ {id: 412, label: 'Lee Chung-yong', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Bolton Wanderers', value: 22, group: 10, x: 1146.0409, y: 1647.9602},
+ {id: 413, label: 'Lee Keun-ho', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Sangju Sangmu', value: 22, group: 10, x: 1296.3544, y: 1607.5996},
+ {id: 414, label: 'Lee Yong', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Ulsan Hyundai', value: 22, group: 10, x: 1208.6063, y: 1598.109},
+ {id: 415, label: 'Leighton Baines', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Everton', value: 25, group: 28, x: -237.56212, y: -998.078},
+ {id: 416, label: 'Leonardo Bonucci', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Juventus', value: 28, group: 3, x: 125.05671, y: 766.19403},
+ {id: 417, label: 'Leroy Fer', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Norwich City', value: 23, group: 22, x: 837.3325, y: -102.88975},
+ {id: 418, label: 'Liassine Cadamuro-Bentaïba', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Mallorca', value: 22, group: 24, x: -1424.9585, y: 1185.58},
+ {id: 419, label: 'Lionel Messi (c)', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Barcelona', value: 36, group: 19, x: -1133.2008, y: 55.981808},
+ {id: 420, label: 'Loïc Feudjou', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Coton Sport', value: 22, group: 17, x: 464.74194, y: 157.333},
+ {id: 421, label: 'Loïc Rémy', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Newcastle United', value: 25, group: 16, x: 73.68377, y: -313.17633},
+ {id: 422, label: 'Lorenzo Insigne', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Napoli', value: 33, group: 3, x: -68.64961, y: 680.98474},
+ {id: 423, label: 'Loukas Vyntra', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Levante', value: 23, group: 15, x: 1712.4525, y: 526.83075},
+ {id: 424, label: 'Lucas Biglia', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Lazio', value: 28, group: 19, x: -845.6186, y: 161.40001},
+ {id: 425, label: 'Lucas Digne', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 29, group: 16, x: -18.416775, y: -111.03686},
+ {id: 426, label: 'Luis Garrido', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Olimpia', value: 22, group: 7, x: 1665.7246, y: -1263.9408},
+ {id: 427, label: 'Luis López', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Real España', value: 22, group: 7, x: 1610.1837, y: -1129.5691},
+ {id: 428, label: 'LuÃs Neto', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 29, group: 8, x: -787.05585, y: -14.597502},
+ {id: 429, label: 'Luis Saritama', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Barcelona', value: 35, group: 4, x: -1546.8987, y: -441.0774},
+ {id: 430, label: 'Luis Suárez', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Liverpool', value: 31, group: 6, x: -100.21393, y: -246.37468},
+ {id: 431, label: 'Luiz Gustavo', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'VfL Wolfsburg', value: 28, group: 23, x: -456.7165, y: -142.2136},
+ {id: 432, label: 'Luka Modric', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Real Madrid', value: 33, group: 25, x: -410.41797, y: 416.6111},
+ {id: 433, label: 'Lukas Podolski', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Arsenal', value: 29, group: 13, x: 202.08969, y: -446.2755},
+ {id: 434, label: 'Luke Shaw', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Southampton', value: 26, group: 28, x: -92.229225, y: -688.88574},
+ {id: 435, label: 'Madjid Bougherra (c)', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Lekhwiya', value: 22, group: 24, x: -1470.3363, y: 1180.3844},
+ {id: 436, label: 'Maicon', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Roma', value: 26, group: 23, x: -278.08972, y: -249.45703},
+ {id: 437, label: 'Majeed Waris', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Valenciennes', value: 23, group: 5, x: 324.35605, y: 1417.5355},
+ {id: 438, label: 'Makoto Hasebe (c)', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + '1. FC Nürnberg', value: 24, group: 27, x: 672.80505, y: 505.12762},
+ {id: 439, label: 'Maksim Kanunnikov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Rubin Kazan', value: 23, group: 2, x: -1315.3818, y: -1323.4706},
+ {id: 440, label: 'Mamadou Sakho', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Liverpool', value: 31, group: 16, x: -55.2884, y: -503.5874},
+ {id: 441, label: 'Manabu Saito', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Yokohama F. Marinos', value: 22, group: 27, x: 700.693, y: 617.4117},
+ {id: 442, label: 'Manuel Neuer', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Bayern Munich', value: 29, group: 13, x: 362.29532, y: -299.95224},
+ {id: 443, label: 'Marcelo', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Real Madrid', value: 33, group: 23, x: -546.0523, y: -181.72266},
+ {id: 444, label: 'Marcelo Brozovic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Dinamo Zagreb', value: 23, group: 25, x: -406.19418, y: 695.72943},
+ {id: 445, label: 'Marcelo DÃaz', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Basel', value: 27, group: 18, x: -193.87224, y: 1188.147},
+ {id: 446, label: 'Marco Fabián', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Cruz Azul', value: 23, group: 21, x: -2042.7997, y: 288.54993},
+ {id: 447, label: 'Marco Parolo', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Parma', value: 24, group: 3, x: 223.34402, y: 798.16846},
+ {id: 448, label: 'Marco Ureña', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Kuban Krasnodar', value: 23, group: 29, x: 2171.2605, y: 406.7075},
+ {id: 449, label: 'Marco Verratti', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 29, group: 3, x: 74.62252, y: 597.4002},
+ {id: 450, label: 'Marcos Rojo', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Sporting CP', value: 25, group: 19, x: -1169.2754, y: 359.3405},
+ {id: 451, label: 'Mariano Andújar', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Catania', value: 22, group: 19, x: -1186.1453, y: 246.04404},
+ {id: 452, label: 'Mario Balotelli', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Milan', value: 27, group: 3, x: 253.78076, y: 886.26984},
+ {id: 453, label: 'Mario Gavranovic', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Zürich', value: 22, group: 0, x: 52.757668, y: 247.96585},
+ {id: 454, label: 'Mario Götze', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Bayern Munich', value: 29, group: 13, x: 301.41776, y: -338.43552},
+ {id: 455, label: 'Mario Mandžukic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Bayern Munich', value: 35, group: 25, x: -149.6339, y: 325.6033},
+ {id: 456, label: 'Mario MartÃnez', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Real España', value: 22, group: 7, x: 1689.1534, y: -1223.153},
+ {id: 457, label: 'Mario Yepes (c)', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Atalanta', value: 23, group: 11, x: -719.321, y: 1256.8893},
+ {id: 458, label: 'Mark Bresciano', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Al-Gharafa', value: 22, group: 12, x: 2122.0056, y: -604.5107},
+ {id: 459, label: 'Mark Milligan', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Melbourne Victory', value: 22, group: 12, x: 2173.8164, y: -588.3221},
+ {id: 460, label: 'Marouane Fellaini', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Manchester United', value: 34, group: 28, x: -655.5912, y: -756.77374},
+ {id: 461, label: 'MartÃn Cáceres', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Juventus', value: 33, group: 6, x: -21.211044, y: 343.79504},
+ {id: 462, label: 'MartÃn Demichelis', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Manchester City', value: 29, group: 19, x: -893.08545, y: 82.947815},
+ {id: 463, label: 'MartÃn Silva', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Vasco da Gama', value: 22, group: 6, x: -0.6348668, y: 1.9825428},
+ {id: 464, label: 'Marvin Chávez', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Chivas USA', value: 23, group: 7, x: 1429.7988, y: -1179.9895},
+ {id: 465, label: 'Masahiko Inoha', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Jubilo Iwata', value: 22, group: 27, x: 730.9411, y: 583.1111},
+ {id: 466, label: 'Masato Morishige', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'F.C. Tokyo', value: 22, group: 27, x: 677.74445, y: 664.5135},
+ {id: 467, label: 'Masoud Shojaei', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Las Palmas', value: 22, group: 1, x: 2059.2344, y: 1154.0554},
+ {id: 468, label: 'Massimo Luongo', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Swindon Town', value: 22, group: 12, x: 2135.3752, y: -676.93585},
+ {id: 469, label: 'Mateo Kovacic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Internazionale', value: 29, group: 25, x: -492.02667, y: 654.4242},
+ {id: 470, label: 'Mathew Leckie', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'FSV Frankfurt', value: 22, group: 12, x: 2138.549, y: -562.8361},
+ {id: 471, label: 'Mathew Ryan', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Club Brugge', value: 23, group: 12, x: 2056.7805, y: -519.5844},
+ {id: 472, label: 'Mathieu Debuchy', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Newcastle United', value: 25, group: 16, x: 14.882936, y: -313.20358},
+ {id: 473, label: 'Mathieu Valbuena', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Marseille', value: 24, group: 16, x: 44.39426, y: -119.345985},
+ {id: 474, label: 'Mathis Bolly', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Fortuna Düsseldorf', value: 23, group: 9, x: 651.62463, y: -893.97076},
+ {id: 475, label: 'Mats Hummels', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Borussia Dortmund', value: 24, group: 13, x: 607.8975, y: -421.7086},
+ {id: 476, label: 'Matt Besler', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Sporting Kansas City', value: 22, group: 26, x: 861.9521, y: -1604.1628},
+ {id: 477, label: 'Matt McKay', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Brisbane Roar', value: 22, group: 12, x: 2090.5696, y: -687.9733},
+ {id: 478, label: 'Matteo Darmian', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Torino', value: 23, group: 3, x: 332.64136, y: 846.05145},
+ {id: 479, label: 'Matthew Å piranovic', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Western Sydney Wanderers', value: 22, group: 12, x: 2061.1667, y: -656.2603},
+ {id: 480, label: 'Matthias Ginter', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'SC Freiburg', value: 25, group: 13, x: 444.28552, y: -312.17847},
+ {id: 481, label: 'Mattia De Sciglio', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Milan', value: 27, group: 3, x: 304.86957, y: 920.4894},
+ {id: 482, label: 'Mattia Perin', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Genoa', value: 24, group: 3, x: 272.21268, y: 763.70386},
+ {id: 483, label: 'Mauricio Isla', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Juventus', value: 32, group: 18, x: -142.68803, y: 1330.8896},
+ {id: 484, label: 'Mauricio Pinilla', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Cagliari', value: 23, group: 18, x: -356.0086, y: 1526.6892},
+ {id: 485, label: 'Max Gradel', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Saint-Étienne', value: 23, group: 9, x: 486.36218, y: -849.3238},
+ {id: 486, label: 'Maxi Pereira', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Benfica', value: 26, group: 6, x: -192.70482, y: 101.33695},
+ {id: 487, label: 'Maxi RodrÃguez', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Newells Old Boys', value: 22, group: 19, x: -1193.7656, y: 294.7356},
+ {id: 488, label: 'Maxim Choupo-Moting', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Mainz 05', value: 26, group: 17, x: 590.2084, y: 305.84305},
+ {id: 489, label: 'Máximo Banguera', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Barcelona', value: 35, group: 4, x: -1488.9634, y: -533.33093},
+ {id: 490, label: 'Maxwell', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 30, group: 23, x: -388.1638, y: -99.59259},
+ {id: 491, label: 'Maya Yoshida', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Southampton', value: 28, group: 27, x: 540.3439, y: 427.26245},
+ {id: 492, label: 'Maynor Figueroa', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Hull City', value: 23, group: 7, x: 1528.1024, y: -1100.3427},
+ {id: 493, label: 'Medhi Lacen', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Getafe', value: 23, group: 24, x: -1321.0677, y: 1173.3302},
+ {id: 494, label: 'Mehdi Mostefa', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Ajaccio', value: 23, group: 24, x: -1480.4698, y: 1115.9075},
+ {id: 495, label: 'Mehrdad Pouladi', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Persepolis', value: 22, group: 1, x: 1894.8638, y: 1109.2692},
+ {id: 496, label: 'Memphis Depay', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'PSV', value: 24, group: 22, x: 929.35187, y: 119.25908},
+ {id: 497, label: 'Mensur Mujdža', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'SC Freiburg', value: 25, group: 20, x: 1039.0459, y: -418.09897},
+ {id: 498, label: 'Mesut Özil', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Arsenal', value: 29, group: 13, x: 266.21005, y: -466.70053},
+ {id: 499, label: 'Michael Arroyo', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Atlante', value: 22, group: 4, x: -1730.8958, y: -727.36395},
+ {id: 500, label: 'Michael Babatunde', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Volyn Lutsk', value: 22, group: 14, x: -143.01881, y: -1634.2734},
+ {id: 501, label: 'Michael Barrantes', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Aalesund', value: 22, group: 29, x: 2300.9563, y: 256.13895},
+ {id: 502, label: 'Michael Bradley', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Toronto FC', value: 23, group: 26, x: 721.9479, y: -1477.4308},
+ {id: 503, label: 'Michael Essien', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Milan', value: 28, group: 5, x: 376.83282, y: 1298.3724},
+ {id: 504, label: 'Michael Lang', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Grasshopper', value: 22, group: 0, x: 29.479486, y: 282.8444},
+ {id: 505, label: 'Michael Uchebo', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Cercle Brugge', value: 22, group: 14, x: -95.68781, y: -1656.3585},
+ {id: 506, label: 'Michael Umaña', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Saprissa', value: 22, group: 29, x: 2330.0725, y: 379.5474},
+ {id: 507, label: 'Michel Vorm', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Swansea City', value: 23, group: 22, x: 868.7987, y: -56.305706},
+ {id: 508, label: 'Mickaël Landreau', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Bastia', value: 22, group: 16, x: -46.63565, y: -207.56238},
+ {id: 509, label: 'Miguel Ãngel Ponce', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Toluca', value: 22, group: 21, x: -2068.7258, y: 475.15393},
+ {id: 510, label: 'Miguel Layún', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'América', value: 22, group: 21, x: -2150.149, y: 351.6338},
+ {id: 511, label: 'Miguel Veloso', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Dynamo Kyiv', value: 25, group: 8, x: -552.1939, y: 364.91592},
+ {id: 512, label: 'Miiko Albornoz', title: 'Country: ' + 'Chile' + '
' + 'Team: ' + 'Malmö FF', value: 22, group: 18, x: -282.78622, y: 1583.4946},
+ {id: 513, label: 'Mikkel Diskerud', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Rosenborg', value: 23, group: 26, x: 941.49945, y: -1436.3448},
+ {id: 514, label: 'Milan Badelj', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Hamburger SV', value: 23, group: 25, x: -271.98166, y: 685.1374},
+ {id: 515, label: 'Mile Jedinak (c)', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Crystal Palace', value: 22, group: 12, x: 2075.4526, y: -732.8337},
+ {id: 516, label: 'Miralem Pjanic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Roma', value: 26, group: 20, x: 1103.221, y: -385.46555},
+ {id: 517, label: 'Miroslav Klose', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Lazio', value: 28, group: 13, x: 293.14236, y: -267.2075},
+ {id: 518, label: 'Mitchell Langerak', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Borussia Dortmund', value: 27, group: 12, x: 1759.8835, y: -484.94678},
+ {id: 519, label: 'Mohamed Zemmamouche', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'USM Alger', value: 22, group: 24, x: -1405.2527, y: 1223.2103},
+ {id: 520, label: 'Mohammed Rabiu', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Kuban Krasnodar', value: 23, group: 5, x: 577.33563, y: 1315.1465},
+ {id: 521, label: 'Morgan Schneiderlin', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Southampton', value: 28, group: 16, x: 8.893564, y: -207.08623},
+ {id: 522, label: 'Mousa Dembélé', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Tottenham Hotspur', value: 25, group: 28, x: -780.7014, y: -765.0794},
+ {id: 523, label: 'Moussa Sissoko', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Newcastle United', value: 25, group: 16, x: 49.931614, y: -364.4847},
+ {id: 524, label: 'Muhamed Bešic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Ferencváros', value: 22, group: 20, x: 1194.7092, y: -510.00156},
+ {id: 525, label: 'Nabil Bentaleb', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Tottenham Hotspur', value: 27, group: 24, x: -1282.9584, y: 861.7018},
+ {id: 526, label: 'Nabil Ghilas', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Porto', value: 30, group: 24, x: -1331.139, y: 965.7551},
+ {id: 527, label: 'Nacer Chadli', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Tottenham Hotspur', value: 25, group: 28, x: -730.6295, y: -798.0246},
+ {id: 528, label: 'Nani', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Manchester United', value: 35, group: 8, x: -646.50024, y: 40.378365},
+ {id: 529, label: 'Neymar', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Barcelona', value: 36, group: 23, x: -688.3395, y: -195.97823},
+ {id: 530, label: 'Nick Rimando', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Real Salt Lake', value: 22, group: 26, x: 864.0869, y: -1556.7881},
+ {id: 531, label: 'Nicolás Lodeiro', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Corinthians', value: 22, group: 6, x: -54.92223, y: 16.616009},
+ {id: 532, label: 'Nicolas Lombaerts', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 28, group: 28, x: -803.9264, y: -951.1398},
+ {id: 533, label: 'Nicolas N Koulou', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Marseille', value: 24, group: 17, x: 368.89407, y: 227.7929},
+ {id: 534, label: 'Nigel de Jong', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Milan', value: 29, group: 22, x: 764.12317, y: 266.0992},
+ {id: 535, label: 'Nikica Jelavic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Hull City', value: 23, group: 25, x: -197.7674, y: 532.7603},
+ {id: 536, label: 'Noel Valladares (c)', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Olimpia', value: 22, group: 7, x: 1633.6897, y: -1230.4397},
+ {id: 537, label: 'Ogenyi Onazi', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Lazio', value: 28, group: 14, x: -33.871628, y: -1294.2328},
+ {id: 538, label: 'Ognjen Vranješ', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Elaz??spor', value: 22, group: 20, x: 1242.7872, y: -442.58514},
+ {id: 539, label: 'Ognjen Vukojevic', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Dynamo Kyiv', value: 24, group: 25, x: -265.94672, y: 620.2862},
+ {id: 540, label: 'Oleg Shatov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 26, group: 2, x: -1223.3152, y: -1368.6674},
+ {id: 541, label: 'Oliver Bozanic', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Luzern', value: 22, group: 12, x: 2198.3757, y: -627.18024},
+ {id: 542, label: 'Oliver Zelenika', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Lokomotiva', value: 22, group: 25, x: -310.13934, y: 653.3941},
+ {id: 543, label: 'Olivier Giroud', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Arsenal', value: 29, group: 16, x: -51.68798, y: -320.77396},
+ {id: 544, label: 'Omar Gonzalez', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Los Angeles Galaxy', value: 22, group: 26, x: 770.25964, y: -1596.3325},
+ {id: 545, label: 'Orestis Karnezis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Granada', value: 24, group: 15, x: 1393.8566, y: 576.5566},
+ {id: 546, label: 'Oribe Peralta', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'Santos Laguna', value: 22, group: 21, x: -2123.5435, y: 394.2029},
+ {id: 547, label: 'Oscar', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Chelsea', value: 30, group: 23, x: -364.28693, y: -412.46796},
+ {id: 548, label: 'Óscar BagüÃ', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Emelec', value: 22, group: 4, x: -1773.5126, y: -705.2896},
+ {id: 549, label: 'Óscar Boniek GarcÃa', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Houston Dynamo', value: 23, group: 7, x: 1554.0684, y: -1285.4417},
+ {id: 550, label: 'Óscar Duarte', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Club Brugge', value: 23, group: 29, x: 2292.3699, y: 190.47668},
+ {id: 551, label: 'Osman Chávez', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Qingdao Jonoon', value: 22, group: 7, x: 1657.8716, y: -1139.4136},
+ {id: 552, label: 'Oswaldo Minda', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Chivas USA', value: 23, group: 4, x: -1549.4302, y: -719.534},
+ {id: 553, label: 'Ousmane Viera', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Çaykur Rizespor', value: 23, group: 9, x: 474.08282, y: -965.51855},
+ {id: 554, label: 'Pablo Armero', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'West Ham United', value: 22, group: 11, x: -854.2187, y: 1249.3016},
+ {id: 555, label: 'Pablo Zabaleta', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Manchester City', value: 29, group: 19, x: -933.6388, y: 24.648056},
+ {id: 556, label: 'Panagiotis Glykos', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'PAOK', value: 22, group: 15, x: 1575.4261, y: 522.7162},
+ {id: 557, label: 'Panagiotis Kone', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Bologna', value: 23, group: 15, x: 1535.2936, y: 466.857},
+ {id: 558, label: 'Panagiotis Tachtsidis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Torino', value: 25, group: 15, x: 1428.6139, y: 635.1239},
+ {id: 559, label: 'Park Chu-young', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Watford', value: 23, group: 10, x: 1047.7448, y: 1576.756},
+ {id: 560, label: 'Park Jong-woo', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Guangzhou R&F', value: 22, group: 10, x: 1236.0852, y: 1634.4038},
+ {id: 561, label: 'Park Joo-ho', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Mainz 05', value: 25, group: 10, x: 1252.9922, y: 1424.8129},
+ {id: 562, label: 'Patrice Evra', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Manchester United', value: 35, group: 16, x: -226.57672, y: -327.5888},
+ {id: 563, label: 'Patrick Pemberton', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Alajuelense', value: 23, group: 29, x: 2230.4392, y: 179.53189},
+ {id: 564, label: 'Paul Aguilar', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'América', value: 22, group: 21, x: -2114.9287, y: 482.15585},
+ {id: 565, label: 'Paul Pogba', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Juventus', value: 33, group: 16, x: 8.138252, y: 94.4195},
+ {id: 566, label: 'Paul Verhaegh', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'FC Augsburg', value: 24, group: 22, x: 949.3831, y: 201.00778},
+ {id: 567, label: 'Paulinho', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Tottenham Hotspur', value: 27, group: 23, x: -575.7446, y: -298.09418},
+ {id: 568, label: 'Pavel Mogilevets', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Rubin Kazan', value: 23, group: 2, x: -1357.9305, y: -1289.3833},
+ {id: 569, label: 'Pedro', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Barcelona', value: 31, group: 23, x: -1064.4056, y: -381.13626},
+ {id: 570, label: 'Pejman Montazeri', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Umm Salal', value: 22, group: 1, x: 2022.9941, y: 1015.42993},
+ {id: 571, label: 'Pepe', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Real Madrid', value: 31, group: 8, x: -652.3342, y: 226.08397},
+ {id: 572, label: 'Pepe Reina', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Napoli', value: 32, group: 23, x: -850.5622, y: -89.60556},
+ {id: 573, label: 'Per Mertesacker', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Arsenal', value: 29, group: 13, x: 261.49197, y: -532.3377},
+ {id: 574, label: 'Peter Odemwingie', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Stoke City', value: 25, group: 14, x: 110.87254, y: -1595.627},
+ {id: 575, label: 'Phil Jagielka', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Everton', value: 25, group: 28, x: -210.36139, y: -1046.034},
+ {id: 576, label: 'Phil Jones', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Manchester United', value: 32, group: 28, x: -300.32303, y: -774.0247},
+ {id: 577, label: 'Philipp Lahm (c)', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Bayern Munich', value: 29, group: 13, x: 350.3983, y: -483.03665},
+ {id: 578, label: 'Philippe Senderos', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Valencia', value: 26, group: 0, x: -84.25211, y: 385.70135},
+ {id: 579, label: 'Pierre Webó', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Fenerbahçe', value: 26, group: 17, x: 292.58267, y: 67.772385},
+ {id: 580, label: 'Rafa Silva', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Braga', value: 22, group: 8, x: -692.3677, y: 355.65155},
+ {id: 581, label: 'Rafael Márquez (c)', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'León', value: 22, group: 21, x: -2148.7192, y: 446.013},
+ {id: 582, label: 'Rafik Halliche', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Académica', value: 22, group: 24, x: -1426.0991, y: 1266.2908},
+ {id: 583, label: 'Raheem Sterling', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Liverpool', value: 27, group: 28, x: -93.51011, y: -985.4643},
+ {id: 584, label: 'Rahman Ahmadi', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Sepahan', value: 22, group: 1, x: 2011.6289, y: 1143.9183},
+ {id: 585, label: 'Raïs M Bolhi', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'CSKA Sofia', value: 22, group: 24, x: -1459.3608, y: 1229.282},
+ {id: 586, label: 'Ramires', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Chelsea', value: 30, group: 23, x: -481.02625, y: -469.71396},
+ {id: 587, label: 'Ramon Azeez', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'AlmerÃa', value: 22, group: 14, x: -83.15391, y: -1703.9006},
+ {id: 588, label: 'Randall Brenes', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Cartaginés', value: 22, group: 29, x: 2309.6873, y: 299.45453},
+ {id: 589, label: 'Raphaël Varane', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Real Madrid', value: 32, group: 16, x: -176.20541, y: -169.91304},
+ {id: 590, label: 'Rashid Sumaila', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Mamelodi Sundowns', value: 22, group: 5, x: 457.3916, y: 1442.739},
+ {id: 591, label: 'Raúl Albiol', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Napoli', value: 32, group: 23, x: -934.9327, y: -101.35684},
+ {id: 592, label: 'Raúl Jiménez', title: 'Country: ' + 'Mexico' + '
' + 'Team: ' + 'América', value: 22, group: 21, x: -2167.434, y: 400.85532},
+ {id: 593, label: 'Raul Meireles', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Fenerbahçe', value: 25, group: 8, x: -515.2749, y: 255.22029},
+ {id: 594, label: 'Rémy Cabella', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Montpellier', value: 22, group: 16, x: -28.49823, y: -252.28802},
+ {id: 595, label: 'Renato Ibarra', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Vitesse', value: 23, group: 4, x: -1613.8063, y: -545.05145},
+ {id: 596, label: 'Reto Ziegler', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Sassuolo', value: 22, group: 0, x: 3.861307, y: 248.17929},
+ {id: 597, label: 'Reuben Gabriel', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Waasland-Beveren', value: 22, group: 14, x: -132.04297, y: -1684.2073},
+ {id: 598, label: 'Reza Ghoochannejhad', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Charlton Athletic', value: 22, group: 1, x: 2037.9062, y: 1109.297},
+ {id: 599, label: 'Reza Haghighi', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Persepolis', value: 22, group: 1, x: 1912.5083, y: 1151.8527},
+ {id: 600, label: 'Ricardo Ãlvarez', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Internazionale', value: 27, group: 19, x: -991.71326, y: 419.20453},
+ {id: 601, label: 'Ricardo Costa', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Valencia', value: 25, group: 8, x: -699.53125, y: 481.92715},
+ {id: 602, label: 'Ricardo RodrÃguez', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'VfL Wolfsburg', value: 27, group: 0, x: -71.65908, y: 197.11438},
+ {id: 603, label: 'Rickie Lambert', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Southampton', value: 26, group: 28, x: -64.72023, y: -747.43665},
+ {id: 604, label: 'Rio Mavuba', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Lille', value: 25, group: 16, x: -65.83039, y: -421.9733},
+ {id: 605, label: 'Riyad Mahrez', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Leicester City', value: 22, group: 24, x: -1375.4896, y: 1263.6211},
+ {id: 606, label: 'Robin van Persie (c)', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Manchester United', value: 35, group: 22, x: 425.40573, y: -117.8186},
+ {id: 607, label: 'Rodrigo Muñoz', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Libertad', value: 22, group: 6, x: -20.128693, y: 28.408825},
+ {id: 608, label: 'Rodrigo Palacio', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Internazionale', value: 27, group: 19, x: -1056.1539, y: 433.82733},
+ {id: 609, label: 'Roger Espinoza', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Wigan Athletic', value: 23, group: 7, x: 1525.8236, y: -1042.1475},
+ {id: 610, label: 'Roman Bürki', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Grasshopper', value: 22, group: 0, x: 84.8047, y: 279.10205},
+ {id: 611, label: 'Roman Weidenfeller', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Borussia Dortmund', value: 24, group: 13, x: 605.1841, y: -360.4882},
+ {id: 612, label: 'Romelu Lukaku', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Everton', value: 26, group: 28, x: -624.76385, y: -965.3788},
+ {id: 613, label: 'Ron Vlaar', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Aston Villa', value: 23, group: 22, x: 922.5167, y: -99.8845},
+ {id: 614, label: 'Ron-Robert Zieler', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Hannover 96', value: 24, group: 13, x: 479.21454, y: -376.45038},
+ {id: 615, label: 'Rony MartÃnez', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Real Sociedad', value: 25, group: 7, x: 1436.8522, y: -978.24146},
+ {id: 616, label: 'Ross Barkley', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Everton', value: 25, group: 28, x: -149.7628, y: -1043.2092},
+ {id: 617, label: 'Roy Miller', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'New York Red Bulls', value: 23, group: 29, x: 2341.1836, y: 210.36285},
+ {id: 618, label: 'Rúben Amorim', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Benfica', value: 25, group: 8, x: -743.5818, y: 322.5777},
+ {id: 619, label: 'Rui PatrÃcio', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Sporting CP', value: 24, group: 8, x: -770.5219, y: 432.82077},
+ {id: 620, label: 'Ryan McGowan', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Shandong Luneng Taishan', value: 22, group: 12, x: 2185.5203, y: -671.7802},
+ {id: 621, label: 'Salomon Kalou', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Lille', value: 25, group: 9, x: 392.33093, y: -927.2915},
+ {id: 622, label: 'Salvatore Sirigu', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 29, group: 3, x: 133.34747, y: 646.7461},
+ {id: 623, label: 'Sami Khedira', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Real Madrid', value: 33, group: 13, x: 147.37221, y: -251.96838},
+ {id: 624, label: 'Sammir', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Getafe', value: 23, group: 25, x: -386.4237, y: 741.6884},
+ {id: 625, label: 'Sammy Bossut', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Zulte Waregem', value: 23, group: 28, x: -665.6252, y: -835.4098},
+ {id: 626, label: 'Sammy N Djock', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Fethiyespor', value: 22, group: 17, x: 341.5248, y: 155.85918},
+ {id: 627, label: 'Samuel Etoo (c)', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Chelsea', value: 33, group: 17, x: 207.89883, y: -77.141884},
+ {id: 628, label: 'Samuel Inkoom', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Platanias', value: 22, group: 5, x: 406.61176, y: 1441.4194},
+ {id: 629, label: 'Santi Cazorla', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Arsenal', value: 31, group: 23, x: -670.40643, y: -383.8588},
+ {id: 630, label: 'Santiago Arias', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'PSV', value: 25, group: 11, x: -524.84265, y: 1069.8534},
+ {id: 631, label: 'Saphir Taïder', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Internazionale', value: 29, group: 24, x: -1233.4976, y: 1029.0317},
+ {id: 632, label: 'Sayouba Mandé', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Stabæk', value: 22, group: 9, x: 565.81647, y: -858.44836},
+ {id: 633, label: 'Sead Kolašinac', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Schalke 04', value: 28, group: 20, x: 1107.5244, y: -303.29904},
+ {id: 634, label: 'Sebastián Coates', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Nacional', value: 22, group: 6, x: -52.670105, y: 55.847183},
+ {id: 635, label: 'Sejad Salihovic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + '1899 Hoffenheim', value: 23, group: 20, x: 1178.5911, y: -598.751},
+ {id: 636, label: 'Senad Lulic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Lazio', value: 28, group: 20, x: 921.65936, y: -424.2279},
+ {id: 637, label: 'Senijad Ibricic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Kayseri Erciyesspor', value: 22, group: 20, x: 1235.9749, y: -497.09393},
+ {id: 638, label: 'Serey Die', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Basel', value: 26, group: 9, x: 467.3826, y: -653.70386},
+ {id: 639, label: 'Serge Aurier', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Toulouse', value: 23, group: 9, x: 471.92194, y: -746.91907},
+ {id: 640, label: 'Sergei Ignashevich', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'CSKA Moscow', value: 23, group: 2, x: -1314.4222, y: -1444.7848},
+ {id: 641, label: 'Sergey Ryzhikov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Rubin Kazan', value: 23, group: 2, x: -1292.9913, y: -1369.3878},
+ {id: 642, label: 'Sergio Agüero', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'Manchester City', value: 29, group: 19, x: -986.27966, y: 70.57652},
+ {id: 643, label: 'Sergio Busquets', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Barcelona', value: 31, group: 23, x: -999.5799, y: -234.1426},
+ {id: 644, label: 'Sergio Ramos', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Real Madrid', value: 31, group: 23, x: -838.31433, y: -237.33427},
+ {id: 645, label: 'Sergio Romero', title: 'Country: ' + 'Argentina' + '
' + 'Team: ' + 'AS Monaco', value: 25, group: 19, x: -1110.6039, y: 391.88278},
+ {id: 646, label: 'Shinji Kagawa', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Manchester United', value: 35, group: 27, x: 282.65262, y: 314.0348},
+ {id: 647, label: 'Shinji Okazaki', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Mainz 05', value: 26, group: 27, x: 873.3198, y: 703.759},
+ {id: 648, label: 'Shkodran Mustafi', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Sampdoria', value: 22, group: 13, x: 459.89215, y: -438.27008},
+ {id: 649, label: 'Shola Ameobi', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Newcastle United', value: 27, group: 14, x: 18.686876, y: -1408.742},
+ {id: 650, label: 'Shuichi Gonda', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'F.C. Tokyo', value: 22, group: 27, x: 757.8243, y: 624.09985},
+ {id: 651, label: 'Shusaku Nishikawa', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Urawa Red Diamonds', value: 22, group: 27, x: 727.42017, y: 656.2659},
+ {id: 652, label: 'Silvestre Varela', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Porto', value: 30, group: 8, x: -839.6357, y: 400.2162},
+ {id: 653, label: 'Å ime Vrsaljko', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Genoa', value: 24, group: 25, x: -183.16594, y: 697.412},
+ {id: 654, label: 'Simon Mignolet', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Liverpool', value: 31, group: 28, x: -491.45493, y: -919.83154},
+ {id: 655, label: 'Sofiane Feghouli', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Valencia', value: 26, group: 24, x: -1244.9492, y: 1115.6299},
+ {id: 656, label: 'Sokratis Papastathopoulos', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Borussia Dortmund', value: 27, group: 15, x: 1506.5099, y: 339.67212},
+ {id: 657, label: 'Sol Bamba', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Trabzonspor', value: 22, group: 9, x: 570.6759, y: -908.82056},
+ {id: 658, label: 'Son Heung-min', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Bayer Leverkusen', value: 24, group: 10, x: 1048.6976, y: 1445.7692},
+ {id: 659, label: 'Stefan de Vrij', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Feyenoord', value: 22, group: 22, x: 967.54407, y: 46.134007},
+ {id: 660, label: 'Stefanos Kapino', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Panathinaikos', value: 24, group: 15, x: 1427.7283, y: 531.81995},
+ {id: 661, label: 'Stephan Lichtsteiner', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Juventus', value: 33, group: 0, x: 67.66878, y: 456.67883},
+ {id: 662, label: 'Stéphane Mbia', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Sevilla', value: 25, group: 17, x: 284.887, y: 226.59521},
+ {id: 663, label: 'Stéphane Ruffier', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Saint-Étienne', value: 24, group: 16, x: 44.785976, y: -265.3774},
+ {id: 664, label: 'Stephen Adams', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Aduana Stars', value: 22, group: 5, x: 502.8429, y: 1418.3192},
+ {id: 665, label: 'Steve von Bergen', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Young Boys', value: 22, group: 0, x: 10.2854805, y: 206.53181},
+ {id: 666, label: 'Steven Beitashour', title: 'Country: ' + 'Iran' + '
' + 'Team: ' + 'Vancouver Whitecaps FC', value: 22, group: 1, x: 1978.9785, y: 1007.8008},
+ {id: 667, label: 'Steven Defour', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Porto', value: 30, group: 28, x: -855.4899, y: -553.74506},
+ {id: 668, label: 'Steven Gerrard (c)', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Liverpool', value: 27, group: 28, x: -159.6521, y: -980.6687},
+ {id: 669, label: 'Stipe Pletikosa', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Rostov', value: 22, group: 25, x: -333.2818, y: 696.163},
+ {id: 670, label: 'Sulley Muntari', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Milan', value: 28, group: 5, x: 435.759, y: 1263.3812},
+ {id: 671, label: 'Sylvain Gbohouo', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Séwé Sport', value: 22, group: 9, x: 531.5453, y: -936.86206},
+ {id: 672, label: 'Teófilo Gutiérrez', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'River Plate', value: 22, group: 11, x: -811.0555, y: 1271.3983},
+ {id: 673, label: 'Terence Kongolo', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Feyenoord', value: 22, group: 22, x: 966.41876, y: -4.162721},
+ {id: 674, label: 'Theofanis Gekas', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Konyaspor', value: 23, group: 15, x: 1527.9011, y: 552.6124},
+ {id: 675, label: 'Thiago Motta', title: 'Country: ' + 'Italy' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 29, group: 3, x: 60.09504, y: 671.3873},
+ {id: 676, label: 'Thiago Silva (c)', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 30, group: 23, x: -361.46573, y: -169.68611},
+ {id: 677, label: 'Thibaut Courtois', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Atlético Madrid', value: 29, group: 28, x: -784.1882, y: -694.4416},
+ {id: 678, label: 'Thomas Müller', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Bayern Munich', value: 29, group: 13, x: 396.2324, y: -434.3364},
+ {id: 679, label: 'Thomas Vermaelen', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Arsenal', value: 31, group: 28, x: -482.76413, y: -771.15424},
+ {id: 680, label: 'Tim Cahill', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'New York Red Bulls', value: 23, group: 12, x: 2114.505, y: -511.01007},
+ {id: 681, label: 'Tim Howard', title: 'Country: ' + 'United States' + '
' + 'Team: ' + 'Everton', value: 27, group: 26, x: 597.101, y: -1458.6305},
+ {id: 682, label: 'Tim Krul', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Newcastle United', value: 27, group: 22, x: 749.57495, y: -122.823105},
+ {id: 683, label: 'Timothy Chandler', title: 'Country: ' + 'United States' + '
' + 'Team: ' + '1. FC Nürnberg', value: 25, group: 26, x: 803.35706, y: -1282.8247},
+ {id: 684, label: 'Tino-Sven Sušic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Hajduk Split', value: 22, group: 20, x: 1264.119, y: -534.24},
+ {id: 685, label: 'Toby Alderweireld', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Atlético Madrid', value: 29, group: 28, x: -719.4183, y: -665.748},
+ {id: 686, label: 'Tommy Oar', title: 'Country: ' + 'Australia' + '
' + 'Team: ' + 'Utrecht', value: 22, group: 12, x: 2165.0227, y: -713.54254},
+ {id: 687, label: 'Toni Kroos', title: 'Country: ' + 'Germany' + '
' + 'Team: ' + 'Bayern Munich', value: 29, group: 13, x: 364.47653, y: -371.89417},
+ {id: 688, label: 'Toni Å unjic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Zorya Luhansk', value: 22, group: 20, x: 1221.8553, y: -554.841},
+ {id: 689, label: 'Toshihiro Aoyama', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Sanfrecce Hiroshima', value: 23, group: 27, x: 774.47, y: 733.8078},
+ {id: 690, label: 'Tranquillo Barnetta', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Eintracht Frankfurt', value: 23, group: 0, x: 73.72464, y: 117.78337},
+ {id: 691, label: 'Uche Nwofor', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Heerenveen', value: 22, group: 14, x: -33.31396, y: -1701.1675},
+ {id: 692, label: 'Valentin Stocker', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Basel', value: 25, group: 0, x: 93.94299, y: 165.77863},
+ {id: 693, label: 'Valon Behrami', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Napoli', value: 31, group: 0, x: -152.94186, y: 233.43562},
+ {id: 694, label: 'Vangelis Moras', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Verona', value: 22, group: 15, x: 1602.7228, y: 488.25735},
+ {id: 695, label: 'Vasili Berezutski (c)', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'CSKA Moscow', value: 23, group: 2, x: -1323.1439, y: -1494.2708},
+ {id: 696, label: 'Vasilis Torosidis', title: 'Country: ' + 'Greece' + '
' + 'Team: ' + 'Roma', value: 26, group: 15, x: 1423.1809, y: 425.1927},
+ {id: 697, label: 'Vedad Ibiševic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'VfB Stuttgart', value: 25, group: 20, x: 1011.34985, y: -507.73672},
+ {id: 698, label: 'Vedran Corluka', title: 'Country: ' + 'Croatia' + '
' + 'Team: ' + 'Lokomotiv Moscow', value: 23, group: 25, x: -415.4615, y: 539.5565},
+ {id: 699, label: 'Victor', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Atlético Mineiro', value: 22, group: 23, x: -504.1157, y: -310.5912},
+ {id: 700, label: 'VÃctor Bernárdez', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'San Jose Earthquakes', value: 23, group: 7, x: 1542.3271, y: -1230.5049},
+ {id: 701, label: 'VÃctor Ibarbo', title: 'Country: ' + 'Colombia' + '
' + 'Team: ' + 'Cagliari', value: 23, group: 11, x: -760.3384, y: 1293.0891},
+ {id: 702, label: 'Victor Moses', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Liverpool', value: 31, group: 14, x: -114.12856, y: -1433.1643},
+ {id: 703, label: 'Vieirinha', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'VfL Wolfsburg', value: 28, group: 8, x: -584.53986, y: 300.7302},
+ {id: 704, label: 'Viktor Fayzulin', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 26, group: 2, x: -1257.4415, y: -1320.7031},
+ {id: 705, label: 'Vincent Aboubakar', title: 'Country: ' + 'Cameroon' + '
' + 'Team: ' + 'Lorient', value: 22, group: 17, x: 458.34485, y: 202.27162},
+ {id: 706, label: 'Vincent Enyeama', title: 'Country: ' + 'Nigeria' + '
' + 'Team: ' + 'Lille', value: 25, group: 14, x: -105.49051, y: -1519.4764},
+ {id: 707, label: 'Vincent Kompany (c)', title: 'Country: ' + 'Belgium' + '
' + 'Team: ' + 'Manchester City', value: 31, group: 28, x: -575.3739, y: -726.92163},
+ {id: 708, label: 'Vladimir Granat', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Dynamo Moscow', value: 23, group: 2, x: -1378.1497, y: -1417.719},
+ {id: 709, label: 'Wakaso Mubarak', title: 'Country: ' + 'Ghana' + '
' + 'Team: ' + 'Rubin Kazan', value: 25, group: 5, x: 209.43652, y: 1057.448},
+ {id: 710, label: 'Walter AyovÃ', title: 'Country: ' + 'Ecuador' + '
' + 'Team: ' + 'Pachuca', value: 22, group: 4, x: -1792.0483, y: -657.5009},
+ {id: 711, label: 'Walter Gargano', title: 'Country: ' + 'Uruguay' + '
' + 'Team: ' + 'Parma', value: 26, group: 6, x: -40.095936, y: 145.01854},
+ {id: 712, label: 'Waylon Francis', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Columbus Crew', value: 22, group: 29, x: 2350.4897, y: 280.31845},
+ {id: 713, label: 'Wayne Rooney', title: 'Country: ' + 'England' + '
' + 'Team: ' + 'Manchester United', value: 32, group: 28, x: -356.85434, y: -834.0883},
+ {id: 714, label: 'Wesley Sneijder', title: 'Country: ' + 'Netherlands' + '
' + 'Team: ' + 'Galatasaray', value: 26, group: 22, x: 805.6672, y: -40.132378},
+ {id: 715, label: 'Wilfried Bony', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Swansea City', value: 24, group: 9, x: 607.71, y: -803.1463},
+ {id: 716, label: 'William Carvalho', title: 'Country: ' + 'Portugal' + '
' + 'Team: ' + 'Sporting CP', value: 24, group: 8, x: -772.3611, y: 375.09537},
+ {id: 717, label: 'Willian', title: 'Country: ' + 'Brazil' + '
' + 'Team: ' + 'Chelsea', value: 30, group: 23, x: -440.73843, y: -410.8239},
+ {id: 718, label: 'Wilson Palacios', title: 'Country: ' + 'Honduras' + '
' + 'Team: ' + 'Stoke City', value: 25, group: 7, x: 1475.9537, y: -1233.8828},
+ {id: 719, label: 'Xabi Alonso', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Real Madrid', value: 31, group: 23, x: -899.6201, y: -193.28745},
+ {id: 720, label: 'Xavi', title: 'Country: ' + 'Spain' + '
' + 'Team: ' + 'Barcelona', value: 31, group: 23, x: -1013.3928, y: -319.86545},
+ {id: 721, label: 'Xherdan Shaqiri', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Bayern Munich', value: 35, group: 0, x: 141.7251, y: 12.289529},
+ {id: 722, label: 'Yacine Brahimi', title: 'Country: ' + 'Algeria' + '
' + 'Team: ' + 'Granada', value: 24, group: 24, x: -1176.7251, y: 1144.9346},
+ {id: 723, label: 'Yann Sommer', title: 'Country: ' + 'Switzerland' + '
' + 'Team: ' + 'Basel', value: 25, group: 0, x: 110.022545, y: 216.66074},
+ {id: 724, label: 'Yasuhito Endo', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Gamba Osaka', value: 22, group: 27, x: 785.91925, y: 586.32904},
+ {id: 725, label: 'Yasuyuki Konno', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Gamba Osaka', value: 22, group: 27, x: 772.3632, y: 672.5744},
+ {id: 726, label: 'Yaya Touré', title: 'Country: ' + 'Ivory Coast' + '
' + 'Team: ' + 'Manchester City', value: 31, group: 9, x: 251.69077, y: -758.7758},
+ {id: 727, label: 'Yeltsin Tejeda', title: 'Country: ' + 'Costa Rica' + '
' + 'Team: ' + 'Saprissa', value: 22, group: 29, x: 2354.9373, y: 330.56363},
+ {id: 728, label: 'Yohan Cabaye', title: 'Country: ' + 'France' + '
' + 'Team: ' + 'Paris Saint-Germain', value: 29, group: 16, x: -73.94801, y: -145.80449},
+ {id: 729, label: 'Yoichiro Kakitani', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Cerezo Osaka', value: 23, group: 27, x: 646.941, y: 622.23926},
+ {id: 730, label: 'Yoshito Okubo', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Kawasaki Frontale', value: 22, group: 27, x: 717.32806, y: 699.96234},
+ {id: 731, label: 'Yun Suk-young', title: 'Country: ' + 'South Korea' + '
' + 'Team: ' + 'Queens Park Rangers', value: 23, group: 10, x: 1131.6682, y: 1494.4373},
+ {id: 732, label: 'Yuri Lodygin', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Zenit Saint Petersburg', value: 26, group: 2, x: -1301.0415, y: -1265.7511},
+ {id: 733, label: 'Yuri Zhirkov', title: 'Country: ' + 'Russia' + '
' + 'Team: ' + 'Dynamo Moscow', value: 23, group: 2, x: -1464.4825, y: -1475.7117},
+ {id: 734, label: 'Yuto Nagatomo', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + 'Internazionale', value: 29, group: 27, x: 395.00394, y: 607.5659},
+ {id: 735, label: 'Yuya Osako', title: 'Country: ' + 'Japan' + '
' + 'Team: ' + '1860 München', value: 22, group: 27, x: 806.69904, y: 633.54565},
+ {id: 736, label: 'Zvjezdan Misimovic', title: 'Country: ' + 'Bosnia and Herzegovina' + '
' + 'Team: ' + 'Guizhou Renhe', value: 22, group: 20, x: 1277.4697, y: -479.12265}
+
+];
+// create an array with edges
+var edges = [
+ {from: 1, to: 15},
+ {from: 1, to: 97},
+ {from: 1, to: 108},
+ {from: 1, to: 173},
+ {from: 1, to: 195},
+ {from: 1, to: 205},
+ {from: 1, to: 218},
+ {from: 1, to: 274},
+ {from: 1, to: 296},
+ {from: 1, to: 418},
+ {from: 1, to: 435},
+ {from: 1, to: 493},
+ {from: 1, to: 494},
+ {from: 1, to: 519},
+ {from: 1, to: 525},
+ {from: 1, to: 526},
+ {from: 1, to: 582},
+ {from: 1, to: 585},
+ {from: 1, to: 605},
+ {from: 1, to: 631},
+ {from: 1, to: 655},
+ {from: 1, to: 722},
+ {from: 2, to: 10},
+ {from: 2, to: 31},
+ {from: 2, to: 96},
+ {from: 2, to: 99},
+ {from: 2, to: 100},
+ {from: 2, to: 105},
+ {from: 2, to: 106},
+ {from: 2, to: 130},
+ {from: 2, to: 153},
+ {from: 2, to: 181},
+ {from: 2, to: 219},
+ {from: 2, to: 234},
+ {from: 2, to: 304},
+ {from: 2, to: 309},
+ {from: 2, to: 322},
+ {from: 2, to: 366},
+ {from: 2, to: 369},
+ {from: 2, to: 370},
+ {from: 2, to: 457},
+ {from: 2, to: 554},
+ {from: 2, to: 630},
+ {from: 2, to: 639},
+ {from: 2, to: 672},
+ {from: 2, to: 701},
+ {from: 3, to: 38},
+ {from: 3, to: 39},
+ {from: 3, to: 121},
+ {from: 3, to: 129},
+ {from: 3, to: 165},
+ {from: 3, to: 166},
+ {from: 3, to: 167},
+ {from: 3, to: 168},
+ {from: 3, to: 185},
+ {from: 3, to: 191},
+ {from: 3, to: 226},
+ {from: 3, to: 240},
+ {from: 3, to: 352},
+ {from: 3, to: 359},
+ {from: 3, to: 430},
+ {from: 3, to: 461},
+ {from: 3, to: 463},
+ {from: 3, to: 486},
+ {from: 3, to: 531},
+ {from: 3, to: 607},
+ {from: 3, to: 634},
+ {from: 3, to: 711},
+ {from: 4, to: 11},
+ {from: 4, to: 18},
+ {from: 4, to: 43},
+ {from: 4, to: 65},
+ {from: 4, to: 118},
+ {from: 4, to: 138},
+ {from: 4, to: 199},
+ {from: 4, to: 220},
+ {from: 4, to: 272},
+ {from: 4, to: 340},
+ {from: 4, to: 346},
+ {from: 4, to: 347},
+ {from: 4, to: 387},
+ {from: 4, to: 404},
+ {from: 4, to: 437},
+ {from: 4, to: 503},
+ {from: 4, to: 520},
+ {from: 4, to: 590},
+ {from: 4, to: 628},
+ {from: 4, to: 664},
+ {from: 4, to: 670},
+ {from: 4, to: 709},
+ {from: 5, to: 27},
+ {from: 5, to: 80},
+ {from: 5, to: 116},
+ {from: 5, to: 139},
+ {from: 5, to: 144},
+ {from: 5, to: 157},
+ {from: 5, to: 231},
+ {from: 5, to: 232},
+ {from: 5, to: 238},
+ {from: 5, to: 240},
+ {from: 5, to: 258},
+ {from: 5, to: 303},
+ {from: 5, to: 308},
+ {from: 5, to: 335},
+ {from: 5, to: 348},
+ {from: 5, to: 415},
+ {from: 5, to: 434},
+ {from: 5, to: 491},
+ {from: 5, to: 521},
+ {from: 5, to: 575},
+ {from: 5, to: 576},
+ {from: 5, to: 583},
+ {from: 5, to: 603},
+ {from: 5, to: 616},
+ {from: 5, to: 668},
+ {from: 5, to: 713},
+ {from: 6, to: 29},
+ {from: 6, to: 77},
+ {from: 6, to: 81},
+ {from: 6, to: 148},
+ {from: 6, to: 208},
+ {from: 6, to: 298},
+ {from: 6, to: 307},
+ {from: 6, to: 310},
+ {from: 6, to: 313},
+ {from: 6, to: 458},
+ {from: 6, to: 459},
+ {from: 6, to: 468},
+ {from: 6, to: 470},
+ {from: 6, to: 471},
+ {from: 6, to: 477},
+ {from: 6, to: 479},
+ {from: 6, to: 515},
+ {from: 6, to: 518},
+ {from: 6, to: 541},
+ {from: 6, to: 620},
+ {from: 6, to: 680},
+ {from: 6, to: 686},
+ {from: 7, to: 88},
+ {from: 7, to: 162},
+ {from: 7, to: 215},
+ {from: 7, to: 241},
+ {from: 7, to: 260},
+ {from: 7, to: 266},
+ {from: 7, to: 271},
+ {from: 7, to: 339},
+ {from: 7, to: 364},
+ {from: 7, to: 453},
+ {from: 7, to: 480},
+ {from: 7, to: 497},
+ {from: 7, to: 504},
+ {from: 7, to: 578},
+ {from: 7, to: 596},
+ {from: 7, to: 602},
+ {from: 7, to: 610},
+ {from: 7, to: 661},
+ {from: 7, to: 665},
+ {from: 7, to: 690},
+ {from: 7, to: 692},
+ {from: 7, to: 693},
+ {from: 7, to: 721},
+ {from: 7, to: 723},
+ {from: 8, to: 56},
+ {from: 8, to: 60},
+ {from: 8, to: 74},
+ {from: 8, to: 116},
+ {from: 8, to: 140},
+ {from: 8, to: 144},
+ {from: 8, to: 150},
+ {from: 8, to: 172},
+ {from: 8, to: 177},
+ {from: 8, to: 179},
+ {from: 8, to: 311},
+ {from: 8, to: 318},
+ {from: 8, to: 371},
+ {from: 8, to: 384},
+ {from: 8, to: 386},
+ {from: 8, to: 408},
+ {from: 8, to: 460},
+ {from: 8, to: 522},
+ {from: 8, to: 527},
+ {from: 8, to: 528},
+ {from: 8, to: 532},
+ {from: 8, to: 562},
+ {from: 8, to: 576},
+ {from: 8, to: 606},
+ {from: 8, to: 612},
+ {from: 8, to: 625},
+ {from: 8, to: 646},
+ {from: 8, to: 654},
+ {from: 8, to: 667},
+ {from: 8, to: 677},
+ {from: 8, to: 679},
+ {from: 8, to: 685},
+ {from: 8, to: 707},
+ {from: 8, to: 713},
+ {from: 9, to: 30},
+ {from: 9, to: 60},
+ {from: 9, to: 102},
+ {from: 9, to: 120},
+ {from: 9, to: 186},
+ {from: 9, to: 201},
+ {from: 9, to: 222},
+ {from: 9, to: 228},
+ {from: 9, to: 235},
+ {from: 9, to: 236},
+ {from: 9, to: 305},
+ {from: 9, to: 324},
+ {from: 9, to: 334},
+ {from: 9, to: 353},
+ {from: 9, to: 368},
+ {from: 9, to: 429},
+ {from: 9, to: 489},
+ {from: 9, to: 499},
+ {from: 9, to: 548},
+ {from: 9, to: 552},
+ {from: 9, to: 595},
+ {from: 9, to: 710},
+ {from: 10, to: 31},
+ {from: 10, to: 96},
+ {from: 10, to: 99},
+ {from: 10, to: 100},
+ {from: 10, to: 105},
+ {from: 10, to: 106},
+ {from: 10, to: 130},
+ {from: 10, to: 153},
+ {from: 10, to: 181},
+ {from: 10, to: 219},
+ {from: 10, to: 234},
+ {from: 10, to: 304},
+ {from: 10, to: 309},
+ {from: 10, to: 341},
+ {from: 10, to: 366},
+ {from: 10, to: 369},
+ {from: 10, to: 370},
+ {from: 10, to: 457},
+ {from: 10, to: 554},
+ {from: 10, to: 630},
+ {from: 10, to: 672},
+ {from: 10, to: 701},
+ {from: 11, to: 18},
+ {from: 11, to: 43},
+ {from: 11, to: 59},
+ {from: 11, to: 65},
+ {from: 11, to: 118},
+ {from: 11, to: 138},
+ {from: 11, to: 199},
+ {from: 11, to: 220},
+ {from: 11, to: 237},
+ {from: 11, to: 272},
+ {from: 11, to: 340},
+ {from: 11, to: 346},
+ {from: 11, to: 347},
+ {from: 11, to: 387},
+ {from: 11, to: 404},
+ {from: 11, to: 437},
+ {from: 11, to: 447},
+ {from: 11, to: 503},
+ {from: 11, to: 520},
+ {from: 11, to: 590},
+ {from: 11, to: 628},
+ {from: 11, to: 664},
+ {from: 11, to: 670},
+ {from: 11, to: 709},
+ {from: 11, to: 711},
+ {from: 12, to: 54},
+ {from: 12, to: 70},
+ {from: 12, to: 202},
+ {from: 12, to: 211},
+ {from: 12, to: 212},
+ {from: 12, to: 221},
+ {from: 12, to: 225},
+ {from: 12, to: 261},
+ {from: 12, to: 287},
+ {from: 12, to: 319},
+ {from: 12, to: 358},
+ {from: 12, to: 419},
+ {from: 12, to: 424},
+ {from: 12, to: 450},
+ {from: 12, to: 451},
+ {from: 12, to: 462},
+ {from: 12, to: 487},
+ {from: 12, to: 555},
+ {from: 12, to: 600},
+ {from: 12, to: 608},
+ {from: 12, to: 642},
+ {from: 12, to: 645},
+ {from: 13, to: 35},
+ {from: 13, to: 36},
+ {from: 13, to: 40},
+ {from: 13, to: 41},
+ {from: 13, to: 66},
+ {from: 13, to: 78},
+ {from: 13, to: 137},
+ {from: 13, to: 192},
+ {from: 13, to: 247},
+ {from: 13, to: 273},
+ {from: 13, to: 284},
+ {from: 13, to: 306},
+ {from: 13, to: 315},
+ {from: 13, to: 380},
+ {from: 13, to: 389},
+ {from: 13, to: 467},
+ {from: 13, to: 495},
+ {from: 13, to: 570},
+ {from: 13, to: 584},
+ {from: 13, to: 598},
+ {from: 13, to: 599},
+ {from: 13, to: 666},
+ {from: 14, to: 16},
+ {from: 14, to: 72},
+ {from: 14, to: 75},
+ {from: 14, to: 115},
+ {from: 14, to: 190},
+ {from: 14, to: 194},
+ {from: 14, to: 200},
+ {from: 14, to: 243},
+ {from: 14, to: 259},
+ {from: 14, to: 292},
+ {from: 14, to: 342},
+ {from: 14, to: 363},
+ {from: 14, to: 379},
+ {from: 14, to: 383},
+ {from: 14, to: 403},
+ {from: 14, to: 500},
+ {from: 14, to: 505},
+ {from: 14, to: 537},
+ {from: 14, to: 574},
+ {from: 14, to: 587},
+ {from: 14, to: 597},
+ {from: 14, to: 640},
+ {from: 14, to: 649},
+ {from: 14, to: 691},
+ {from: 14, to: 695},
+ {from: 14, to: 702},
+ {from: 14, to: 706},
+ {from: 15, to: 97},
+ {from: 15, to: 108},
+ {from: 15, to: 173},
+ {from: 15, to: 195},
+ {from: 15, to: 205},
+ {from: 15, to: 218},
+ {from: 15, to: 274},
+ {from: 15, to: 296},
+ {from: 15, to: 418},
+ {from: 15, to: 435},
+ {from: 15, to: 493},
+ {from: 15, to: 494},
+ {from: 15, to: 519},
+ {from: 15, to: 525},
+ {from: 15, to: 526},
+ {from: 15, to: 582},
+ {from: 15, to: 585},
+ {from: 15, to: 605},
+ {from: 15, to: 631},
+ {from: 15, to: 655},
+ {from: 15, to: 722},
+ {from: 16, to: 21},
+ {from: 16, to: 22},
+ {from: 16, to: 23},
+ {from: 16, to: 24},
+ {from: 16, to: 25},
+ {from: 16, to: 48},
+ {from: 16, to: 51},
+ {from: 16, to: 158},
+ {from: 16, to: 174},
+ {from: 16, to: 243},
+ {from: 16, to: 292},
+ {from: 16, to: 293},
+ {from: 16, to: 439},
+ {from: 16, to: 540},
+ {from: 16, to: 568},
+ {from: 16, to: 640},
+ {from: 16, to: 641},
+ {from: 16, to: 695},
+ {from: 16, to: 704},
+ {from: 16, to: 708},
+ {from: 16, to: 732},
+ {from: 16, to: 733},
+ {from: 17, to: 34},
+ {from: 17, to: 49},
+ {from: 17, to: 103},
+ {from: 17, to: 104},
+ {from: 17, to: 169},
+ {from: 17, to: 229},
+ {from: 17, to: 256},
+ {from: 17, to: 267},
+ {from: 17, to: 275},
+ {from: 17, to: 276},
+ {from: 17, to: 295},
+ {from: 17, to: 317},
+ {from: 17, to: 318},
+ {from: 17, to: 355},
+ {from: 17, to: 357},
+ {from: 17, to: 446},
+ {from: 17, to: 509},
+ {from: 17, to: 510},
+ {from: 17, to: 546},
+ {from: 17, to: 564},
+ {from: 17, to: 581},
+ {from: 17, to: 592},
+ {from: 18, to: 43},
+ {from: 18, to: 65},
+ {from: 18, to: 118},
+ {from: 18, to: 138},
+ {from: 18, to: 199},
+ {from: 18, to: 220},
+ {from: 18, to: 272},
+ {from: 18, to: 340},
+ {from: 18, to: 346},
+ {from: 18, to: 347},
+ {from: 18, to: 383},
+ {from: 18, to: 387},
+ {from: 18, to: 404},
+ {from: 18, to: 437},
+ {from: 18, to: 503},
+ {from: 18, to: 520},
+ {from: 18, to: 590},
+ {from: 18, to: 628},
+ {from: 18, to: 664},
+ {from: 18, to: 670},
+ {from: 18, to: 709},
+ {from: 19, to: 26},
+ {from: 19, to: 45},
+ {from: 19, to: 46},
+ {from: 19, to: 55},
+ {from: 19, to: 58},
+ {from: 19, to: 59},
+ {from: 19, to: 123},
+ {from: 19, to: 125},
+ {from: 19, to: 141},
+ {from: 19, to: 237},
+ {from: 19, to: 249},
+ {from: 19, to: 252},
+ {from: 19, to: 291},
+ {from: 19, to: 370},
+ {from: 19, to: 416},
+ {from: 19, to: 422},
+ {from: 19, to: 447},
+ {from: 19, to: 449},
+ {from: 19, to: 452},
+ {from: 19, to: 478},
+ {from: 19, to: 481},
+ {from: 19, to: 482},
+ {from: 19, to: 622},
+ {from: 19, to: 675},
+ {from: 20, to: 62},
+ {from: 20, to: 90},
+ {from: 20, to: 91},
+ {from: 20, to: 117},
+ {from: 20, to: 126},
+ {from: 20, to: 134},
+ {from: 20, to: 156},
+ {from: 20, to: 213},
+ {from: 20, to: 242},
+ {from: 20, to: 265},
+ {from: 20, to: 326},
+ {from: 20, to: 341},
+ {from: 20, to: 365},
+ {from: 20, to: 375},
+ {from: 20, to: 406},
+ {from: 20, to: 476},
+ {from: 20, to: 502},
+ {from: 20, to: 513},
+ {from: 20, to: 530},
+ {from: 20, to: 544},
+ {from: 20, to: 681},
+ {from: 20, to: 683},
+ {from: 21, to: 22},
+ {from: 21, to: 23},
+ {from: 21, to: 24},
+ {from: 21, to: 25},
+ {from: 21, to: 48},
+ {from: 21, to: 51},
+ {from: 21, to: 74},
+ {from: 21, to: 158},
+ {from: 21, to: 174},
+ {from: 21, to: 243},
+ {from: 21, to: 289},
+ {from: 21, to: 292},
+ {from: 21, to: 293},
+ {from: 21, to: 428},
+ {from: 21, to: 439},
+ {from: 21, to: 532},
+ {from: 21, to: 540},
+ {from: 21, to: 568},
+ {from: 21, to: 640},
+ {from: 21, to: 641},
+ {from: 21, to: 695},
+ {from: 21, to: 704},
+ {from: 21, to: 708},
+ {from: 21, to: 732},
+ {from: 21, to: 733},
+ {from: 22, to: 23},
+ {from: 22, to: 24},
+ {from: 22, to: 25},
+ {from: 22, to: 48},
+ {from: 22, to: 51},
+ {from: 22, to: 120},
+ {from: 22, to: 158},
+ {from: 22, to: 174},
+ {from: 22, to: 243},
+ {from: 22, to: 292},
+ {from: 22, to: 293},
+ {from: 22, to: 439},
+ {from: 22, to: 540},
+ {from: 22, to: 568},
+ {from: 22, to: 640},
+ {from: 22, to: 641},
+ {from: 22, to: 695},
+ {from: 22, to: 704},
+ {from: 22, to: 708},
+ {from: 22, to: 732},
+ {from: 22, to: 733},
+ {from: 23, to: 24},
+ {from: 23, to: 25},
+ {from: 23, to: 48},
+ {from: 23, to: 51},
+ {from: 23, to: 158},
+ {from: 23, to: 174},
+ {from: 23, to: 243},
+ {from: 23, to: 292},
+ {from: 23, to: 293},
+ {from: 23, to: 439},
+ {from: 23, to: 540},
+ {from: 23, to: 568},
+ {from: 23, to: 640},
+ {from: 23, to: 641},
+ {from: 23, to: 695},
+ {from: 23, to: 698},
+ {from: 23, to: 704},
+ {from: 23, to: 708},
+ {from: 23, to: 732},
+ {from: 23, to: 733},
+ {from: 24, to: 25},
+ {from: 24, to: 48},
+ {from: 24, to: 51},
+ {from: 24, to: 120},
+ {from: 24, to: 158},
+ {from: 24, to: 174},
+ {from: 24, to: 243},
+ {from: 24, to: 292},
+ {from: 24, to: 293},
+ {from: 24, to: 439},
+ {from: 24, to: 540},
+ {from: 24, to: 568},
+ {from: 24, to: 640},
+ {from: 24, to: 641},
+ {from: 24, to: 695},
+ {from: 24, to: 704},
+ {from: 24, to: 708},
+ {from: 24, to: 732},
+ {from: 24, to: 733},
+ {from: 25, to: 48},
+ {from: 25, to: 51},
+ {from: 25, to: 120},
+ {from: 25, to: 158},
+ {from: 25, to: 174},
+ {from: 25, to: 243},
+ {from: 25, to: 292},
+ {from: 25, to: 293},
+ {from: 25, to: 439},
+ {from: 25, to: 540},
+ {from: 25, to: 568},
+ {from: 25, to: 640},
+ {from: 25, to: 641},
+ {from: 25, to: 695},
+ {from: 25, to: 704},
+ {from: 25, to: 708},
+ {from: 25, to: 732},
+ {from: 25, to: 733},
+ {from: 26, to: 45},
+ {from: 26, to: 46},
+ {from: 26, to: 58},
+ {from: 26, to: 59},
+ {from: 26, to: 123},
+ {from: 26, to: 125},
+ {from: 26, to: 141},
+ {from: 26, to: 237},
+ {from: 26, to: 249},
+ {from: 26, to: 252},
+ {from: 26, to: 291},
+ {from: 26, to: 416},
+ {from: 26, to: 422},
+ {from: 26, to: 447},
+ {from: 26, to: 449},
+ {from: 26, to: 452},
+ {from: 26, to: 478},
+ {from: 26, to: 481},
+ {from: 26, to: 482},
+ {from: 26, to: 558},
+ {from: 26, to: 622},
+ {from: 26, to: 675},
+ {from: 27, to: 76},
+ {from: 27, to: 80},
+ {from: 27, to: 116},
+ {from: 27, to: 139},
+ {from: 27, to: 144},
+ {from: 27, to: 231},
+ {from: 27, to: 232},
+ {from: 27, to: 238},
+ {from: 27, to: 258},
+ {from: 27, to: 303},
+ {from: 27, to: 308},
+ {from: 27, to: 335},
+ {from: 27, to: 348},
+ {from: 27, to: 409},
+ {from: 27, to: 415},
+ {from: 27, to: 433},
+ {from: 27, to: 434},
+ {from: 27, to: 498},
+ {from: 27, to: 543},
+ {from: 27, to: 573},
+ {from: 27, to: 575},
+ {from: 27, to: 576},
+ {from: 27, to: 583},
+ {from: 27, to: 603},
+ {from: 27, to: 616},
+ {from: 27, to: 629},
+ {from: 27, to: 668},
+ {from: 27, to: 679},
+ {from: 27, to: 713},
+ {from: 28, to: 33},
+ {from: 28, to: 37},
+ {from: 28, to: 50},
+ {from: 28, to: 71},
+ {from: 28, to: 83},
+ {from: 28, to: 84},
+ {from: 28, to: 107},
+ {from: 28, to: 111},
+ {from: 28, to: 113},
+ {from: 28, to: 135},
+ {from: 28, to: 146},
+ {from: 28, to: 182},
+ {from: 28, to: 210},
+ {from: 28, to: 217},
+ {from: 28, to: 245},
+ {from: 28, to: 278},
+ {from: 28, to: 319},
+ {from: 28, to: 321},
+ {from: 28, to: 337},
+ {from: 28, to: 349},
+ {from: 28, to: 368},
+ {from: 28, to: 407},
+ {from: 28, to: 419},
+ {from: 28, to: 420},
+ {from: 28, to: 429},
+ {from: 28, to: 488},
+ {from: 28, to: 489},
+ {from: 28, to: 529},
+ {from: 28, to: 533},
+ {from: 28, to: 569},
+ {from: 28, to: 579},
+ {from: 28, to: 626},
+ {from: 28, to: 627},
+ {from: 28, to: 643},
+ {from: 28, to: 662},
+ {from: 28, to: 705},
+ {from: 28, to: 720},
+ {from: 29, to: 77},
+ {from: 29, to: 81},
+ {from: 29, to: 148},
+ {from: 29, to: 208},
+ {from: 29, to: 298},
+ {from: 29, to: 307},
+ {from: 29, to: 310},
+ {from: 29, to: 313},
+ {from: 29, to: 458},
+ {from: 29, to: 459},
+ {from: 29, to: 468},
+ {from: 29, to: 470},
+ {from: 29, to: 471},
+ {from: 29, to: 477},
+ {from: 29, to: 479},
+ {from: 29, to: 515},
+ {from: 29, to: 518},
+ {from: 29, to: 541},
+ {from: 29, to: 620},
+ {from: 29, to: 680},
+ {from: 29, to: 686},
+ {from: 30, to: 60},
+ {from: 30, to: 102},
+ {from: 30, to: 120},
+ {from: 30, to: 186},
+ {from: 30, to: 201},
+ {from: 30, to: 222},
+ {from: 30, to: 228},
+ {from: 30, to: 235},
+ {from: 30, to: 236},
+ {from: 30, to: 305},
+ {from: 30, to: 324},
+ {from: 30, to: 334},
+ {from: 30, to: 353},
+ {from: 30, to: 368},
+ {from: 30, to: 429},
+ {from: 30, to: 489},
+ {from: 30, to: 499},
+ {from: 30, to: 548},
+ {from: 30, to: 552},
+ {from: 30, to: 595},
+ {from: 30, to: 710},
+ {from: 31, to: 96},
+ {from: 31, to: 99},
+ {from: 31, to: 100},
+ {from: 31, to: 105},
+ {from: 31, to: 106},
+ {from: 31, to: 130},
+ {from: 31, to: 153},
+ {from: 31, to: 181},
+ {from: 31, to: 219},
+ {from: 31, to: 234},
+ {from: 31, to: 304},
+ {from: 31, to: 309},
+ {from: 31, to: 366},
+ {from: 31, to: 369},
+ {from: 31, to: 370},
+ {from: 31, to: 457},
+ {from: 31, to: 554},
+ {from: 31, to: 630},
+ {from: 31, to: 672},
+ {from: 31, to: 701},
+ {from: 32, to: 47},
+ {from: 32, to: 170},
+ {from: 32, to: 250},
+ {from: 32, to: 251},
+ {from: 32, to: 253},
+ {from: 32, to: 254},
+ {from: 32, to: 255},
+ {from: 32, to: 356},
+ {from: 32, to: 400},
+ {from: 32, to: 401},
+ {from: 32, to: 402},
+ {from: 32, to: 410},
+ {from: 32, to: 423},
+ {from: 32, to: 545},
+ {from: 32, to: 556},
+ {from: 32, to: 557},
+ {from: 32, to: 558},
+ {from: 32, to: 656},
+ {from: 32, to: 660},
+ {from: 32, to: 674},
+ {from: 32, to: 694},
+ {from: 32, to: 696},
+ {from: 33, to: 50},
+ {from: 33, to: 64},
+ {from: 33, to: 101},
+ {from: 33, to: 111},
+ {from: 33, to: 112},
+ {from: 33, to: 124},
+ {from: 33, to: 132},
+ {from: 33, to: 135},
+ {from: 33, to: 189},
+ {from: 33, to: 207},
+ {from: 33, to: 209},
+ {from: 33, to: 214},
+ {from: 33, to: 223},
+ {from: 33, to: 230},
+ {from: 33, to: 239},
+ {from: 33, to: 245},
+ {from: 33, to: 262},
+ {from: 33, to: 319},
+ {from: 33, to: 320},
+ {from: 33, to: 344},
+ {from: 33, to: 349},
+ {from: 33, to: 354},
+ {from: 33, to: 361},
+ {from: 33, to: 362},
+ {from: 33, to: 368},
+ {from: 33, to: 419},
+ {from: 33, to: 429},
+ {from: 33, to: 445},
+ {from: 33, to: 483},
+ {from: 33, to: 484},
+ {from: 33, to: 489},
+ {from: 33, to: 512},
+ {from: 33, to: 529},
+ {from: 33, to: 569},
+ {from: 33, to: 643},
+ {from: 33, to: 720},
+ {from: 34, to: 49},
+ {from: 34, to: 103},
+ {from: 34, to: 104},
+ {from: 34, to: 169},
+ {from: 34, to: 229},
+ {from: 34, to: 256},
+ {from: 34, to: 267},
+ {from: 34, to: 275},
+ {from: 34, to: 276},
+ {from: 34, to: 295},
+ {from: 34, to: 317},
+ {from: 34, to: 318},
+ {from: 34, to: 355},
+ {from: 34, to: 357},
+ {from: 34, to: 446},
+ {from: 34, to: 509},
+ {from: 34, to: 510},
+ {from: 34, to: 546},
+ {from: 34, to: 564},
+ {from: 34, to: 581},
+ {from: 34, to: 592},
+ {from: 35, to: 36},
+ {from: 35, to: 40},
+ {from: 35, to: 41},
+ {from: 35, to: 66},
+ {from: 35, to: 78},
+ {from: 35, to: 137},
+ {from: 35, to: 192},
+ {from: 35, to: 247},
+ {from: 35, to: 273},
+ {from: 35, to: 284},
+ {from: 35, to: 306},
+ {from: 35, to: 315},
+ {from: 35, to: 380},
+ {from: 35, to: 389},
+ {from: 35, to: 467},
+ {from: 35, to: 495},
+ {from: 35, to: 570},
+ {from: 35, to: 584},
+ {from: 35, to: 598},
+ {from: 35, to: 599},
+ {from: 35, to: 666},
+ {from: 36, to: 40},
+ {from: 36, to: 41},
+ {from: 36, to: 66},
+ {from: 36, to: 78},
+ {from: 36, to: 137},
+ {from: 36, to: 192},
+ {from: 36, to: 247},
+ {from: 36, to: 273},
+ {from: 36, to: 284},
+ {from: 36, to: 306},
+ {from: 36, to: 315},
+ {from: 36, to: 380},
+ {from: 36, to: 389},
+ {from: 36, to: 467},
+ {from: 36, to: 495},
+ {from: 36, to: 570},
+ {from: 36, to: 584},
+ {from: 36, to: 598},
+ {from: 36, to: 599},
+ {from: 36, to: 666},
+ {from: 37, to: 71},
+ {from: 37, to: 83},
+ {from: 37, to: 84},
+ {from: 37, to: 107},
+ {from: 37, to: 113},
+ {from: 37, to: 146},
+ {from: 37, to: 182},
+ {from: 37, to: 210},
+ {from: 37, to: 217},
+ {from: 37, to: 278},
+ {from: 37, to: 321},
+ {from: 37, to: 337},
+ {from: 37, to: 407},
+ {from: 37, to: 420},
+ {from: 37, to: 488},
+ {from: 37, to: 533},
+ {from: 37, to: 545},
+ {from: 37, to: 579},
+ {from: 37, to: 626},
+ {from: 37, to: 627},
+ {from: 37, to: 662},
+ {from: 37, to: 705},
+ {from: 37, to: 722},
+ {from: 38, to: 39},
+ {from: 38, to: 58},
+ {from: 38, to: 121},
+ {from: 38, to: 129},
+ {from: 38, to: 165},
+ {from: 38, to: 166},
+ {from: 38, to: 167},
+ {from: 38, to: 168},
+ {from: 38, to: 185},
+ {from: 38, to: 191},
+ {from: 38, to: 226},
+ {from: 38, to: 240},
+ {from: 38, to: 277},
+ {from: 38, to: 352},
+ {from: 38, to: 359},
+ {from: 38, to: 424},
+ {from: 38, to: 430},
+ {from: 38, to: 461},
+ {from: 38, to: 463},
+ {from: 38, to: 486},
+ {from: 38, to: 517},
+ {from: 38, to: 531},
+ {from: 38, to: 537},
+ {from: 38, to: 607},
+ {from: 38, to: 634},
+ {from: 38, to: 636},
+ {from: 38, to: 711},
+ {from: 39, to: 121},
+ {from: 39, to: 129},
+ {from: 39, to: 165},
+ {from: 39, to: 166},
+ {from: 39, to: 167},
+ {from: 39, to: 168},
+ {from: 39, to: 185},
+ {from: 39, to: 191},
+ {from: 39, to: 226},
+ {from: 39, to: 240},
+ {from: 39, to: 352},
+ {from: 39, to: 359},
+ {from: 39, to: 430},
+ {from: 39, to: 461},
+ {from: 39, to: 463},
+ {from: 39, to: 486},
+ {from: 39, to: 531},
+ {from: 39, to: 607},
+ {from: 39, to: 634},
+ {from: 39, to: 711},
+ {from: 40, to: 41},
+ {from: 40, to: 66},
+ {from: 40, to: 78},
+ {from: 40, to: 137},
+ {from: 40, to: 192},
+ {from: 40, to: 247},
+ {from: 40, to: 273},
+ {from: 40, to: 284},
+ {from: 40, to: 306},
+ {from: 40, to: 315},
+ {from: 40, to: 380},
+ {from: 40, to: 389},
+ {from: 40, to: 467},
+ {from: 40, to: 495},
+ {from: 40, to: 570},
+ {from: 40, to: 584},
+ {from: 40, to: 598},
+ {from: 40, to: 599},
+ {from: 40, to: 666},
+ {from: 41, to: 66},
+ {from: 41, to: 78},
+ {from: 41, to: 137},
+ {from: 41, to: 192},
+ {from: 41, to: 247},
+ {from: 41, to: 273},
+ {from: 41, to: 284},
+ {from: 41, to: 306},
+ {from: 41, to: 315},
+ {from: 41, to: 380},
+ {from: 41, to: 389},
+ {from: 41, to: 467},
+ {from: 41, to: 495},
+ {from: 41, to: 570},
+ {from: 41, to: 584},
+ {from: 41, to: 598},
+ {from: 41, to: 599},
+ {from: 41, to: 666},
+ {from: 42, to: 86},
+ {from: 42, to: 93},
+ {from: 42, to: 131},
+ {from: 42, to: 180},
+ {from: 42, to: 188},
+ {from: 42, to: 202},
+ {from: 42, to: 211},
+ {from: 42, to: 216},
+ {from: 42, to: 277},
+ {from: 42, to: 286},
+ {from: 42, to: 332},
+ {from: 42, to: 333},
+ {from: 42, to: 428},
+ {from: 42, to: 486},
+ {from: 42, to: 511},
+ {from: 42, to: 528},
+ {from: 42, to: 571},
+ {from: 42, to: 580},
+ {from: 42, to: 593},
+ {from: 42, to: 601},
+ {from: 42, to: 618},
+ {from: 42, to: 619},
+ {from: 42, to: 652},
+ {from: 42, to: 703},
+ {from: 42, to: 716},
+ {from: 43, to: 65},
+ {from: 43, to: 118},
+ {from: 43, to: 138},
+ {from: 43, to: 199},
+ {from: 43, to: 220},
+ {from: 43, to: 272},
+ {from: 43, to: 340},
+ {from: 43, to: 346},
+ {from: 43, to: 347},
+ {from: 43, to: 387},
+ {from: 43, to: 404},
+ {from: 43, to: 437},
+ {from: 43, to: 473},
+ {from: 43, to: 503},
+ {from: 43, to: 520},
+ {from: 43, to: 533},
+ {from: 43, to: 590},
+ {from: 43, to: 628},
+ {from: 43, to: 664},
+ {from: 43, to: 670},
+ {from: 43, to: 709},
+ {from: 44, to: 79},
+ {from: 44, to: 82},
+ {from: 44, to: 110},
+ {from: 44, to: 122},
+ {from: 44, to: 151},
+ {from: 44, to: 179},
+ {from: 44, to: 203},
+ {from: 44, to: 227},
+ {from: 44, to: 231},
+ {from: 44, to: 238},
+ {from: 44, to: 327},
+ {from: 44, to: 342},
+ {from: 44, to: 374},
+ {from: 44, to: 385},
+ {from: 44, to: 433},
+ {from: 44, to: 442},
+ {from: 44, to: 454},
+ {from: 44, to: 475},
+ {from: 44, to: 480},
+ {from: 44, to: 498},
+ {from: 44, to: 517},
+ {from: 44, to: 547},
+ {from: 44, to: 573},
+ {from: 44, to: 577},
+ {from: 44, to: 586},
+ {from: 44, to: 611},
+ {from: 44, to: 614},
+ {from: 44, to: 623},
+ {from: 44, to: 627},
+ {from: 44, to: 648},
+ {from: 44, to: 678},
+ {from: 44, to: 687},
+ {from: 44, to: 717},
+ {from: 45, to: 46},
+ {from: 45, to: 58},
+ {from: 45, to: 59},
+ {from: 45, to: 64},
+ {from: 45, to: 123},
+ {from: 45, to: 125},
+ {from: 45, to: 141},
+ {from: 45, to: 237},
+ {from: 45, to: 249},
+ {from: 45, to: 252},
+ {from: 45, to: 291},
+ {from: 45, to: 404},
+ {from: 45, to: 416},
+ {from: 45, to: 422},
+ {from: 45, to: 447},
+ {from: 45, to: 449},
+ {from: 45, to: 452},
+ {from: 45, to: 461},
+ {from: 45, to: 478},
+ {from: 45, to: 481},
+ {from: 45, to: 482},
+ {from: 45, to: 483},
+ {from: 45, to: 565},
+ {from: 45, to: 622},
+ {from: 45, to: 661},
+ {from: 45, to: 675},
+ {from: 46, to: 58},
+ {from: 46, to: 59},
+ {from: 46, to: 64},
+ {from: 46, to: 123},
+ {from: 46, to: 125},
+ {from: 46, to: 141},
+ {from: 46, to: 237},
+ {from: 46, to: 249},
+ {from: 46, to: 252},
+ {from: 46, to: 291},
+ {from: 46, to: 404},
+ {from: 46, to: 416},
+ {from: 46, to: 422},
+ {from: 46, to: 447},
+ {from: 46, to: 449},
+ {from: 46, to: 452},
+ {from: 46, to: 461},
+ {from: 46, to: 478},
+ {from: 46, to: 481},
+ {from: 46, to: 482},
+ {from: 46, to: 483},
+ {from: 46, to: 565},
+ {from: 46, to: 622},
+ {from: 46, to: 661},
+ {from: 46, to: 675},
+ {from: 47, to: 170},
+ {from: 47, to: 250},
+ {from: 47, to: 251},
+ {from: 47, to: 253},
+ {from: 47, to: 254},
+ {from: 47, to: 255},
+ {from: 47, to: 336},
+ {from: 47, to: 356},
+ {from: 47, to: 400},
+ {from: 47, to: 401},
+ {from: 47, to: 402},
+ {from: 47, to: 410},
+ {from: 47, to: 423},
+ {from: 47, to: 545},
+ {from: 47, to: 556},
+ {from: 47, to: 557},
+ {from: 47, to: 558},
+ {from: 47, to: 656},
+ {from: 47, to: 660},
+ {from: 47, to: 674},
+ {from: 47, to: 694},
+ {from: 47, to: 696},
+ {from: 48, to: 51},
+ {from: 48, to: 158},
+ {from: 48, to: 174},
+ {from: 48, to: 243},
+ {from: 48, to: 292},
+ {from: 48, to: 293},
+ {from: 48, to: 439},
+ {from: 48, to: 540},
+ {from: 48, to: 568},
+ {from: 48, to: 640},
+ {from: 48, to: 641},
+ {from: 48, to: 695},
+ {from: 48, to: 704},
+ {from: 48, to: 708},
+ {from: 48, to: 732},
+ {from: 48, to: 733},
+ {from: 49, to: 103},
+ {from: 49, to: 104},
+ {from: 49, to: 169},
+ {from: 49, to: 198},
+ {from: 49, to: 229},
+ {from: 49, to: 256},
+ {from: 49, to: 267},
+ {from: 49, to: 275},
+ {from: 49, to: 276},
+ {from: 49, to: 295},
+ {from: 49, to: 317},
+ {from: 49, to: 318},
+ {from: 49, to: 355},
+ {from: 49, to: 357},
+ {from: 49, to: 446},
+ {from: 49, to: 509},
+ {from: 49, to: 510},
+ {from: 49, to: 546},
+ {from: 49, to: 564},
+ {from: 49, to: 581},
+ {from: 49, to: 592},
+ {from: 49, to: 658},
+ {from: 50, to: 110},
+ {from: 50, to: 111},
+ {from: 50, to: 135},
+ {from: 50, to: 150},
+ {from: 50, to: 154},
+ {from: 50, to: 155},
+ {from: 50, to: 164},
+ {from: 50, to: 227},
+ {from: 50, to: 245},
+ {from: 50, to: 294},
+ {from: 50, to: 316},
+ {from: 50, to: 319},
+ {from: 50, to: 349},
+ {from: 50, to: 368},
+ {from: 50, to: 371},
+ {from: 50, to: 373},
+ {from: 50, to: 397},
+ {from: 50, to: 419},
+ {from: 50, to: 429},
+ {from: 50, to: 489},
+ {from: 50, to: 529},
+ {from: 50, to: 569},
+ {from: 50, to: 572},
+ {from: 50, to: 591},
+ {from: 50, to: 629},
+ {from: 50, to: 643},
+ {from: 50, to: 644},
+ {from: 50, to: 719},
+ {from: 50, to: 720},
+ {from: 51, to: 158},
+ {from: 51, to: 174},
+ {from: 51, to: 243},
+ {from: 51, to: 292},
+ {from: 51, to: 293},
+ {from: 51, to: 439},
+ {from: 51, to: 540},
+ {from: 51, to: 568},
+ {from: 51, to: 640},
+ {from: 51, to: 641},
+ {from: 51, to: 695},
+ {from: 51, to: 704},
+ {from: 51, to: 708},
+ {from: 51, to: 732},
+ {from: 51, to: 733},
+ {from: 52, to: 56},
+ {from: 52, to: 92},
+ {from: 52, to: 98},
+ {from: 52, to: 176},
+ {from: 52, to: 178},
+ {from: 52, to: 197},
+ {from: 52, to: 328},
+ {from: 52, to: 329},
+ {from: 52, to: 351},
+ {from: 52, to: 367},
+ {from: 52, to: 372},
+ {from: 52, to: 426},
+ {from: 52, to: 427},
+ {from: 52, to: 456},
+ {from: 52, to: 464},
+ {from: 52, to: 492},
+ {from: 52, to: 536},
+ {from: 52, to: 549},
+ {from: 52, to: 551},
+ {from: 52, to: 609},
+ {from: 52, to: 615},
+ {from: 52, to: 700},
+ {from: 52, to: 718},
+ {from: 53, to: 67},
+ {from: 53, to: 68},
+ {from: 53, to: 73},
+ {from: 53, to: 183},
+ {from: 53, to: 184},
+ {from: 53, to: 198},
+ {from: 53, to: 204},
+ {from: 53, to: 270},
+ {from: 53, to: 302},
+ {from: 53, to: 312},
+ {from: 53, to: 497},
+ {from: 53, to: 516},
+ {from: 53, to: 524},
+ {from: 53, to: 538},
+ {from: 53, to: 633},
+ {from: 53, to: 635},
+ {from: 53, to: 636},
+ {from: 53, to: 637},
+ {from: 53, to: 684},
+ {from: 53, to: 688},
+ {from: 53, to: 697},
+ {from: 53, to: 736},
+ {from: 54, to: 70},
+ {from: 54, to: 131},
+ {from: 54, to: 202},
+ {from: 54, to: 211},
+ {from: 54, to: 212},
+ {from: 54, to: 216},
+ {from: 54, to: 221},
+ {from: 54, to: 225},
+ {from: 54, to: 261},
+ {from: 54, to: 287},
+ {from: 54, to: 294},
+ {from: 54, to: 319},
+ {from: 54, to: 358},
+ {from: 54, to: 381},
+ {from: 54, to: 419},
+ {from: 54, to: 424},
+ {from: 54, to: 432},
+ {from: 54, to: 443},
+ {from: 54, to: 450},
+ {from: 54, to: 451},
+ {from: 54, to: 462},
+ {from: 54, to: 487},
+ {from: 54, to: 555},
+ {from: 54, to: 571},
+ {from: 54, to: 589},
+ {from: 54, to: 600},
+ {from: 54, to: 608},
+ {from: 54, to: 623},
+ {from: 54, to: 642},
+ {from: 54, to: 644},
+ {from: 54, to: 645},
+ {from: 54, to: 719},
+ {from: 55, to: 142},
+ {from: 55, to: 143},
+ {from: 55, to: 147},
+ {from: 55, to: 157},
+ {from: 55, to: 175},
+ {from: 55, to: 187},
+ {from: 55, to: 263},
+ {from: 55, to: 299},
+ {from: 55, to: 300},
+ {from: 55, to: 301},
+ {from: 55, to: 370},
+ {from: 55, to: 432},
+ {from: 55, to: 444},
+ {from: 55, to: 455},
+ {from: 55, to: 469},
+ {from: 55, to: 514},
+ {from: 55, to: 535},
+ {from: 55, to: 539},
+ {from: 55, to: 542},
+ {from: 55, to: 624},
+ {from: 55, to: 653},
+ {from: 55, to: 669},
+ {from: 55, to: 698},
+ {from: 56, to: 74},
+ {from: 56, to: 140},
+ {from: 56, to: 172},
+ {from: 56, to: 177},
+ {from: 56, to: 179},
+ {from: 56, to: 311},
+ {from: 56, to: 384},
+ {from: 56, to: 386},
+ {from: 56, to: 408},
+ {from: 56, to: 460},
+ {from: 56, to: 522},
+ {from: 56, to: 527},
+ {from: 56, to: 532},
+ {from: 56, to: 612},
+ {from: 56, to: 625},
+ {from: 56, to: 654},
+ {from: 56, to: 667},
+ {from: 56, to: 677},
+ {from: 56, to: 679},
+ {from: 56, to: 685},
+ {from: 56, to: 707},
+ {from: 57, to: 76},
+ {from: 57, to: 87},
+ {from: 57, to: 124},
+ {from: 57, to: 196},
+ {from: 57, to: 271},
+ {from: 57, to: 288},
+ {from: 57, to: 381},
+ {from: 57, to: 409},
+ {from: 57, to: 421},
+ {from: 57, to: 425},
+ {from: 57, to: 440},
+ {from: 57, to: 472},
+ {from: 57, to: 473},
+ {from: 57, to: 508},
+ {from: 57, to: 521},
+ {from: 57, to: 523},
+ {from: 57, to: 543},
+ {from: 57, to: 562},
+ {from: 57, to: 565},
+ {from: 57, to: 589},
+ {from: 57, to: 594},
+ {from: 57, to: 604},
+ {from: 57, to: 615},
+ {from: 57, to: 663},
+ {from: 57, to: 728},
+ {from: 58, to: 59},
+ {from: 58, to: 123},
+ {from: 58, to: 125},
+ {from: 58, to: 141},
+ {from: 58, to: 237},
+ {from: 58, to: 249},
+ {from: 58, to: 252},
+ {from: 58, to: 277},
+ {from: 58, to: 291},
+ {from: 58, to: 416},
+ {from: 58, to: 422},
+ {from: 58, to: 424},
+ {from: 58, to: 447},
+ {from: 58, to: 449},
+ {from: 58, to: 452},
+ {from: 58, to: 478},
+ {from: 58, to: 481},
+ {from: 58, to: 482},
+ {from: 58, to: 517},
+ {from: 58, to: 537},
+ {from: 58, to: 622},
+ {from: 58, to: 636},
+ {from: 58, to: 675},
+ {from: 59, to: 123},
+ {from: 59, to: 125},
+ {from: 59, to: 141},
+ {from: 59, to: 237},
+ {from: 59, to: 249},
+ {from: 59, to: 252},
+ {from: 59, to: 291},
+ {from: 59, to: 416},
+ {from: 59, to: 422},
+ {from: 59, to: 447},
+ {from: 59, to: 449},
+ {from: 59, to: 452},
+ {from: 59, to: 478},
+ {from: 59, to: 481},
+ {from: 59, to: 482},
+ {from: 59, to: 622},
+ {from: 59, to: 675},
+ {from: 59, to: 711},
+ {from: 60, to: 102},
+ {from: 60, to: 116},
+ {from: 60, to: 120},
+ {from: 60, to: 144},
+ {from: 60, to: 150},
+ {from: 60, to: 186},
+ {from: 60, to: 201},
+ {from: 60, to: 222},
+ {from: 60, to: 228},
+ {from: 60, to: 235},
+ {from: 60, to: 236},
+ {from: 60, to: 305},
+ {from: 60, to: 318},
+ {from: 60, to: 324},
+ {from: 60, to: 334},
+ {from: 60, to: 353},
+ {from: 60, to: 368},
+ {from: 60, to: 371},
+ {from: 60, to: 429},
+ {from: 60, to: 460},
+ {from: 60, to: 489},
+ {from: 60, to: 499},
+ {from: 60, to: 528},
+ {from: 60, to: 548},
+ {from: 60, to: 552},
+ {from: 60, to: 562},
+ {from: 60, to: 576},
+ {from: 60, to: 595},
+ {from: 60, to: 606},
+ {from: 60, to: 646},
+ {from: 60, to: 710},
+ {from: 60, to: 713},
+ {from: 61, to: 79},
+ {from: 61, to: 94},
+ {from: 61, to: 133},
+ {from: 61, to: 140},
+ {from: 61, to: 145},
+ {from: 61, to: 149},
+ {from: 61, to: 171},
+ {from: 61, to: 244},
+ {from: 61, to: 314},
+ {from: 61, to: 316},
+ {from: 61, to: 325},
+ {from: 61, to: 327},
+ {from: 61, to: 338},
+ {from: 61, to: 345},
+ {from: 61, to: 350},
+ {from: 61, to: 375},
+ {from: 61, to: 396},
+ {from: 61, to: 417},
+ {from: 61, to: 442},
+ {from: 61, to: 454},
+ {from: 61, to: 455},
+ {from: 61, to: 496},
+ {from: 61, to: 507},
+ {from: 61, to: 534},
+ {from: 61, to: 566},
+ {from: 61, to: 577},
+ {from: 61, to: 606},
+ {from: 61, to: 613},
+ {from: 61, to: 659},
+ {from: 61, to: 673},
+ {from: 61, to: 678},
+ {from: 61, to: 682},
+ {from: 61, to: 687},
+ {from: 61, to: 714},
+ {from: 61, to: 721},
+ {from: 62, to: 90},
+ {from: 62, to: 91},
+ {from: 62, to: 117},
+ {from: 62, to: 126},
+ {from: 62, to: 134},
+ {from: 62, to: 156},
+ {from: 62, to: 213},
+ {from: 62, to: 242},
+ {from: 62, to: 265},
+ {from: 62, to: 326},
+ {from: 62, to: 341},
+ {from: 62, to: 365},
+ {from: 62, to: 375},
+ {from: 62, to: 406},
+ {from: 62, to: 476},
+ {from: 62, to: 502},
+ {from: 62, to: 513},
+ {from: 62, to: 530},
+ {from: 62, to: 544},
+ {from: 62, to: 681},
+ {from: 62, to: 683},
+ {from: 63, to: 89},
+ {from: 63, to: 102},
+ {from: 63, to: 114},
+ {from: 63, to: 127},
+ {from: 63, to: 159},
+ {from: 63, to: 160},
+ {from: 63, to: 161},
+ {from: 63, to: 246},
+ {from: 63, to: 257},
+ {from: 63, to: 264},
+ {from: 63, to: 297},
+ {from: 63, to: 322},
+ {from: 63, to: 398},
+ {from: 63, to: 474},
+ {from: 63, to: 485},
+ {from: 63, to: 553},
+ {from: 63, to: 621},
+ {from: 63, to: 632},
+ {from: 63, to: 638},
+ {from: 63, to: 639},
+ {from: 63, to: 657},
+ {from: 63, to: 671},
+ {from: 63, to: 697},
+ {from: 63, to: 715},
+ {from: 63, to: 726},
+ {from: 64, to: 101},
+ {from: 64, to: 112},
+ {from: 64, to: 124},
+ {from: 64, to: 125},
+ {from: 64, to: 132},
+ {from: 64, to: 189},
+ {from: 64, to: 207},
+ {from: 64, to: 209},
+ {from: 64, to: 214},
+ {from: 64, to: 223},
+ {from: 64, to: 230},
+ {from: 64, to: 239},
+ {from: 64, to: 249},
+ {from: 64, to: 252},
+ {from: 64, to: 262},
+ {from: 64, to: 320},
+ {from: 64, to: 344},
+ {from: 64, to: 354},
+ {from: 64, to: 361},
+ {from: 64, to: 362},
+ {from: 64, to: 404},
+ {from: 64, to: 416},
+ {from: 64, to: 445},
+ {from: 64, to: 461},
+ {from: 64, to: 483},
+ {from: 64, to: 484},
+ {from: 64, to: 512},
+ {from: 64, to: 565},
+ {from: 64, to: 661},
+ {from: 65, to: 118},
+ {from: 65, to: 138},
+ {from: 65, to: 199},
+ {from: 65, to: 220},
+ {from: 65, to: 272},
+ {from: 65, to: 340},
+ {from: 65, to: 346},
+ {from: 65, to: 347},
+ {from: 65, to: 387},
+ {from: 65, to: 404},
+ {from: 65, to: 437},
+ {from: 65, to: 503},
+ {from: 65, to: 520},
+ {from: 65, to: 590},
+ {from: 65, to: 628},
+ {from: 65, to: 664},
+ {from: 65, to: 670},
+ {from: 65, to: 709},
+ {from: 66, to: 78},
+ {from: 66, to: 137},
+ {from: 66, to: 192},
+ {from: 66, to: 247},
+ {from: 66, to: 253},
+ {from: 66, to: 273},
+ {from: 66, to: 284},
+ {from: 66, to: 306},
+ {from: 66, to: 315},
+ {from: 66, to: 380},
+ {from: 66, to: 389},
+ {from: 66, to: 402},
+ {from: 66, to: 467},
+ {from: 66, to: 495},
+ {from: 66, to: 570},
+ {from: 66, to: 584},
+ {from: 66, to: 598},
+ {from: 66, to: 599},
+ {from: 66, to: 666},
+ {from: 67, to: 68},
+ {from: 67, to: 73},
+ {from: 67, to: 183},
+ {from: 67, to: 184},
+ {from: 67, to: 198},
+ {from: 67, to: 204},
+ {from: 67, to: 270},
+ {from: 67, to: 302},
+ {from: 67, to: 312},
+ {from: 67, to: 497},
+ {from: 67, to: 516},
+ {from: 67, to: 524},
+ {from: 67, to: 538},
+ {from: 67, to: 633},
+ {from: 67, to: 635},
+ {from: 67, to: 636},
+ {from: 67, to: 637},
+ {from: 67, to: 684},
+ {from: 67, to: 688},
+ {from: 67, to: 697},
+ {from: 67, to: 736},
+ {from: 68, to: 73},
+ {from: 68, to: 183},
+ {from: 68, to: 184},
+ {from: 68, to: 198},
+ {from: 68, to: 204},
+ {from: 68, to: 242},
+ {from: 68, to: 270},
+ {from: 68, to: 302},
+ {from: 68, to: 312},
+ {from: 68, to: 497},
+ {from: 68, to: 516},
+ {from: 68, to: 524},
+ {from: 68, to: 538},
+ {from: 68, to: 574},
+ {from: 68, to: 633},
+ {from: 68, to: 635},
+ {from: 68, to: 636},
+ {from: 68, to: 637},
+ {from: 68, to: 684},
+ {from: 68, to: 688},
+ {from: 68, to: 697},
+ {from: 68, to: 718},
+ {from: 68, to: 736},
+ {from: 69, to: 82},
+ {from: 69, to: 193},
+ {from: 69, to: 264},
+ {from: 69, to: 281},
+ {from: 69, to: 282},
+ {from: 69, to: 285},
+ {from: 69, to: 337},
+ {from: 69, to: 374},
+ {from: 69, to: 382},
+ {from: 69, to: 387},
+ {from: 69, to: 396},
+ {from: 69, to: 438},
+ {from: 69, to: 441},
+ {from: 69, to: 465},
+ {from: 69, to: 466},
+ {from: 69, to: 491},
+ {from: 69, to: 633},
+ {from: 69, to: 646},
+ {from: 69, to: 647},
+ {from: 69, to: 650},
+ {from: 69, to: 651},
+ {from: 69, to: 689},
+ {from: 69, to: 724},
+ {from: 69, to: 725},
+ {from: 69, to: 729},
+ {from: 69, to: 730},
+ {from: 69, to: 734},
+ {from: 69, to: 735},
+ {from: 70, to: 202},
+ {from: 70, to: 211},
+ {from: 70, to: 212},
+ {from: 70, to: 214},
+ {from: 70, to: 221},
+ {from: 70, to: 225},
+ {from: 70, to: 261},
+ {from: 70, to: 287},
+ {from: 70, to: 319},
+ {from: 70, to: 358},
+ {from: 70, to: 419},
+ {from: 70, to: 424},
+ {from: 70, to: 450},
+ {from: 70, to: 451},
+ {from: 70, to: 462},
+ {from: 70, to: 487},
+ {from: 70, to: 555},
+ {from: 70, to: 600},
+ {from: 70, to: 608},
+ {from: 70, to: 642},
+ {from: 70, to: 645},
+ {from: 71, to: 83},
+ {from: 71, to: 84},
+ {from: 71, to: 107},
+ {from: 71, to: 113},
+ {from: 71, to: 146},
+ {from: 71, to: 159},
+ {from: 71, to: 182},
+ {from: 71, to: 210},
+ {from: 71, to: 217},
+ {from: 71, to: 226},
+ {from: 71, to: 278},
+ {from: 71, to: 302},
+ {from: 71, to: 321},
+ {from: 71, to: 337},
+ {from: 71, to: 407},
+ {from: 71, to: 420},
+ {from: 71, to: 488},
+ {from: 71, to: 533},
+ {from: 71, to: 579},
+ {from: 71, to: 626},
+ {from: 71, to: 627},
+ {from: 71, to: 662},
+ {from: 71, to: 705},
+ {from: 71, to: 714},
+ {from: 72, to: 75},
+ {from: 72, to: 115},
+ {from: 72, to: 190},
+ {from: 72, to: 194},
+ {from: 72, to: 200},
+ {from: 72, to: 259},
+ {from: 72, to: 342},
+ {from: 72, to: 363},
+ {from: 72, to: 379},
+ {from: 72, to: 383},
+ {from: 72, to: 403},
+ {from: 72, to: 500},
+ {from: 72, to: 505},
+ {from: 72, to: 537},
+ {from: 72, to: 574},
+ {from: 72, to: 587},
+ {from: 72, to: 597},
+ {from: 72, to: 649},
+ {from: 72, to: 691},
+ {from: 72, to: 702},
+ {from: 72, to: 706},
+ {from: 73, to: 183},
+ {from: 73, to: 184},
+ {from: 73, to: 198},
+ {from: 73, to: 204},
+ {from: 73, to: 270},
+ {from: 73, to: 302},
+ {from: 73, to: 312},
+ {from: 73, to: 497},
+ {from: 73, to: 516},
+ {from: 73, to: 524},
+ {from: 73, to: 538},
+ {from: 73, to: 633},
+ {from: 73, to: 635},
+ {from: 73, to: 636},
+ {from: 73, to: 637},
+ {from: 73, to: 684},
+ {from: 73, to: 688},
+ {from: 73, to: 697},
+ {from: 73, to: 736},
+ {from: 74, to: 140},
+ {from: 74, to: 172},
+ {from: 74, to: 177},
+ {from: 74, to: 179},
+ {from: 74, to: 289},
+ {from: 74, to: 311},
+ {from: 74, to: 384},
+ {from: 74, to: 386},
+ {from: 74, to: 408},
+ {from: 74, to: 428},
+ {from: 74, to: 460},
+ {from: 74, to: 522},
+ {from: 74, to: 527},
+ {from: 74, to: 532},
+ {from: 74, to: 540},
+ {from: 74, to: 612},
+ {from: 74, to: 625},
+ {from: 74, to: 654},
+ {from: 74, to: 667},
+ {from: 74, to: 677},
+ {from: 74, to: 679},
+ {from: 74, to: 685},
+ {from: 74, to: 704},
+ {from: 74, to: 707},
+ {from: 74, to: 732},
+ {from: 75, to: 115},
+ {from: 75, to: 190},
+ {from: 75, to: 194},
+ {from: 75, to: 200},
+ {from: 75, to: 259},
+ {from: 75, to: 342},
+ {from: 75, to: 363},
+ {from: 75, to: 379},
+ {from: 75, to: 383},
+ {from: 75, to: 403},
+ {from: 75, to: 500},
+ {from: 75, to: 505},
+ {from: 75, to: 537},
+ {from: 75, to: 574},
+ {from: 75, to: 587},
+ {from: 75, to: 597},
+ {from: 75, to: 649},
+ {from: 75, to: 691},
+ {from: 75, to: 702},
+ {from: 75, to: 706},
+ {from: 76, to: 87},
+ {from: 76, to: 196},
+ {from: 76, to: 288},
+ {from: 76, to: 303},
+ {from: 76, to: 381},
+ {from: 76, to: 409},
+ {from: 76, to: 421},
+ {from: 76, to: 425},
+ {from: 76, to: 433},
+ {from: 76, to: 440},
+ {from: 76, to: 472},
+ {from: 76, to: 473},
+ {from: 76, to: 498},
+ {from: 76, to: 508},
+ {from: 76, to: 521},
+ {from: 76, to: 523},
+ {from: 76, to: 543},
+ {from: 76, to: 562},
+ {from: 76, to: 565},
+ {from: 76, to: 573},
+ {from: 76, to: 589},
+ {from: 76, to: 594},
+ {from: 76, to: 604},
+ {from: 76, to: 629},
+ {from: 76, to: 663},
+ {from: 76, to: 679},
+ {from: 76, to: 728},
+ {from: 77, to: 81},
+ {from: 77, to: 148},
+ {from: 77, to: 208},
+ {from: 77, to: 298},
+ {from: 77, to: 307},
+ {from: 77, to: 310},
+ {from: 77, to: 313},
+ {from: 77, to: 458},
+ {from: 77, to: 459},
+ {from: 77, to: 468},
+ {from: 77, to: 470},
+ {from: 77, to: 471},
+ {from: 77, to: 477},
+ {from: 77, to: 479},
+ {from: 77, to: 515},
+ {from: 77, to: 518},
+ {from: 77, to: 541},
+ {from: 77, to: 620},
+ {from: 77, to: 680},
+ {from: 77, to: 686},
+ {from: 78, to: 137},
+ {from: 78, to: 192},
+ {from: 78, to: 247},
+ {from: 78, to: 273},
+ {from: 78, to: 284},
+ {from: 78, to: 306},
+ {from: 78, to: 315},
+ {from: 78, to: 380},
+ {from: 78, to: 389},
+ {from: 78, to: 467},
+ {from: 78, to: 495},
+ {from: 78, to: 570},
+ {from: 78, to: 584},
+ {from: 78, to: 598},
+ {from: 78, to: 599},
+ {from: 78, to: 666},
+ {from: 79, to: 82},
+ {from: 79, to: 122},
+ {from: 79, to: 140},
+ {from: 79, to: 145},
+ {from: 79, to: 203},
+ {from: 79, to: 316},
+ {from: 79, to: 327},
+ {from: 79, to: 374},
+ {from: 79, to: 375},
+ {from: 79, to: 385},
+ {from: 79, to: 433},
+ {from: 79, to: 442},
+ {from: 79, to: 454},
+ {from: 79, to: 455},
+ {from: 79, to: 475},
+ {from: 79, to: 480},
+ {from: 79, to: 498},
+ {from: 79, to: 517},
+ {from: 79, to: 573},
+ {from: 79, to: 577},
+ {from: 79, to: 611},
+ {from: 79, to: 614},
+ {from: 79, to: 623},
+ {from: 79, to: 648},
+ {from: 79, to: 678},
+ {from: 79, to: 687},
+ {from: 79, to: 721},
+ {from: 80, to: 116},
+ {from: 80, to: 139},
+ {from: 80, to: 144},
+ {from: 80, to: 167},
+ {from: 80, to: 231},
+ {from: 80, to: 232},
+ {from: 80, to: 238},
+ {from: 80, to: 258},
+ {from: 80, to: 303},
+ {from: 80, to: 308},
+ {from: 80, to: 335},
+ {from: 80, to: 348},
+ {from: 80, to: 415},
+ {from: 80, to: 434},
+ {from: 80, to: 575},
+ {from: 80, to: 576},
+ {from: 80, to: 583},
+ {from: 80, to: 603},
+ {from: 80, to: 616},
+ {from: 80, to: 668},
+ {from: 80, to: 713},
+ {from: 81, to: 148},
+ {from: 81, to: 208},
+ {from: 81, to: 298},
+ {from: 81, to: 307},
+ {from: 81, to: 310},
+ {from: 81, to: 313},
+ {from: 81, to: 458},
+ {from: 81, to: 459},
+ {from: 81, to: 468},
+ {from: 81, to: 470},
+ {from: 81, to: 471},
+ {from: 81, to: 474},
+ {from: 81, to: 477},
+ {from: 81, to: 479},
+ {from: 81, to: 515},
+ {from: 81, to: 518},
+ {from: 81, to: 541},
+ {from: 81, to: 620},
+ {from: 81, to: 680},
+ {from: 81, to: 686},
+ {from: 82, to: 122},
+ {from: 82, to: 203},
+ {from: 82, to: 327},
+ {from: 82, to: 337},
+ {from: 82, to: 374},
+ {from: 82, to: 385},
+ {from: 82, to: 387},
+ {from: 82, to: 396},
+ {from: 82, to: 433},
+ {from: 82, to: 442},
+ {from: 82, to: 454},
+ {from: 82, to: 475},
+ {from: 82, to: 480},
+ {from: 82, to: 498},
+ {from: 82, to: 517},
+ {from: 82, to: 573},
+ {from: 82, to: 577},
+ {from: 82, to: 611},
+ {from: 82, to: 614},
+ {from: 82, to: 623},
+ {from: 82, to: 633},
+ {from: 82, to: 648},
+ {from: 82, to: 678},
+ {from: 82, to: 687},
+ {from: 83, to: 84},
+ {from: 83, to: 107},
+ {from: 83, to: 113},
+ {from: 83, to: 146},
+ {from: 83, to: 182},
+ {from: 83, to: 210},
+ {from: 83, to: 217},
+ {from: 83, to: 278},
+ {from: 83, to: 321},
+ {from: 83, to: 337},
+ {from: 83, to: 407},
+ {from: 83, to: 420},
+ {from: 83, to: 488},
+ {from: 83, to: 533},
+ {from: 83, to: 579},
+ {from: 83, to: 626},
+ {from: 83, to: 627},
+ {from: 83, to: 662},
+ {from: 83, to: 705},
+ {from: 84, to: 107},
+ {from: 84, to: 113},
+ {from: 84, to: 146},
+ {from: 84, to: 182},
+ {from: 84, to: 210},
+ {from: 84, to: 217},
+ {from: 84, to: 278},
+ {from: 84, to: 321},
+ {from: 84, to: 337},
+ {from: 84, to: 407},
+ {from: 84, to: 420},
+ {from: 84, to: 488},
+ {from: 84, to: 533},
+ {from: 84, to: 579},
+ {from: 84, to: 626},
+ {from: 84, to: 627},
+ {from: 84, to: 662},
+ {from: 84, to: 705},
+ {from: 84, to: 731},
+ {from: 85, to: 135},
+ {from: 85, to: 145},
+ {from: 85, to: 147},
+ {from: 85, to: 151},
+ {from: 85, to: 187},
+ {from: 85, to: 224},
+ {from: 85, to: 233},
+ {from: 85, to: 279},
+ {from: 85, to: 280},
+ {from: 85, to: 289},
+ {from: 85, to: 323},
+ {from: 85, to: 331},
+ {from: 85, to: 376},
+ {from: 85, to: 431},
+ {from: 85, to: 436},
+ {from: 85, to: 443},
+ {from: 85, to: 490},
+ {from: 85, to: 529},
+ {from: 85, to: 547},
+ {from: 85, to: 567},
+ {from: 85, to: 586},
+ {from: 85, to: 676},
+ {from: 85, to: 699},
+ {from: 85, to: 717},
+ {from: 86, to: 93},
+ {from: 86, to: 99},
+ {from: 86, to: 131},
+ {from: 86, to: 180},
+ {from: 86, to: 188},
+ {from: 86, to: 216},
+ {from: 86, to: 277},
+ {from: 86, to: 286},
+ {from: 86, to: 300},
+ {from: 86, to: 332},
+ {from: 86, to: 333},
+ {from: 86, to: 428},
+ {from: 86, to: 511},
+ {from: 86, to: 528},
+ {from: 86, to: 571},
+ {from: 86, to: 580},
+ {from: 86, to: 593},
+ {from: 86, to: 601},
+ {from: 86, to: 618},
+ {from: 86, to: 619},
+ {from: 86, to: 652},
+ {from: 86, to: 662},
+ {from: 86, to: 703},
+ {from: 86, to: 716},
+ {from: 87, to: 185},
+ {from: 87, to: 196},
+ {from: 87, to: 212},
+ {from: 87, to: 288},
+ {from: 87, to: 381},
+ {from: 87, to: 409},
+ {from: 87, to: 421},
+ {from: 87, to: 425},
+ {from: 87, to: 440},
+ {from: 87, to: 449},
+ {from: 87, to: 472},
+ {from: 87, to: 473},
+ {from: 87, to: 490},
+ {from: 87, to: 508},
+ {from: 87, to: 521},
+ {from: 87, to: 523},
+ {from: 87, to: 543},
+ {from: 87, to: 562},
+ {from: 87, to: 565},
+ {from: 87, to: 589},
+ {from: 87, to: 594},
+ {from: 87, to: 604},
+ {from: 87, to: 622},
+ {from: 87, to: 663},
+ {from: 87, to: 675},
+ {from: 87, to: 676},
+ {from: 87, to: 728},
+ {from: 88, to: 162},
+ {from: 88, to: 177},
+ {from: 88, to: 215},
+ {from: 88, to: 218},
+ {from: 88, to: 221},
+ {from: 88, to: 241},
+ {from: 88, to: 260},
+ {from: 88, to: 261},
+ {from: 88, to: 266},
+ {from: 88, to: 271},
+ {from: 88, to: 279},
+ {from: 88, to: 339},
+ {from: 88, to: 364},
+ {from: 88, to: 366},
+ {from: 88, to: 422},
+ {from: 88, to: 453},
+ {from: 88, to: 504},
+ {from: 88, to: 572},
+ {from: 88, to: 578},
+ {from: 88, to: 591},
+ {from: 88, to: 596},
+ {from: 88, to: 602},
+ {from: 88, to: 610},
+ {from: 88, to: 661},
+ {from: 88, to: 665},
+ {from: 88, to: 690},
+ {from: 88, to: 692},
+ {from: 88, to: 693},
+ {from: 88, to: 721},
+ {from: 88, to: 723},
+ {from: 89, to: 114},
+ {from: 89, to: 127},
+ {from: 89, to: 159},
+ {from: 89, to: 160},
+ {from: 89, to: 161},
+ {from: 89, to: 246},
+ {from: 89, to: 257},
+ {from: 89, to: 297},
+ {from: 89, to: 322},
+ {from: 89, to: 398},
+ {from: 89, to: 474},
+ {from: 89, to: 485},
+ {from: 89, to: 553},
+ {from: 89, to: 621},
+ {from: 89, to: 632},
+ {from: 89, to: 638},
+ {from: 89, to: 639},
+ {from: 89, to: 657},
+ {from: 89, to: 671},
+ {from: 89, to: 715},
+ {from: 89, to: 726},
+ {from: 90, to: 91},
+ {from: 90, to: 117},
+ {from: 90, to: 126},
+ {from: 90, to: 134},
+ {from: 90, to: 156},
+ {from: 90, to: 213},
+ {from: 90, to: 242},
+ {from: 90, to: 265},
+ {from: 90, to: 326},
+ {from: 90, to: 341},
+ {from: 90, to: 365},
+ {from: 90, to: 375},
+ {from: 90, to: 406},
+ {from: 90, to: 476},
+ {from: 90, to: 502},
+ {from: 90, to: 513},
+ {from: 90, to: 530},
+ {from: 90, to: 544},
+ {from: 90, to: 549},
+ {from: 90, to: 681},
+ {from: 90, to: 683},
+ {from: 91, to: 117},
+ {from: 91, to: 126},
+ {from: 91, to: 134},
+ {from: 91, to: 156},
+ {from: 91, to: 213},
+ {from: 91, to: 242},
+ {from: 91, to: 265},
+ {from: 91, to: 326},
+ {from: 91, to: 341},
+ {from: 91, to: 365},
+ {from: 91, to: 375},
+ {from: 91, to: 406},
+ {from: 91, to: 476},
+ {from: 91, to: 502},
+ {from: 91, to: 513},
+ {from: 91, to: 530},
+ {from: 91, to: 544},
+ {from: 91, to: 613},
+ {from: 91, to: 681},
+ {from: 91, to: 683},
+ {from: 92, to: 98},
+ {from: 92, to: 176},
+ {from: 92, to: 178},
+ {from: 92, to: 197},
+ {from: 92, to: 328},
+ {from: 92, to: 329},
+ {from: 92, to: 351},
+ {from: 92, to: 367},
+ {from: 92, to: 372},
+ {from: 92, to: 426},
+ {from: 92, to: 427},
+ {from: 92, to: 456},
+ {from: 92, to: 464},
+ {from: 92, to: 492},
+ {from: 92, to: 536},
+ {from: 92, to: 549},
+ {from: 92, to: 551},
+ {from: 92, to: 609},
+ {from: 92, to: 615},
+ {from: 92, to: 700},
+ {from: 92, to: 718},
+ {from: 93, to: 131},
+ {from: 93, to: 171},
+ {from: 93, to: 180},
+ {from: 93, to: 188},
+ {from: 93, to: 200},
+ {from: 93, to: 216},
+ {from: 93, to: 277},
+ {from: 93, to: 286},
+ {from: 93, to: 332},
+ {from: 93, to: 333},
+ {from: 93, to: 428},
+ {from: 93, to: 511},
+ {from: 93, to: 528},
+ {from: 93, to: 571},
+ {from: 93, to: 579},
+ {from: 93, to: 580},
+ {from: 93, to: 593},
+ {from: 93, to: 601},
+ {from: 93, to: 618},
+ {from: 93, to: 619},
+ {from: 93, to: 652},
+ {from: 93, to: 703},
+ {from: 93, to: 716},
+ {from: 94, to: 133},
+ {from: 94, to: 149},
+ {from: 94, to: 171},
+ {from: 94, to: 244},
+ {from: 94, to: 314},
+ {from: 94, to: 325},
+ {from: 94, to: 338},
+ {from: 94, to: 345},
+ {from: 94, to: 350},
+ {from: 94, to: 396},
+ {from: 94, to: 417},
+ {from: 94, to: 496},
+ {from: 94, to: 507},
+ {from: 94, to: 534},
+ {from: 94, to: 566},
+ {from: 94, to: 606},
+ {from: 94, to: 613},
+ {from: 94, to: 659},
+ {from: 94, to: 673},
+ {from: 94, to: 682},
+ {from: 94, to: 714},
+ {from: 95, to: 109},
+ {from: 95, to: 119},
+ {from: 95, to: 128},
+ {from: 95, to: 136},
+ {from: 95, to: 152},
+ {from: 95, to: 163},
+ {from: 95, to: 206},
+ {from: 95, to: 244},
+ {from: 95, to: 248},
+ {from: 95, to: 336},
+ {from: 95, to: 343},
+ {from: 95, to: 360},
+ {from: 95, to: 378},
+ {from: 95, to: 388},
+ {from: 95, to: 448},
+ {from: 95, to: 496},
+ {from: 95, to: 501},
+ {from: 95, to: 506},
+ {from: 95, to: 550},
+ {from: 95, to: 563},
+ {from: 95, to: 588},
+ {from: 95, to: 617},
+ {from: 95, to: 630},
+ {from: 95, to: 712},
+ {from: 95, to: 727},
+ {from: 96, to: 99},
+ {from: 96, to: 100},
+ {from: 96, to: 105},
+ {from: 96, to: 106},
+ {from: 96, to: 130},
+ {from: 96, to: 153},
+ {from: 96, to: 181},
+ {from: 96, to: 186},
+ {from: 96, to: 219},
+ {from: 96, to: 234},
+ {from: 96, to: 304},
+ {from: 96, to: 309},
+ {from: 96, to: 366},
+ {from: 96, to: 369},
+ {from: 96, to: 370},
+ {from: 96, to: 457},
+ {from: 96, to: 554},
+ {from: 96, to: 630},
+ {from: 96, to: 672},
+ {from: 96, to: 701},
+ {from: 97, to: 108},
+ {from: 97, to: 173},
+ {from: 97, to: 195},
+ {from: 97, to: 205},
+ {from: 97, to: 218},
+ {from: 97, to: 274},
+ {from: 97, to: 296},
+ {from: 97, to: 418},
+ {from: 97, to: 435},
+ {from: 97, to: 437},
+ {from: 97, to: 493},
+ {from: 97, to: 494},
+ {from: 97, to: 519},
+ {from: 97, to: 525},
+ {from: 97, to: 526},
+ {from: 97, to: 582},
+ {from: 97, to: 585},
+ {from: 97, to: 605},
+ {from: 97, to: 631},
+ {from: 97, to: 655},
+ {from: 97, to: 722},
+ {from: 98, to: 176},
+ {from: 98, to: 178},
+ {from: 98, to: 197},
+ {from: 98, to: 328},
+ {from: 98, to: 329},
+ {from: 98, to: 351},
+ {from: 98, to: 367},
+ {from: 98, to: 372},
+ {from: 98, to: 426},
+ {from: 98, to: 427},
+ {from: 98, to: 456},
+ {from: 98, to: 464},
+ {from: 98, to: 492},
+ {from: 98, to: 536},
+ {from: 98, to: 549},
+ {from: 98, to: 551},
+ {from: 98, to: 609},
+ {from: 98, to: 615},
+ {from: 98, to: 700},
+ {from: 98, to: 718},
+ {from: 99, to: 100},
+ {from: 99, to: 105},
+ {from: 99, to: 106},
+ {from: 99, to: 130},
+ {from: 99, to: 153},
+ {from: 99, to: 181},
+ {from: 99, to: 219},
+ {from: 99, to: 234},
+ {from: 99, to: 300},
+ {from: 99, to: 304},
+ {from: 99, to: 309},
+ {from: 99, to: 366},
+ {from: 99, to: 369},
+ {from: 99, to: 370},
+ {from: 99, to: 457},
+ {from: 99, to: 554},
+ {from: 99, to: 630},
+ {from: 99, to: 662},
+ {from: 99, to: 672},
+ {from: 99, to: 701},
+ {from: 100, to: 105},
+ {from: 100, to: 106},
+ {from: 100, to: 130},
+ {from: 100, to: 153},
+ {from: 100, to: 181},
+ {from: 100, to: 219},
+ {from: 100, to: 234},
+ {from: 100, to: 304},
+ {from: 100, to: 309},
+ {from: 100, to: 366},
+ {from: 100, to: 369},
+ {from: 100, to: 370},
+ {from: 100, to: 457},
+ {from: 100, to: 554},
+ {from: 100, to: 630},
+ {from: 100, to: 672},
+ {from: 100, to: 701},
+ {from: 101, to: 112},
+ {from: 101, to: 124},
+ {from: 101, to: 132},
+ {from: 101, to: 189},
+ {from: 101, to: 207},
+ {from: 101, to: 209},
+ {from: 101, to: 214},
+ {from: 101, to: 223},
+ {from: 101, to: 230},
+ {from: 101, to: 239},
+ {from: 101, to: 262},
+ {from: 101, to: 320},
+ {from: 101, to: 344},
+ {from: 101, to: 354},
+ {from: 101, to: 361},
+ {from: 101, to: 362},
+ {from: 101, to: 445},
+ {from: 101, to: 457},
+ {from: 101, to: 483},
+ {from: 101, to: 484},
+ {from: 101, to: 512},
+ {from: 102, to: 120},
+ {from: 102, to: 186},
+ {from: 102, to: 201},
+ {from: 102, to: 222},
+ {from: 102, to: 228},
+ {from: 102, to: 235},
+ {from: 102, to: 236},
+ {from: 102, to: 264},
+ {from: 102, to: 305},
+ {from: 102, to: 324},
+ {from: 102, to: 334},
+ {from: 102, to: 353},
+ {from: 102, to: 368},
+ {from: 102, to: 429},
+ {from: 102, to: 489},
+ {from: 102, to: 499},
+ {from: 102, to: 548},
+ {from: 102, to: 552},
+ {from: 102, to: 595},
+ {from: 102, to: 697},
+ {from: 102, to: 710},
+ {from: 103, to: 104},
+ {from: 103, to: 169},
+ {from: 103, to: 229},
+ {from: 103, to: 256},
+ {from: 103, to: 267},
+ {from: 103, to: 275},
+ {from: 103, to: 276},
+ {from: 103, to: 295},
+ {from: 103, to: 317},
+ {from: 103, to: 318},
+ {from: 103, to: 355},
+ {from: 103, to: 357},
+ {from: 103, to: 446},
+ {from: 103, to: 509},
+ {from: 103, to: 510},
+ {from: 103, to: 546},
+ {from: 103, to: 564},
+ {from: 103, to: 581},
+ {from: 103, to: 592},
+ {from: 104, to: 169},
+ {from: 104, to: 229},
+ {from: 104, to: 256},
+ {from: 104, to: 267},
+ {from: 104, to: 275},
+ {from: 104, to: 276},
+ {from: 104, to: 295},
+ {from: 104, to: 317},
+ {from: 104, to: 318},
+ {from: 104, to: 355},
+ {from: 104, to: 357},
+ {from: 104, to: 446},
+ {from: 104, to: 509},
+ {from: 104, to: 510},
+ {from: 104, to: 546},
+ {from: 104, to: 564},
+ {from: 104, to: 581},
+ {from: 104, to: 592},
+ {from: 105, to: 106},
+ {from: 105, to: 130},
+ {from: 105, to: 153},
+ {from: 105, to: 181},
+ {from: 105, to: 219},
+ {from: 105, to: 234},
+ {from: 105, to: 304},
+ {from: 105, to: 309},
+ {from: 105, to: 366},
+ {from: 105, to: 369},
+ {from: 105, to: 370},
+ {from: 105, to: 457},
+ {from: 105, to: 554},
+ {from: 105, to: 630},
+ {from: 105, to: 672},
+ {from: 105, to: 701},
+ {from: 106, to: 130},
+ {from: 106, to: 153},
+ {from: 106, to: 181},
+ {from: 106, to: 219},
+ {from: 106, to: 234},
+ {from: 106, to: 304},
+ {from: 106, to: 309},
+ {from: 106, to: 366},
+ {from: 106, to: 369},
+ {from: 106, to: 370},
+ {from: 106, to: 457},
+ {from: 106, to: 554},
+ {from: 106, to: 630},
+ {from: 106, to: 672},
+ {from: 106, to: 701},
+ {from: 107, to: 113},
+ {from: 107, to: 146},
+ {from: 107, to: 182},
+ {from: 107, to: 210},
+ {from: 107, to: 217},
+ {from: 107, to: 278},
+ {from: 107, to: 321},
+ {from: 107, to: 337},
+ {from: 107, to: 407},
+ {from: 107, to: 420},
+ {from: 107, to: 488},
+ {from: 107, to: 533},
+ {from: 107, to: 579},
+ {from: 107, to: 626},
+ {from: 107, to: 627},
+ {from: 107, to: 662},
+ {from: 107, to: 705},
+ {from: 108, to: 173},
+ {from: 108, to: 195},
+ {from: 108, to: 205},
+ {from: 108, to: 218},
+ {from: 108, to: 274},
+ {from: 108, to: 296},
+ {from: 108, to: 418},
+ {from: 108, to: 435},
+ {from: 108, to: 493},
+ {from: 108, to: 494},
+ {from: 108, to: 519},
+ {from: 108, to: 525},
+ {from: 108, to: 526},
+ {from: 108, to: 582},
+ {from: 108, to: 585},
+ {from: 108, to: 605},
+ {from: 108, to: 631},
+ {from: 108, to: 655},
+ {from: 108, to: 722},
+ {from: 109, to: 119},
+ {from: 109, to: 128},
+ {from: 109, to: 136},
+ {from: 109, to: 152},
+ {from: 109, to: 163},
+ {from: 109, to: 206},
+ {from: 109, to: 248},
+ {from: 109, to: 336},
+ {from: 109, to: 343},
+ {from: 109, to: 360},
+ {from: 109, to: 378},
+ {from: 109, to: 388},
+ {from: 109, to: 448},
+ {from: 109, to: 501},
+ {from: 109, to: 506},
+ {from: 109, to: 550},
+ {from: 109, to: 563},
+ {from: 109, to: 588},
+ {from: 109, to: 617},
+ {from: 109, to: 712},
+ {from: 109, to: 727},
+ {from: 110, to: 111},
+ {from: 110, to: 150},
+ {from: 110, to: 151},
+ {from: 110, to: 154},
+ {from: 110, to: 155},
+ {from: 110, to: 164},
+ {from: 110, to: 179},
+ {from: 110, to: 227},
+ {from: 110, to: 231},
+ {from: 110, to: 238},
+ {from: 110, to: 245},
+ {from: 110, to: 294},
+ {from: 110, to: 316},
+ {from: 110, to: 342},
+ {from: 110, to: 349},
+ {from: 110, to: 371},
+ {from: 110, to: 373},
+ {from: 110, to: 397},
+ {from: 110, to: 547},
+ {from: 110, to: 569},
+ {from: 110, to: 572},
+ {from: 110, to: 586},
+ {from: 110, to: 591},
+ {from: 110, to: 627},
+ {from: 110, to: 629},
+ {from: 110, to: 643},
+ {from: 110, to: 644},
+ {from: 110, to: 717},
+ {from: 110, to: 719},
+ {from: 110, to: 720},
+ {from: 111, to: 135},
+ {from: 111, to: 150},
+ {from: 111, to: 154},
+ {from: 111, to: 155},
+ {from: 111, to: 164},
+ {from: 111, to: 227},
+ {from: 111, to: 245},
+ {from: 111, to: 294},
+ {from: 111, to: 316},
+ {from: 111, to: 319},
+ {from: 111, to: 349},
+ {from: 111, to: 368},
+ {from: 111, to: 371},
+ {from: 111, to: 373},
+ {from: 111, to: 397},
+ {from: 111, to: 419},
+ {from: 111, to: 429},
+ {from: 111, to: 489},
+ {from: 111, to: 529},
+ {from: 111, to: 569},
+ {from: 111, to: 572},
+ {from: 111, to: 591},
+ {from: 111, to: 629},
+ {from: 111, to: 643},
+ {from: 111, to: 644},
+ {from: 111, to: 719},
+ {from: 111, to: 720},
+ {from: 112, to: 124},
+ {from: 112, to: 132},
+ {from: 112, to: 189},
+ {from: 112, to: 207},
+ {from: 112, to: 209},
+ {from: 112, to: 214},
+ {from: 112, to: 223},
+ {from: 112, to: 230},
+ {from: 112, to: 239},
+ {from: 112, to: 262},
+ {from: 112, to: 320},
+ {from: 112, to: 344},
+ {from: 112, to: 354},
+ {from: 112, to: 361},
+ {from: 112, to: 362},
+ {from: 112, to: 445},
+ {from: 112, to: 483},
+ {from: 112, to: 484},
+ {from: 112, to: 512},
+ {from: 113, to: 146},
+ {from: 113, to: 182},
+ {from: 113, to: 210},
+ {from: 113, to: 217},
+ {from: 113, to: 278},
+ {from: 113, to: 321},
+ {from: 113, to: 337},
+ {from: 113, to: 407},
+ {from: 113, to: 420},
+ {from: 113, to: 488},
+ {from: 113, to: 533},
+ {from: 113, to: 579},
+ {from: 113, to: 626},
+ {from: 113, to: 627},
+ {from: 113, to: 662},
+ {from: 113, to: 674},
+ {from: 113, to: 705},
+ {from: 114, to: 127},
+ {from: 114, to: 159},
+ {from: 114, to: 160},
+ {from: 114, to: 161},
+ {from: 114, to: 246},
+ {from: 114, to: 257},
+ {from: 114, to: 297},
+ {from: 114, to: 322},
+ {from: 114, to: 398},
+ {from: 114, to: 421},
+ {from: 114, to: 472},
+ {from: 114, to: 474},
+ {from: 114, to: 485},
+ {from: 114, to: 523},
+ {from: 114, to: 553},
+ {from: 114, to: 621},
+ {from: 114, to: 632},
+ {from: 114, to: 638},
+ {from: 114, to: 639},
+ {from: 114, to: 649},
+ {from: 114, to: 657},
+ {from: 114, to: 671},
+ {from: 114, to: 682},
+ {from: 114, to: 715},
+ {from: 114, to: 726},
+ {from: 115, to: 190},
+ {from: 115, to: 194},
+ {from: 115, to: 200},
+ {from: 115, to: 259},
+ {from: 115, to: 342},
+ {from: 115, to: 363},
+ {from: 115, to: 379},
+ {from: 115, to: 383},
+ {from: 115, to: 403},
+ {from: 115, to: 500},
+ {from: 115, to: 505},
+ {from: 115, to: 537},
+ {from: 115, to: 574},
+ {from: 115, to: 587},
+ {from: 115, to: 597},
+ {from: 115, to: 649},
+ {from: 115, to: 691},
+ {from: 115, to: 702},
+ {from: 115, to: 706},
+ {from: 116, to: 139},
+ {from: 116, to: 144},
+ {from: 116, to: 150},
+ {from: 116, to: 231},
+ {from: 116, to: 232},
+ {from: 116, to: 238},
+ {from: 116, to: 258},
+ {from: 116, to: 303},
+ {from: 116, to: 308},
+ {from: 116, to: 318},
+ {from: 116, to: 335},
+ {from: 116, to: 348},
+ {from: 116, to: 371},
+ {from: 116, to: 415},
+ {from: 116, to: 434},
+ {from: 116, to: 460},
+ {from: 116, to: 528},
+ {from: 116, to: 562},
+ {from: 116, to: 575},
+ {from: 116, to: 576},
+ {from: 116, to: 583},
+ {from: 116, to: 603},
+ {from: 116, to: 606},
+ {from: 116, to: 616},
+ {from: 116, to: 646},
+ {from: 116, to: 668},
+ {from: 116, to: 713},
+ {from: 117, to: 126},
+ {from: 117, to: 134},
+ {from: 117, to: 156},
+ {from: 117, to: 213},
+ {from: 117, to: 242},
+ {from: 117, to: 265},
+ {from: 117, to: 326},
+ {from: 117, to: 341},
+ {from: 117, to: 365},
+ {from: 117, to: 375},
+ {from: 117, to: 406},
+ {from: 117, to: 476},
+ {from: 117, to: 502},
+ {from: 117, to: 513},
+ {from: 117, to: 530},
+ {from: 117, to: 544},
+ {from: 117, to: 681},
+ {from: 117, to: 683},
+ {from: 117, to: 700},
+ {from: 118, to: 138},
+ {from: 118, to: 199},
+ {from: 118, to: 220},
+ {from: 118, to: 272},
+ {from: 118, to: 340},
+ {from: 118, to: 346},
+ {from: 118, to: 347},
+ {from: 118, to: 387},
+ {from: 118, to: 404},
+ {from: 118, to: 437},
+ {from: 118, to: 503},
+ {from: 118, to: 520},
+ {from: 118, to: 590},
+ {from: 118, to: 595},
+ {from: 118, to: 628},
+ {from: 118, to: 664},
+ {from: 118, to: 670},
+ {from: 118, to: 709},
+ {from: 119, to: 128},
+ {from: 119, to: 136},
+ {from: 119, to: 152},
+ {from: 119, to: 163},
+ {from: 119, to: 206},
+ {from: 119, to: 248},
+ {from: 119, to: 336},
+ {from: 119, to: 343},
+ {from: 119, to: 360},
+ {from: 119, to: 378},
+ {from: 119, to: 388},
+ {from: 119, to: 448},
+ {from: 119, to: 501},
+ {from: 119, to: 506},
+ {from: 119, to: 550},
+ {from: 119, to: 563},
+ {from: 119, to: 588},
+ {from: 119, to: 617},
+ {from: 119, to: 712},
+ {from: 119, to: 727},
+ {from: 120, to: 186},
+ {from: 120, to: 201},
+ {from: 120, to: 222},
+ {from: 120, to: 228},
+ {from: 120, to: 235},
+ {from: 120, to: 236},
+ {from: 120, to: 293},
+ {from: 120, to: 305},
+ {from: 120, to: 324},
+ {from: 120, to: 334},
+ {from: 120, to: 353},
+ {from: 120, to: 368},
+ {from: 120, to: 429},
+ {from: 120, to: 489},
+ {from: 120, to: 499},
+ {from: 120, to: 548},
+ {from: 120, to: 552},
+ {from: 120, to: 595},
+ {from: 120, to: 708},
+ {from: 120, to: 710},
+ {from: 120, to: 733},
+ {from: 121, to: 129},
+ {from: 121, to: 165},
+ {from: 121, to: 166},
+ {from: 121, to: 167},
+ {from: 121, to: 168},
+ {from: 121, to: 185},
+ {from: 121, to: 191},
+ {from: 121, to: 226},
+ {from: 121, to: 240},
+ {from: 121, to: 276},
+ {from: 121, to: 352},
+ {from: 121, to: 359},
+ {from: 121, to: 430},
+ {from: 121, to: 461},
+ {from: 121, to: 463},
+ {from: 121, to: 486},
+ {from: 121, to: 531},
+ {from: 121, to: 607},
+ {from: 121, to: 634},
+ {from: 121, to: 711},
+ {from: 122, to: 203},
+ {from: 122, to: 266},
+ {from: 122, to: 327},
+ {from: 122, to: 374},
+ {from: 122, to: 385},
+ {from: 122, to: 433},
+ {from: 122, to: 442},
+ {from: 122, to: 454},
+ {from: 122, to: 475},
+ {from: 122, to: 480},
+ {from: 122, to: 498},
+ {from: 122, to: 517},
+ {from: 122, to: 573},
+ {from: 122, to: 577},
+ {from: 122, to: 611},
+ {from: 122, to: 614},
+ {from: 122, to: 623},
+ {from: 122, to: 648},
+ {from: 122, to: 678},
+ {from: 122, to: 687},
+ {from: 123, to: 125},
+ {from: 123, to: 141},
+ {from: 123, to: 237},
+ {from: 123, to: 249},
+ {from: 123, to: 252},
+ {from: 123, to: 291},
+ {from: 123, to: 416},
+ {from: 123, to: 422},
+ {from: 123, to: 447},
+ {from: 123, to: 449},
+ {from: 123, to: 452},
+ {from: 123, to: 478},
+ {from: 123, to: 481},
+ {from: 123, to: 482},
+ {from: 123, to: 558},
+ {from: 123, to: 622},
+ {from: 123, to: 675},
+ {from: 124, to: 132},
+ {from: 124, to: 189},
+ {from: 124, to: 207},
+ {from: 124, to: 209},
+ {from: 124, to: 214},
+ {from: 124, to: 223},
+ {from: 124, to: 230},
+ {from: 124, to: 239},
+ {from: 124, to: 262},
+ {from: 124, to: 271},
+ {from: 124, to: 320},
+ {from: 124, to: 344},
+ {from: 124, to: 354},
+ {from: 124, to: 361},
+ {from: 124, to: 362},
+ {from: 124, to: 445},
+ {from: 124, to: 483},
+ {from: 124, to: 484},
+ {from: 124, to: 512},
+ {from: 124, to: 615},
+ {from: 125, to: 141},
+ {from: 125, to: 237},
+ {from: 125, to: 249},
+ {from: 125, to: 252},
+ {from: 125, to: 291},
+ {from: 125, to: 404},
+ {from: 125, to: 416},
+ {from: 125, to: 422},
+ {from: 125, to: 447},
+ {from: 125, to: 449},
+ {from: 125, to: 452},
+ {from: 125, to: 461},
+ {from: 125, to: 478},
+ {from: 125, to: 481},
+ {from: 125, to: 482},
+ {from: 125, to: 483},
+ {from: 125, to: 565},
+ {from: 125, to: 622},
+ {from: 125, to: 661},
+ {from: 125, to: 675},
+ {from: 126, to: 134},
+ {from: 126, to: 156},
+ {from: 126, to: 213},
+ {from: 126, to: 242},
+ {from: 126, to: 265},
+ {from: 126, to: 326},
+ {from: 126, to: 341},
+ {from: 126, to: 365},
+ {from: 126, to: 375},
+ {from: 126, to: 406},
+ {from: 126, to: 476},
+ {from: 126, to: 502},
+ {from: 126, to: 513},
+ {from: 126, to: 530},
+ {from: 126, to: 544},
+ {from: 126, to: 681},
+ {from: 126, to: 683},
+ {from: 127, to: 159},
+ {from: 127, to: 160},
+ {from: 127, to: 161},
+ {from: 127, to: 246},
+ {from: 127, to: 257},
+ {from: 127, to: 297},
+ {from: 127, to: 322},
+ {from: 127, to: 398},
+ {from: 127, to: 474},
+ {from: 127, to: 485},
+ {from: 127, to: 553},
+ {from: 127, to: 621},
+ {from: 127, to: 632},
+ {from: 127, to: 638},
+ {from: 127, to: 639},
+ {from: 127, to: 657},
+ {from: 127, to: 671},
+ {from: 127, to: 690},
+ {from: 127, to: 715},
+ {from: 127, to: 726},
+ {from: 128, to: 136},
+ {from: 128, to: 152},
+ {from: 128, to: 163},
+ {from: 128, to: 206},
+ {from: 128, to: 248},
+ {from: 128, to: 336},
+ {from: 128, to: 343},
+ {from: 128, to: 360},
+ {from: 128, to: 378},
+ {from: 128, to: 388},
+ {from: 128, to: 448},
+ {from: 128, to: 501},
+ {from: 128, to: 506},
+ {from: 128, to: 513},
+ {from: 128, to: 550},
+ {from: 128, to: 563},
+ {from: 128, to: 588},
+ {from: 128, to: 617},
+ {from: 128, to: 712},
+ {from: 128, to: 727},
+ {from: 129, to: 155},
+ {from: 129, to: 164},
+ {from: 129, to: 165},
+ {from: 129, to: 166},
+ {from: 129, to: 167},
+ {from: 129, to: 168},
+ {from: 129, to: 185},
+ {from: 129, to: 191},
+ {from: 129, to: 226},
+ {from: 129, to: 240},
+ {from: 129, to: 352},
+ {from: 129, to: 359},
+ {from: 129, to: 373},
+ {from: 129, to: 397},
+ {from: 129, to: 430},
+ {from: 129, to: 461},
+ {from: 129, to: 463},
+ {from: 129, to: 486},
+ {from: 129, to: 531},
+ {from: 129, to: 607},
+ {from: 129, to: 634},
+ {from: 129, to: 677},
+ {from: 129, to: 685},
+ {from: 129, to: 711},
+ {from: 130, to: 153},
+ {from: 130, to: 181},
+ {from: 130, to: 219},
+ {from: 130, to: 234},
+ {from: 130, to: 291},
+ {from: 130, to: 304},
+ {from: 130, to: 309},
+ {from: 130, to: 366},
+ {from: 130, to: 369},
+ {from: 130, to: 370},
+ {from: 130, to: 382},
+ {from: 130, to: 452},
+ {from: 130, to: 457},
+ {from: 130, to: 481},
+ {from: 130, to: 503},
+ {from: 130, to: 534},
+ {from: 130, to: 554},
+ {from: 130, to: 630},
+ {from: 130, to: 670},
+ {from: 130, to: 672},
+ {from: 130, to: 701},
+ {from: 131, to: 180},
+ {from: 131, to: 188},
+ {from: 131, to: 216},
+ {from: 131, to: 277},
+ {from: 131, to: 286},
+ {from: 131, to: 294},
+ {from: 131, to: 332},
+ {from: 131, to: 333},
+ {from: 131, to: 381},
+ {from: 131, to: 428},
+ {from: 131, to: 432},
+ {from: 131, to: 443},
+ {from: 131, to: 511},
+ {from: 131, to: 528},
+ {from: 131, to: 571},
+ {from: 131, to: 580},
+ {from: 131, to: 589},
+ {from: 131, to: 593},
+ {from: 131, to: 601},
+ {from: 131, to: 618},
+ {from: 131, to: 619},
+ {from: 131, to: 623},
+ {from: 131, to: 644},
+ {from: 131, to: 652},
+ {from: 131, to: 703},
+ {from: 131, to: 716},
+ {from: 131, to: 719},
+ {from: 132, to: 189},
+ {from: 132, to: 207},
+ {from: 132, to: 209},
+ {from: 132, to: 214},
+ {from: 132, to: 223},
+ {from: 132, to: 230},
+ {from: 132, to: 239},
+ {from: 132, to: 262},
+ {from: 132, to: 320},
+ {from: 132, to: 344},
+ {from: 132, to: 354},
+ {from: 132, to: 361},
+ {from: 132, to: 362},
+ {from: 132, to: 445},
+ {from: 132, to: 483},
+ {from: 132, to: 484},
+ {from: 132, to: 512},
+ {from: 133, to: 149},
+ {from: 133, to: 171},
+ {from: 133, to: 244},
+ {from: 133, to: 314},
+ {from: 133, to: 325},
+ {from: 133, to: 338},
+ {from: 133, to: 345},
+ {from: 133, to: 350},
+ {from: 133, to: 396},
+ {from: 133, to: 417},
+ {from: 133, to: 496},
+ {from: 133, to: 507},
+ {from: 133, to: 534},
+ {from: 133, to: 566},
+ {from: 133, to: 606},
+ {from: 133, to: 613},
+ {from: 133, to: 659},
+ {from: 133, to: 673},
+ {from: 133, to: 682},
+ {from: 133, to: 714},
+ {from: 134, to: 156},
+ {from: 134, to: 213},
+ {from: 134, to: 242},
+ {from: 134, to: 265},
+ {from: 134, to: 326},
+ {from: 134, to: 341},
+ {from: 134, to: 365},
+ {from: 134, to: 375},
+ {from: 134, to: 406},
+ {from: 134, to: 476},
+ {from: 134, to: 502},
+ {from: 134, to: 513},
+ {from: 134, to: 530},
+ {from: 134, to: 544},
+ {from: 134, to: 681},
+ {from: 134, to: 683},
+ {from: 135, to: 145},
+ {from: 135, to: 151},
+ {from: 135, to: 224},
+ {from: 135, to: 233},
+ {from: 135, to: 245},
+ {from: 135, to: 279},
+ {from: 135, to: 280},
+ {from: 135, to: 289},
+ {from: 135, to: 319},
+ {from: 135, to: 323},
+ {from: 135, to: 331},
+ {from: 135, to: 349},
+ {from: 135, to: 368},
+ {from: 135, to: 376},
+ {from: 135, to: 419},
+ {from: 135, to: 429},
+ {from: 135, to: 431},
+ {from: 135, to: 436},
+ {from: 135, to: 443},
+ {from: 135, to: 489},
+ {from: 135, to: 490},
+ {from: 135, to: 529},
+ {from: 135, to: 547},
+ {from: 135, to: 567},
+ {from: 135, to: 569},
+ {from: 135, to: 586},
+ {from: 135, to: 643},
+ {from: 135, to: 676},
+ {from: 135, to: 699},
+ {from: 135, to: 717},
+ {from: 135, to: 720},
+ {from: 136, to: 152},
+ {from: 136, to: 163},
+ {from: 136, to: 206},
+ {from: 136, to: 248},
+ {from: 136, to: 336},
+ {from: 136, to: 343},
+ {from: 136, to: 360},
+ {from: 136, to: 378},
+ {from: 136, to: 388},
+ {from: 136, to: 448},
+ {from: 136, to: 501},
+ {from: 136, to: 506},
+ {from: 136, to: 550},
+ {from: 136, to: 563},
+ {from: 136, to: 588},
+ {from: 136, to: 617},
+ {from: 136, to: 712},
+ {from: 136, to: 727},
+ {from: 137, to: 192},
+ {from: 137, to: 204},
+ {from: 137, to: 247},
+ {from: 137, to: 273},
+ {from: 137, to: 284},
+ {from: 137, to: 306},
+ {from: 137, to: 315},
+ {from: 137, to: 380},
+ {from: 137, to: 389},
+ {from: 137, to: 467},
+ {from: 137, to: 495},
+ {from: 137, to: 570},
+ {from: 137, to: 584},
+ {from: 137, to: 598},
+ {from: 137, to: 599},
+ {from: 137, to: 666},
+ {from: 138, to: 193},
+ {from: 138, to: 199},
+ {from: 138, to: 220},
+ {from: 138, to: 272},
+ {from: 138, to: 340},
+ {from: 138, to: 346},
+ {from: 138, to: 347},
+ {from: 138, to: 387},
+ {from: 138, to: 404},
+ {from: 138, to: 408},
+ {from: 138, to: 437},
+ {from: 138, to: 503},
+ {from: 138, to: 520},
+ {from: 138, to: 590},
+ {from: 138, to: 628},
+ {from: 138, to: 664},
+ {from: 138, to: 670},
+ {from: 138, to: 709},
+ {from: 139, to: 144},
+ {from: 139, to: 231},
+ {from: 139, to: 232},
+ {from: 139, to: 238},
+ {from: 139, to: 258},
+ {from: 139, to: 303},
+ {from: 139, to: 308},
+ {from: 139, to: 335},
+ {from: 139, to: 348},
+ {from: 139, to: 398},
+ {from: 139, to: 415},
+ {from: 139, to: 430},
+ {from: 139, to: 434},
+ {from: 139, to: 440},
+ {from: 139, to: 575},
+ {from: 139, to: 576},
+ {from: 139, to: 583},
+ {from: 139, to: 603},
+ {from: 139, to: 616},
+ {from: 139, to: 654},
+ {from: 139, to: 668},
+ {from: 139, to: 702},
+ {from: 139, to: 713},
+ {from: 140, to: 145},
+ {from: 140, to: 172},
+ {from: 140, to: 177},
+ {from: 140, to: 179},
+ {from: 140, to: 311},
+ {from: 140, to: 316},
+ {from: 140, to: 327},
+ {from: 140, to: 375},
+ {from: 140, to: 384},
+ {from: 140, to: 386},
+ {from: 140, to: 408},
+ {from: 140, to: 442},
+ {from: 140, to: 454},
+ {from: 140, to: 455},
+ {from: 140, to: 460},
+ {from: 140, to: 522},
+ {from: 140, to: 527},
+ {from: 140, to: 532},
+ {from: 140, to: 577},
+ {from: 140, to: 612},
+ {from: 140, to: 625},
+ {from: 140, to: 654},
+ {from: 140, to: 667},
+ {from: 140, to: 677},
+ {from: 140, to: 678},
+ {from: 140, to: 679},
+ {from: 140, to: 685},
+ {from: 140, to: 687},
+ {from: 140, to: 707},
+ {from: 140, to: 721},
+ {from: 141, to: 237},
+ {from: 141, to: 246},
+ {from: 141, to: 249},
+ {from: 141, to: 252},
+ {from: 141, to: 291},
+ {from: 141, to: 416},
+ {from: 141, to: 422},
+ {from: 141, to: 436},
+ {from: 141, to: 447},
+ {from: 141, to: 449},
+ {from: 141, to: 452},
+ {from: 141, to: 478},
+ {from: 141, to: 481},
+ {from: 141, to: 482},
+ {from: 141, to: 516},
+ {from: 141, to: 622},
+ {from: 141, to: 675},
+ {from: 141, to: 696},
+ {from: 142, to: 143},
+ {from: 142, to: 147},
+ {from: 142, to: 157},
+ {from: 142, to: 175},
+ {from: 142, to: 187},
+ {from: 142, to: 263},
+ {from: 142, to: 299},
+ {from: 142, to: 300},
+ {from: 142, to: 301},
+ {from: 142, to: 432},
+ {from: 142, to: 444},
+ {from: 142, to: 455},
+ {from: 142, to: 469},
+ {from: 142, to: 514},
+ {from: 142, to: 535},
+ {from: 142, to: 539},
+ {from: 142, to: 542},
+ {from: 142, to: 624},
+ {from: 142, to: 653},
+ {from: 142, to: 660},
+ {from: 142, to: 669},
+ {from: 142, to: 698},
+ {from: 143, to: 147},
+ {from: 143, to: 157},
+ {from: 143, to: 175},
+ {from: 143, to: 187},
+ {from: 143, to: 263},
+ {from: 143, to: 299},
+ {from: 143, to: 300},
+ {from: 143, to: 301},
+ {from: 143, to: 309},
+ {from: 143, to: 332},
+ {from: 143, to: 432},
+ {from: 143, to: 444},
+ {from: 143, to: 455},
+ {from: 143, to: 469},
+ {from: 143, to: 514},
+ {from: 143, to: 535},
+ {from: 143, to: 539},
+ {from: 143, to: 542},
+ {from: 143, to: 624},
+ {from: 143, to: 645},
+ {from: 143, to: 653},
+ {from: 143, to: 669},
+ {from: 143, to: 698},
+ {from: 144, to: 150},
+ {from: 144, to: 231},
+ {from: 144, to: 232},
+ {from: 144, to: 238},
+ {from: 144, to: 258},
+ {from: 144, to: 303},
+ {from: 144, to: 308},
+ {from: 144, to: 318},
+ {from: 144, to: 335},
+ {from: 144, to: 348},
+ {from: 144, to: 371},
+ {from: 144, to: 415},
+ {from: 144, to: 434},
+ {from: 144, to: 460},
+ {from: 144, to: 528},
+ {from: 144, to: 562},
+ {from: 144, to: 575},
+ {from: 144, to: 576},
+ {from: 144, to: 583},
+ {from: 144, to: 603},
+ {from: 144, to: 606},
+ {from: 144, to: 616},
+ {from: 144, to: 646},
+ {from: 144, to: 668},
+ {from: 144, to: 713},
+ {from: 145, to: 151},
+ {from: 145, to: 224},
+ {from: 145, to: 233},
+ {from: 145, to: 279},
+ {from: 145, to: 280},
+ {from: 145, to: 289},
+ {from: 145, to: 316},
+ {from: 145, to: 323},
+ {from: 145, to: 327},
+ {from: 145, to: 331},
+ {from: 145, to: 375},
+ {from: 145, to: 376},
+ {from: 145, to: 431},
+ {from: 145, to: 436},
+ {from: 145, to: 442},
+ {from: 145, to: 443},
+ {from: 145, to: 454},
+ {from: 145, to: 455},
+ {from: 145, to: 490},
+ {from: 145, to: 529},
+ {from: 145, to: 547},
+ {from: 145, to: 567},
+ {from: 145, to: 577},
+ {from: 145, to: 586},
+ {from: 145, to: 676},
+ {from: 145, to: 678},
+ {from: 145, to: 687},
+ {from: 145, to: 699},
+ {from: 145, to: 717},
+ {from: 145, to: 721},
+ {from: 146, to: 182},
+ {from: 146, to: 210},
+ {from: 146, to: 217},
+ {from: 146, to: 278},
+ {from: 146, to: 286},
+ {from: 146, to: 321},
+ {from: 146, to: 326},
+ {from: 146, to: 337},
+ {from: 146, to: 407},
+ {from: 146, to: 420},
+ {from: 146, to: 488},
+ {from: 146, to: 533},
+ {from: 146, to: 579},
+ {from: 146, to: 626},
+ {from: 146, to: 627},
+ {from: 146, to: 662},
+ {from: 146, to: 705},
+ {from: 147, to: 157},
+ {from: 147, to: 175},
+ {from: 147, to: 187},
+ {from: 147, to: 263},
+ {from: 147, to: 299},
+ {from: 147, to: 300},
+ {from: 147, to: 301},
+ {from: 147, to: 432},
+ {from: 147, to: 444},
+ {from: 147, to: 455},
+ {from: 147, to: 469},
+ {from: 147, to: 514},
+ {from: 147, to: 535},
+ {from: 147, to: 539},
+ {from: 147, to: 542},
+ {from: 147, to: 624},
+ {from: 147, to: 653},
+ {from: 147, to: 669},
+ {from: 147, to: 698},
+ {from: 148, to: 208},
+ {from: 148, to: 298},
+ {from: 148, to: 307},
+ {from: 148, to: 310},
+ {from: 148, to: 313},
+ {from: 148, to: 458},
+ {from: 148, to: 459},
+ {from: 148, to: 468},
+ {from: 148, to: 470},
+ {from: 148, to: 471},
+ {from: 148, to: 477},
+ {from: 148, to: 479},
+ {from: 148, to: 515},
+ {from: 148, to: 518},
+ {from: 148, to: 541},
+ {from: 148, to: 620},
+ {from: 148, to: 680},
+ {from: 148, to: 686},
+ {from: 149, to: 171},
+ {from: 149, to: 244},
+ {from: 149, to: 314},
+ {from: 149, to: 325},
+ {from: 149, to: 338},
+ {from: 149, to: 345},
+ {from: 149, to: 350},
+ {from: 149, to: 396},
+ {from: 149, to: 417},
+ {from: 149, to: 496},
+ {from: 149, to: 507},
+ {from: 149, to: 534},
+ {from: 149, to: 566},
+ {from: 149, to: 606},
+ {from: 149, to: 613},
+ {from: 149, to: 659},
+ {from: 149, to: 673},
+ {from: 149, to: 682},
+ {from: 149, to: 714},
+ {from: 150, to: 154},
+ {from: 150, to: 155},
+ {from: 150, to: 164},
+ {from: 150, to: 227},
+ {from: 150, to: 245},
+ {from: 150, to: 294},
+ {from: 150, to: 316},
+ {from: 150, to: 318},
+ {from: 150, to: 349},
+ {from: 150, to: 371},
+ {from: 150, to: 373},
+ {from: 150, to: 397},
+ {from: 150, to: 460},
+ {from: 150, to: 528},
+ {from: 150, to: 562},
+ {from: 150, to: 569},
+ {from: 150, to: 572},
+ {from: 150, to: 576},
+ {from: 150, to: 591},
+ {from: 150, to: 606},
+ {from: 150, to: 629},
+ {from: 150, to: 643},
+ {from: 150, to: 644},
+ {from: 150, to: 646},
+ {from: 150, to: 713},
+ {from: 150, to: 719},
+ {from: 150, to: 720},
+ {from: 151, to: 179},
+ {from: 151, to: 224},
+ {from: 151, to: 227},
+ {from: 151, to: 231},
+ {from: 151, to: 233},
+ {from: 151, to: 238},
+ {from: 151, to: 279},
+ {from: 151, to: 280},
+ {from: 151, to: 289},
+ {from: 151, to: 323},
+ {from: 151, to: 331},
+ {from: 151, to: 342},
+ {from: 151, to: 376},
+ {from: 151, to: 431},
+ {from: 151, to: 436},
+ {from: 151, to: 443},
+ {from: 151, to: 490},
+ {from: 151, to: 529},
+ {from: 151, to: 547},
+ {from: 151, to: 567},
+ {from: 151, to: 586},
+ {from: 151, to: 627},
+ {from: 151, to: 676},
+ {from: 151, to: 699},
+ {from: 151, to: 717},
+ {from: 152, to: 163},
+ {from: 152, to: 206},
+ {from: 152, to: 248},
+ {from: 152, to: 336},
+ {from: 152, to: 343},
+ {from: 152, to: 360},
+ {from: 152, to: 378},
+ {from: 152, to: 388},
+ {from: 152, to: 448},
+ {from: 152, to: 501},
+ {from: 152, to: 506},
+ {from: 152, to: 550},
+ {from: 152, to: 563},
+ {from: 152, to: 588},
+ {from: 152, to: 617},
+ {from: 152, to: 712},
+ {from: 152, to: 727},
+ {from: 153, to: 181},
+ {from: 153, to: 219},
+ {from: 153, to: 234},
+ {from: 153, to: 304},
+ {from: 153, to: 309},
+ {from: 153, to: 366},
+ {from: 153, to: 369},
+ {from: 153, to: 370},
+ {from: 153, to: 457},
+ {from: 153, to: 554},
+ {from: 153, to: 630},
+ {from: 153, to: 672},
+ {from: 153, to: 701},
+ {from: 154, to: 155},
+ {from: 154, to: 164},
+ {from: 154, to: 183},
+ {from: 154, to: 224},
+ {from: 154, to: 227},
+ {from: 154, to: 245},
+ {from: 154, to: 294},
+ {from: 154, to: 308},
+ {from: 154, to: 316},
+ {from: 154, to: 335},
+ {from: 154, to: 349},
+ {from: 154, to: 371},
+ {from: 154, to: 373},
+ {from: 154, to: 397},
+ {from: 154, to: 462},
+ {from: 154, to: 555},
+ {from: 154, to: 569},
+ {from: 154, to: 572},
+ {from: 154, to: 591},
+ {from: 154, to: 629},
+ {from: 154, to: 642},
+ {from: 154, to: 643},
+ {from: 154, to: 644},
+ {from: 154, to: 707},
+ {from: 154, to: 719},
+ {from: 154, to: 720},
+ {from: 154, to: 726},
+ {from: 155, to: 164},
+ {from: 155, to: 166},
+ {from: 155, to: 227},
+ {from: 155, to: 245},
+ {from: 155, to: 294},
+ {from: 155, to: 316},
+ {from: 155, to: 349},
+ {from: 155, to: 359},
+ {from: 155, to: 371},
+ {from: 155, to: 373},
+ {from: 155, to: 397},
+ {from: 155, to: 569},
+ {from: 155, to: 572},
+ {from: 155, to: 591},
+ {from: 155, to: 629},
+ {from: 155, to: 643},
+ {from: 155, to: 644},
+ {from: 155, to: 677},
+ {from: 155, to: 685},
+ {from: 155, to: 719},
+ {from: 155, to: 720},
+ {from: 156, to: 213},
+ {from: 156, to: 242},
+ {from: 156, to: 265},
+ {from: 156, to: 326},
+ {from: 156, to: 341},
+ {from: 156, to: 365},
+ {from: 156, to: 375},
+ {from: 156, to: 406},
+ {from: 156, to: 476},
+ {from: 156, to: 502},
+ {from: 156, to: 513},
+ {from: 156, to: 530},
+ {from: 156, to: 544},
+ {from: 156, to: 681},
+ {from: 156, to: 683},
+ {from: 157, to: 175},
+ {from: 157, to: 187},
+ {from: 157, to: 240},
+ {from: 157, to: 263},
+ {from: 157, to: 299},
+ {from: 157, to: 300},
+ {from: 157, to: 301},
+ {from: 157, to: 432},
+ {from: 157, to: 434},
+ {from: 157, to: 444},
+ {from: 157, to: 455},
+ {from: 157, to: 469},
+ {from: 157, to: 491},
+ {from: 157, to: 514},
+ {from: 157, to: 521},
+ {from: 157, to: 535},
+ {from: 157, to: 539},
+ {from: 157, to: 542},
+ {from: 157, to: 603},
+ {from: 157, to: 624},
+ {from: 157, to: 653},
+ {from: 157, to: 669},
+ {from: 157, to: 698},
+ {from: 158, to: 174},
+ {from: 158, to: 243},
+ {from: 158, to: 292},
+ {from: 158, to: 293},
+ {from: 158, to: 439},
+ {from: 158, to: 540},
+ {from: 158, to: 568},
+ {from: 158, to: 640},
+ {from: 158, to: 641},
+ {from: 158, to: 695},
+ {from: 158, to: 704},
+ {from: 158, to: 708},
+ {from: 158, to: 732},
+ {from: 158, to: 733},
+ {from: 159, to: 160},
+ {from: 159, to: 161},
+ {from: 159, to: 226},
+ {from: 159, to: 246},
+ {from: 159, to: 257},
+ {from: 159, to: 297},
+ {from: 159, to: 302},
+ {from: 159, to: 322},
+ {from: 159, to: 398},
+ {from: 159, to: 474},
+ {from: 159, to: 485},
+ {from: 159, to: 553},
+ {from: 159, to: 621},
+ {from: 159, to: 632},
+ {from: 159, to: 638},
+ {from: 159, to: 639},
+ {from: 159, to: 657},
+ {from: 159, to: 671},
+ {from: 159, to: 714},
+ {from: 159, to: 715},
+ {from: 159, to: 726},
+ {from: 160, to: 161},
+ {from: 160, to: 246},
+ {from: 160, to: 257},
+ {from: 160, to: 281},
+ {from: 160, to: 297},
+ {from: 160, to: 322},
+ {from: 160, to: 398},
+ {from: 160, to: 474},
+ {from: 160, to: 485},
+ {from: 160, to: 553},
+ {from: 160, to: 614},
+ {from: 160, to: 621},
+ {from: 160, to: 632},
+ {from: 160, to: 638},
+ {from: 160, to: 639},
+ {from: 160, to: 657},
+ {from: 160, to: 671},
+ {from: 160, to: 715},
+ {from: 160, to: 726},
+ {from: 161, to: 246},
+ {from: 161, to: 257},
+ {from: 161, to: 297},
+ {from: 161, to: 322},
+ {from: 161, to: 398},
+ {from: 161, to: 474},
+ {from: 161, to: 485},
+ {from: 161, to: 553},
+ {from: 161, to: 621},
+ {from: 161, to: 632},
+ {from: 161, to: 638},
+ {from: 161, to: 639},
+ {from: 161, to: 657},
+ {from: 161, to: 671},
+ {from: 161, to: 715},
+ {from: 161, to: 726},
+ {from: 162, to: 215},
+ {from: 162, to: 241},
+ {from: 162, to: 260},
+ {from: 162, to: 266},
+ {from: 162, to: 271},
+ {from: 162, to: 299},
+ {from: 162, to: 301},
+ {from: 162, to: 339},
+ {from: 162, to: 364},
+ {from: 162, to: 384},
+ {from: 162, to: 431},
+ {from: 162, to: 453},
+ {from: 162, to: 504},
+ {from: 162, to: 578},
+ {from: 162, to: 596},
+ {from: 162, to: 602},
+ {from: 162, to: 610},
+ {from: 162, to: 661},
+ {from: 162, to: 665},
+ {from: 162, to: 690},
+ {from: 162, to: 692},
+ {from: 162, to: 693},
+ {from: 162, to: 703},
+ {from: 162, to: 721},
+ {from: 162, to: 723},
+ {from: 163, to: 206},
+ {from: 163, to: 248},
+ {from: 163, to: 336},
+ {from: 163, to: 343},
+ {from: 163, to: 360},
+ {from: 163, to: 378},
+ {from: 163, to: 388},
+ {from: 163, to: 448},
+ {from: 163, to: 501},
+ {from: 163, to: 506},
+ {from: 163, to: 550},
+ {from: 163, to: 563},
+ {from: 163, to: 588},
+ {from: 163, to: 617},
+ {from: 163, to: 712},
+ {from: 163, to: 727},
+ {from: 164, to: 166},
+ {from: 164, to: 227},
+ {from: 164, to: 245},
+ {from: 164, to: 294},
+ {from: 164, to: 316},
+ {from: 164, to: 349},
+ {from: 164, to: 359},
+ {from: 164, to: 371},
+ {from: 164, to: 373},
+ {from: 164, to: 397},
+ {from: 164, to: 569},
+ {from: 164, to: 572},
+ {from: 164, to: 591},
+ {from: 164, to: 629},
+ {from: 164, to: 643},
+ {from: 164, to: 644},
+ {from: 164, to: 677},
+ {from: 164, to: 685},
+ {from: 164, to: 719},
+ {from: 164, to: 720},
+ {from: 165, to: 166},
+ {from: 165, to: 167},
+ {from: 165, to: 168},
+ {from: 165, to: 185},
+ {from: 165, to: 191},
+ {from: 165, to: 226},
+ {from: 165, to: 240},
+ {from: 165, to: 285},
+ {from: 165, to: 352},
+ {from: 165, to: 359},
+ {from: 165, to: 430},
+ {from: 165, to: 461},
+ {from: 165, to: 463},
+ {from: 165, to: 486},
+ {from: 165, to: 531},
+ {from: 165, to: 607},
+ {from: 165, to: 634},
+ {from: 165, to: 711},
+ {from: 165, to: 729},
+ {from: 166, to: 167},
+ {from: 166, to: 168},
+ {from: 166, to: 185},
+ {from: 166, to: 191},
+ {from: 166, to: 226},
+ {from: 166, to: 240},
+ {from: 166, to: 352},
+ {from: 166, to: 359},
+ {from: 166, to: 373},
+ {from: 166, to: 397},
+ {from: 166, to: 430},
+ {from: 166, to: 461},
+ {from: 166, to: 463},
+ {from: 166, to: 486},
+ {from: 166, to: 531},
+ {from: 166, to: 607},
+ {from: 166, to: 634},
+ {from: 166, to: 677},
+ {from: 166, to: 685},
+ {from: 166, to: 711},
+ {from: 167, to: 168},
+ {from: 167, to: 185},
+ {from: 167, to: 191},
+ {from: 167, to: 226},
+ {from: 167, to: 240},
+ {from: 167, to: 352},
+ {from: 167, to: 359},
+ {from: 167, to: 430},
+ {from: 167, to: 461},
+ {from: 167, to: 463},
+ {from: 167, to: 486},
+ {from: 167, to: 531},
+ {from: 167, to: 607},
+ {from: 167, to: 634},
+ {from: 167, to: 711},
+ {from: 168, to: 185},
+ {from: 168, to: 191},
+ {from: 168, to: 226},
+ {from: 168, to: 240},
+ {from: 168, to: 352},
+ {from: 168, to: 359},
+ {from: 168, to: 410},
+ {from: 168, to: 430},
+ {from: 168, to: 461},
+ {from: 168, to: 463},
+ {from: 168, to: 486},
+ {from: 168, to: 531},
+ {from: 168, to: 557},
+ {from: 168, to: 607},
+ {from: 168, to: 634},
+ {from: 168, to: 711},
+ {from: 169, to: 196},
+ {from: 169, to: 229},
+ {from: 169, to: 256},
+ {from: 169, to: 267},
+ {from: 169, to: 275},
+ {from: 169, to: 276},
+ {from: 169, to: 295},
+ {from: 169, to: 304},
+ {from: 169, to: 317},
+ {from: 169, to: 318},
+ {from: 169, to: 352},
+ {from: 169, to: 355},
+ {from: 169, to: 357},
+ {from: 169, to: 369},
+ {from: 169, to: 446},
+ {from: 169, to: 509},
+ {from: 169, to: 510},
+ {from: 169, to: 526},
+ {from: 169, to: 546},
+ {from: 169, to: 564},
+ {from: 169, to: 581},
+ {from: 169, to: 592},
+ {from: 169, to: 652},
+ {from: 169, to: 667},
+ {from: 170, to: 250},
+ {from: 170, to: 251},
+ {from: 170, to: 253},
+ {from: 170, to: 254},
+ {from: 170, to: 255},
+ {from: 170, to: 356},
+ {from: 170, to: 400},
+ {from: 170, to: 401},
+ {from: 170, to: 402},
+ {from: 170, to: 410},
+ {from: 170, to: 423},
+ {from: 170, to: 545},
+ {from: 170, to: 556},
+ {from: 170, to: 557},
+ {from: 170, to: 558},
+ {from: 170, to: 656},
+ {from: 170, to: 660},
+ {from: 170, to: 674},
+ {from: 170, to: 694},
+ {from: 170, to: 696},
+ {from: 171, to: 200},
+ {from: 171, to: 244},
+ {from: 171, to: 314},
+ {from: 171, to: 325},
+ {from: 171, to: 338},
+ {from: 171, to: 345},
+ {from: 171, to: 350},
+ {from: 171, to: 396},
+ {from: 171, to: 417},
+ {from: 171, to: 496},
+ {from: 171, to: 507},
+ {from: 171, to: 534},
+ {from: 171, to: 566},
+ {from: 171, to: 579},
+ {from: 171, to: 593},
+ {from: 171, to: 606},
+ {from: 171, to: 613},
+ {from: 171, to: 659},
+ {from: 171, to: 673},
+ {from: 171, to: 682},
+ {from: 171, to: 714},
+ {from: 172, to: 177},
+ {from: 172, to: 179},
+ {from: 172, to: 311},
+ {from: 172, to: 384},
+ {from: 172, to: 386},
+ {from: 172, to: 408},
+ {from: 172, to: 460},
+ {from: 172, to: 522},
+ {from: 172, to: 527},
+ {from: 172, to: 532},
+ {from: 172, to: 604},
+ {from: 172, to: 612},
+ {from: 172, to: 621},
+ {from: 172, to: 625},
+ {from: 172, to: 654},
+ {from: 172, to: 667},
+ {from: 172, to: 677},
+ {from: 172, to: 679},
+ {from: 172, to: 685},
+ {from: 172, to: 706},
+ {from: 172, to: 707},
+ {from: 173, to: 195},
+ {from: 173, to: 205},
+ {from: 173, to: 218},
+ {from: 173, to: 274},
+ {from: 173, to: 296},
+ {from: 173, to: 418},
+ {from: 173, to: 435},
+ {from: 173, to: 493},
+ {from: 173, to: 494},
+ {from: 173, to: 519},
+ {from: 173, to: 525},
+ {from: 173, to: 526},
+ {from: 173, to: 582},
+ {from: 173, to: 585},
+ {from: 173, to: 605},
+ {from: 173, to: 631},
+ {from: 173, to: 655},
+ {from: 173, to: 722},
+ {from: 174, to: 243},
+ {from: 174, to: 292},
+ {from: 174, to: 293},
+ {from: 174, to: 439},
+ {from: 174, to: 540},
+ {from: 174, to: 568},
+ {from: 174, to: 640},
+ {from: 174, to: 641},
+ {from: 174, to: 695},
+ {from: 174, to: 704},
+ {from: 174, to: 708},
+ {from: 174, to: 732},
+ {from: 174, to: 733},
+ {from: 175, to: 187},
+ {from: 175, to: 263},
+ {from: 175, to: 299},
+ {from: 175, to: 300},
+ {from: 175, to: 301},
+ {from: 175, to: 325},
+ {from: 175, to: 432},
+ {from: 175, to: 444},
+ {from: 175, to: 455},
+ {from: 175, to: 469},
+ {from: 175, to: 511},
+ {from: 175, to: 514},
+ {from: 175, to: 535},
+ {from: 175, to: 539},
+ {from: 175, to: 542},
+ {from: 175, to: 624},
+ {from: 175, to: 653},
+ {from: 175, to: 669},
+ {from: 175, to: 698},
+ {from: 176, to: 178},
+ {from: 176, to: 197},
+ {from: 176, to: 328},
+ {from: 176, to: 329},
+ {from: 176, to: 351},
+ {from: 176, to: 367},
+ {from: 176, to: 372},
+ {from: 176, to: 426},
+ {from: 176, to: 427},
+ {from: 176, to: 456},
+ {from: 176, to: 464},
+ {from: 176, to: 492},
+ {from: 176, to: 536},
+ {from: 176, to: 549},
+ {from: 176, to: 551},
+ {from: 176, to: 609},
+ {from: 176, to: 615},
+ {from: 176, to: 700},
+ {from: 176, to: 718},
+ {from: 177, to: 179},
+ {from: 177, to: 218},
+ {from: 177, to: 221},
+ {from: 177, to: 260},
+ {from: 177, to: 261},
+ {from: 177, to: 279},
+ {from: 177, to: 311},
+ {from: 177, to: 366},
+ {from: 177, to: 384},
+ {from: 177, to: 386},
+ {from: 177, to: 408},
+ {from: 177, to: 422},
+ {from: 177, to: 460},
+ {from: 177, to: 522},
+ {from: 177, to: 527},
+ {from: 177, to: 532},
+ {from: 177, to: 572},
+ {from: 177, to: 591},
+ {from: 177, to: 612},
+ {from: 177, to: 625},
+ {from: 177, to: 654},
+ {from: 177, to: 667},
+ {from: 177, to: 677},
+ {from: 177, to: 679},
+ {from: 177, to: 685},
+ {from: 177, to: 693},
+ {from: 177, to: 707},
+ {from: 178, to: 197},
+ {from: 178, to: 328},
+ {from: 178, to: 329},
+ {from: 178, to: 351},
+ {from: 178, to: 367},
+ {from: 178, to: 372},
+ {from: 178, to: 426},
+ {from: 178, to: 427},
+ {from: 178, to: 456},
+ {from: 178, to: 464},
+ {from: 178, to: 492},
+ {from: 178, to: 536},
+ {from: 178, to: 549},
+ {from: 178, to: 551},
+ {from: 178, to: 609},
+ {from: 178, to: 615},
+ {from: 178, to: 700},
+ {from: 178, to: 718},
+ {from: 179, to: 227},
+ {from: 179, to: 231},
+ {from: 179, to: 238},
+ {from: 179, to: 311},
+ {from: 179, to: 342},
+ {from: 179, to: 384},
+ {from: 179, to: 386},
+ {from: 179, to: 408},
+ {from: 179, to: 460},
+ {from: 179, to: 522},
+ {from: 179, to: 527},
+ {from: 179, to: 532},
+ {from: 179, to: 547},
+ {from: 179, to: 586},
+ {from: 179, to: 612},
+ {from: 179, to: 625},
+ {from: 179, to: 627},
+ {from: 179, to: 654},
+ {from: 179, to: 667},
+ {from: 179, to: 677},
+ {from: 179, to: 679},
+ {from: 179, to: 685},
+ {from: 179, to: 707},
+ {from: 179, to: 717},
+ {from: 180, to: 188},
+ {from: 180, to: 216},
+ {from: 180, to: 277},
+ {from: 180, to: 286},
+ {from: 180, to: 332},
+ {from: 180, to: 333},
+ {from: 180, to: 428},
+ {from: 180, to: 511},
+ {from: 180, to: 528},
+ {from: 180, to: 571},
+ {from: 180, to: 580},
+ {from: 180, to: 593},
+ {from: 180, to: 601},
+ {from: 180, to: 618},
+ {from: 180, to: 619},
+ {from: 180, to: 652},
+ {from: 180, to: 703},
+ {from: 180, to: 716},
+ {from: 181, to: 219},
+ {from: 181, to: 234},
+ {from: 181, to: 304},
+ {from: 181, to: 309},
+ {from: 181, to: 366},
+ {from: 181, to: 369},
+ {from: 181, to: 370},
+ {from: 181, to: 457},
+ {from: 181, to: 554},
+ {from: 181, to: 630},
+ {from: 181, to: 672},
+ {from: 181, to: 701},
+ {from: 182, to: 210},
+ {from: 182, to: 217},
+ {from: 182, to: 278},
+ {from: 182, to: 321},
+ {from: 182, to: 337},
+ {from: 182, to: 407},
+ {from: 182, to: 420},
+ {from: 182, to: 488},
+ {from: 182, to: 533},
+ {from: 182, to: 579},
+ {from: 182, to: 626},
+ {from: 182, to: 627},
+ {from: 182, to: 662},
+ {from: 182, to: 705},
+ {from: 183, to: 184},
+ {from: 183, to: 198},
+ {from: 183, to: 204},
+ {from: 183, to: 224},
+ {from: 183, to: 270},
+ {from: 183, to: 302},
+ {from: 183, to: 308},
+ {from: 183, to: 312},
+ {from: 183, to: 335},
+ {from: 183, to: 462},
+ {from: 183, to: 497},
+ {from: 183, to: 516},
+ {from: 183, to: 524},
+ {from: 183, to: 538},
+ {from: 183, to: 555},
+ {from: 183, to: 633},
+ {from: 183, to: 635},
+ {from: 183, to: 636},
+ {from: 183, to: 637},
+ {from: 183, to: 642},
+ {from: 183, to: 684},
+ {from: 183, to: 688},
+ {from: 183, to: 697},
+ {from: 183, to: 707},
+ {from: 183, to: 726},
+ {from: 183, to: 736},
+ {from: 184, to: 198},
+ {from: 184, to: 204},
+ {from: 184, to: 270},
+ {from: 184, to: 302},
+ {from: 184, to: 312},
+ {from: 184, to: 497},
+ {from: 184, to: 516},
+ {from: 184, to: 524},
+ {from: 184, to: 538},
+ {from: 184, to: 633},
+ {from: 184, to: 635},
+ {from: 184, to: 636},
+ {from: 184, to: 637},
+ {from: 184, to: 684},
+ {from: 184, to: 688},
+ {from: 184, to: 697},
+ {from: 184, to: 736},
+ {from: 185, to: 191},
+ {from: 185, to: 212},
+ {from: 185, to: 226},
+ {from: 185, to: 240},
+ {from: 185, to: 352},
+ {from: 185, to: 359},
+ {from: 185, to: 425},
+ {from: 185, to: 430},
+ {from: 185, to: 449},
+ {from: 185, to: 461},
+ {from: 185, to: 463},
+ {from: 185, to: 486},
+ {from: 185, to: 490},
+ {from: 185, to: 531},
+ {from: 185, to: 607},
+ {from: 185, to: 622},
+ {from: 185, to: 634},
+ {from: 185, to: 675},
+ {from: 185, to: 676},
+ {from: 185, to: 711},
+ {from: 185, to: 728},
+ {from: 186, to: 201},
+ {from: 186, to: 222},
+ {from: 186, to: 228},
+ {from: 186, to: 235},
+ {from: 186, to: 236},
+ {from: 186, to: 305},
+ {from: 186, to: 324},
+ {from: 186, to: 334},
+ {from: 186, to: 353},
+ {from: 186, to: 368},
+ {from: 186, to: 429},
+ {from: 186, to: 489},
+ {from: 186, to: 499},
+ {from: 186, to: 548},
+ {from: 186, to: 552},
+ {from: 186, to: 595},
+ {from: 186, to: 710},
+ {from: 187, to: 263},
+ {from: 187, to: 299},
+ {from: 187, to: 300},
+ {from: 187, to: 301},
+ {from: 187, to: 432},
+ {from: 187, to: 444},
+ {from: 187, to: 455},
+ {from: 187, to: 469},
+ {from: 187, to: 514},
+ {from: 187, to: 535},
+ {from: 187, to: 539},
+ {from: 187, to: 542},
+ {from: 187, to: 624},
+ {from: 187, to: 653},
+ {from: 187, to: 669},
+ {from: 187, to: 698},
+ {from: 188, to: 216},
+ {from: 188, to: 277},
+ {from: 188, to: 286},
+ {from: 188, to: 332},
+ {from: 188, to: 333},
+ {from: 188, to: 428},
+ {from: 188, to: 511},
+ {from: 188, to: 528},
+ {from: 188, to: 571},
+ {from: 188, to: 580},
+ {from: 188, to: 593},
+ {from: 188, to: 601},
+ {from: 188, to: 618},
+ {from: 188, to: 619},
+ {from: 188, to: 652},
+ {from: 188, to: 703},
+ {from: 188, to: 716},
+ {from: 189, to: 207},
+ {from: 189, to: 209},
+ {from: 189, to: 214},
+ {from: 189, to: 223},
+ {from: 189, to: 230},
+ {from: 189, to: 239},
+ {from: 189, to: 262},
+ {from: 189, to: 320},
+ {from: 189, to: 333},
+ {from: 189, to: 344},
+ {from: 189, to: 354},
+ {from: 189, to: 361},
+ {from: 189, to: 362},
+ {from: 189, to: 445},
+ {from: 189, to: 483},
+ {from: 189, to: 484},
+ {from: 189, to: 512},
+ {from: 189, to: 578},
+ {from: 189, to: 601},
+ {from: 189, to: 655},
+ {from: 190, to: 194},
+ {from: 190, to: 197},
+ {from: 190, to: 200},
+ {from: 190, to: 232},
+ {from: 190, to: 254},
+ {from: 190, to: 259},
+ {from: 190, to: 342},
+ {from: 190, to: 363},
+ {from: 190, to: 379},
+ {from: 190, to: 383},
+ {from: 190, to: 403},
+ {from: 190, to: 500},
+ {from: 190, to: 505},
+ {from: 190, to: 537},
+ {from: 190, to: 574},
+ {from: 190, to: 587},
+ {from: 190, to: 597},
+ {from: 190, to: 649},
+ {from: 190, to: 691},
+ {from: 190, to: 702},
+ {from: 190, to: 706},
+ {from: 191, to: 226},
+ {from: 191, to: 240},
+ {from: 191, to: 324},
+ {from: 191, to: 352},
+ {from: 191, to: 359},
+ {from: 191, to: 430},
+ {from: 191, to: 461},
+ {from: 191, to: 463},
+ {from: 191, to: 486},
+ {from: 191, to: 531},
+ {from: 191, to: 607},
+ {from: 191, to: 634},
+ {from: 191, to: 711},
+ {from: 192, to: 247},
+ {from: 192, to: 273},
+ {from: 192, to: 284},
+ {from: 192, to: 306},
+ {from: 192, to: 315},
+ {from: 192, to: 380},
+ {from: 192, to: 389},
+ {from: 192, to: 467},
+ {from: 192, to: 495},
+ {from: 192, to: 570},
+ {from: 192, to: 584},
+ {from: 192, to: 598},
+ {from: 192, to: 599},
+ {from: 192, to: 666},
+ {from: 193, to: 264},
+ {from: 193, to: 281},
+ {from: 193, to: 282},
+ {from: 193, to: 285},
+ {from: 193, to: 382},
+ {from: 193, to: 408},
+ {from: 193, to: 438},
+ {from: 193, to: 441},
+ {from: 193, to: 465},
+ {from: 193, to: 466},
+ {from: 193, to: 491},
+ {from: 193, to: 646},
+ {from: 193, to: 647},
+ {from: 193, to: 650},
+ {from: 193, to: 651},
+ {from: 193, to: 689},
+ {from: 193, to: 724},
+ {from: 193, to: 725},
+ {from: 193, to: 729},
+ {from: 193, to: 730},
+ {from: 193, to: 734},
+ {from: 193, to: 735},
+ {from: 194, to: 200},
+ {from: 194, to: 259},
+ {from: 194, to: 342},
+ {from: 194, to: 363},
+ {from: 194, to: 379},
+ {from: 194, to: 383},
+ {from: 194, to: 403},
+ {from: 194, to: 500},
+ {from: 194, to: 505},
+ {from: 194, to: 537},
+ {from: 194, to: 574},
+ {from: 194, to: 587},
+ {from: 194, to: 597},
+ {from: 194, to: 649},
+ {from: 194, to: 691},
+ {from: 194, to: 702},
+ {from: 194, to: 706},
+ {from: 195, to: 205},
+ {from: 195, to: 218},
+ {from: 195, to: 274},
+ {from: 195, to: 296},
+ {from: 195, to: 418},
+ {from: 195, to: 435},
+ {from: 195, to: 444},
+ {from: 195, to: 493},
+ {from: 195, to: 494},
+ {from: 195, to: 519},
+ {from: 195, to: 525},
+ {from: 195, to: 526},
+ {from: 195, to: 582},
+ {from: 195, to: 585},
+ {from: 195, to: 605},
+ {from: 195, to: 631},
+ {from: 195, to: 655},
+ {from: 195, to: 722},
+ {from: 196, to: 275},
+ {from: 196, to: 288},
+ {from: 196, to: 304},
+ {from: 196, to: 352},
+ {from: 196, to: 369},
+ {from: 196, to: 381},
+ {from: 196, to: 409},
+ {from: 196, to: 421},
+ {from: 196, to: 425},
+ {from: 196, to: 440},
+ {from: 196, to: 472},
+ {from: 196, to: 473},
+ {from: 196, to: 508},
+ {from: 196, to: 521},
+ {from: 196, to: 523},
+ {from: 196, to: 526},
+ {from: 196, to: 543},
+ {from: 196, to: 562},
+ {from: 196, to: 565},
+ {from: 196, to: 589},
+ {from: 196, to: 594},
+ {from: 196, to: 604},
+ {from: 196, to: 652},
+ {from: 196, to: 663},
+ {from: 196, to: 667},
+ {from: 196, to: 728},
+ {from: 197, to: 232},
+ {from: 197, to: 254},
+ {from: 197, to: 328},
+ {from: 197, to: 329},
+ {from: 197, to: 351},
+ {from: 197, to: 367},
+ {from: 197, to: 372},
+ {from: 197, to: 426},
+ {from: 197, to: 427},
+ {from: 197, to: 456},
+ {from: 197, to: 464},
+ {from: 197, to: 492},
+ {from: 197, to: 536},
+ {from: 197, to: 549},
+ {from: 197, to: 551},
+ {from: 197, to: 609},
+ {from: 197, to: 615},
+ {from: 197, to: 700},
+ {from: 197, to: 718},
+ {from: 198, to: 204},
+ {from: 198, to: 270},
+ {from: 198, to: 302},
+ {from: 198, to: 312},
+ {from: 198, to: 497},
+ {from: 198, to: 516},
+ {from: 198, to: 524},
+ {from: 198, to: 538},
+ {from: 198, to: 633},
+ {from: 198, to: 635},
+ {from: 198, to: 636},
+ {from: 198, to: 637},
+ {from: 198, to: 658},
+ {from: 198, to: 684},
+ {from: 198, to: 688},
+ {from: 198, to: 697},
+ {from: 198, to: 736},
+ {from: 199, to: 220},
+ {from: 199, to: 272},
+ {from: 199, to: 274},
+ {from: 199, to: 340},
+ {from: 199, to: 346},
+ {from: 199, to: 347},
+ {from: 199, to: 387},
+ {from: 199, to: 404},
+ {from: 199, to: 437},
+ {from: 199, to: 503},
+ {from: 199, to: 520},
+ {from: 199, to: 590},
+ {from: 199, to: 628},
+ {from: 199, to: 664},
+ {from: 199, to: 670},
+ {from: 199, to: 709},
+ {from: 200, to: 259},
+ {from: 200, to: 342},
+ {from: 200, to: 363},
+ {from: 200, to: 379},
+ {from: 200, to: 383},
+ {from: 200, to: 403},
+ {from: 200, to: 500},
+ {from: 200, to: 505},
+ {from: 200, to: 537},
+ {from: 200, to: 574},
+ {from: 200, to: 579},
+ {from: 200, to: 587},
+ {from: 200, to: 593},
+ {from: 200, to: 597},
+ {from: 200, to: 649},
+ {from: 200, to: 691},
+ {from: 200, to: 702},
+ {from: 200, to: 706},
+ {from: 201, to: 222},
+ {from: 201, to: 228},
+ {from: 201, to: 235},
+ {from: 201, to: 236},
+ {from: 201, to: 305},
+ {from: 201, to: 324},
+ {from: 201, to: 334},
+ {from: 201, to: 353},
+ {from: 201, to: 368},
+ {from: 201, to: 429},
+ {from: 201, to: 489},
+ {from: 201, to: 499},
+ {from: 201, to: 548},
+ {from: 201, to: 552},
+ {from: 201, to: 595},
+ {from: 201, to: 710},
+ {from: 202, to: 211},
+ {from: 202, to: 212},
+ {from: 202, to: 221},
+ {from: 202, to: 225},
+ {from: 202, to: 261},
+ {from: 202, to: 287},
+ {from: 202, to: 319},
+ {from: 202, to: 358},
+ {from: 202, to: 419},
+ {from: 202, to: 424},
+ {from: 202, to: 450},
+ {from: 202, to: 451},
+ {from: 202, to: 462},
+ {from: 202, to: 486},
+ {from: 202, to: 487},
+ {from: 202, to: 555},
+ {from: 202, to: 600},
+ {from: 202, to: 608},
+ {from: 202, to: 618},
+ {from: 202, to: 642},
+ {from: 202, to: 645},
+ {from: 203, to: 327},
+ {from: 203, to: 374},
+ {from: 203, to: 385},
+ {from: 203, to: 433},
+ {from: 203, to: 442},
+ {from: 203, to: 454},
+ {from: 203, to: 475},
+ {from: 203, to: 480},
+ {from: 203, to: 498},
+ {from: 203, to: 517},
+ {from: 203, to: 518},
+ {from: 203, to: 573},
+ {from: 203, to: 577},
+ {from: 203, to: 611},
+ {from: 203, to: 614},
+ {from: 203, to: 623},
+ {from: 203, to: 648},
+ {from: 203, to: 656},
+ {from: 203, to: 678},
+ {from: 203, to: 687},
+ {from: 204, to: 270},
+ {from: 204, to: 302},
+ {from: 204, to: 312},
+ {from: 204, to: 497},
+ {from: 204, to: 516},
+ {from: 204, to: 524},
+ {from: 204, to: 538},
+ {from: 204, to: 633},
+ {from: 204, to: 635},
+ {from: 204, to: 636},
+ {from: 204, to: 637},
+ {from: 204, to: 684},
+ {from: 204, to: 688},
+ {from: 204, to: 697},
+ {from: 204, to: 736},
+ {from: 205, to: 218},
+ {from: 205, to: 274},
+ {from: 205, to: 296},
+ {from: 205, to: 418},
+ {from: 205, to: 435},
+ {from: 205, to: 493},
+ {from: 205, to: 494},
+ {from: 205, to: 519},
+ {from: 205, to: 525},
+ {from: 205, to: 526},
+ {from: 205, to: 559},
+ {from: 205, to: 582},
+ {from: 205, to: 585},
+ {from: 205, to: 605},
+ {from: 205, to: 631},
+ {from: 205, to: 655},
+ {from: 205, to: 722},
+ {from: 206, to: 248},
+ {from: 206, to: 336},
+ {from: 206, to: 343},
+ {from: 206, to: 360},
+ {from: 206, to: 378},
+ {from: 206, to: 388},
+ {from: 206, to: 448},
+ {from: 206, to: 501},
+ {from: 206, to: 506},
+ {from: 206, to: 550},
+ {from: 206, to: 563},
+ {from: 206, to: 588},
+ {from: 206, to: 617},
+ {from: 206, to: 712},
+ {from: 206, to: 727},
+ {from: 207, to: 209},
+ {from: 207, to: 214},
+ {from: 207, to: 223},
+ {from: 207, to: 230},
+ {from: 207, to: 239},
+ {from: 207, to: 262},
+ {from: 207, to: 320},
+ {from: 207, to: 344},
+ {from: 207, to: 354},
+ {from: 207, to: 361},
+ {from: 207, to: 362},
+ {from: 207, to: 445},
+ {from: 207, to: 483},
+ {from: 207, to: 484},
+ {from: 207, to: 512},
+ {from: 208, to: 298},
+ {from: 208, to: 307},
+ {from: 208, to: 310},
+ {from: 208, to: 313},
+ {from: 208, to: 458},
+ {from: 208, to: 459},
+ {from: 208, to: 468},
+ {from: 208, to: 470},
+ {from: 208, to: 471},
+ {from: 208, to: 477},
+ {from: 208, to: 479},
+ {from: 208, to: 515},
+ {from: 208, to: 518},
+ {from: 208, to: 541},
+ {from: 208, to: 620},
+ {from: 208, to: 680},
+ {from: 208, to: 686},
+ {from: 209, to: 214},
+ {from: 209, to: 223},
+ {from: 209, to: 230},
+ {from: 209, to: 239},
+ {from: 209, to: 262},
+ {from: 209, to: 320},
+ {from: 209, to: 344},
+ {from: 209, to: 354},
+ {from: 209, to: 361},
+ {from: 209, to: 362},
+ {from: 209, to: 445},
+ {from: 209, to: 483},
+ {from: 209, to: 484},
+ {from: 209, to: 512},
+ {from: 210, to: 217},
+ {from: 210, to: 278},
+ {from: 210, to: 321},
+ {from: 210, to: 337},
+ {from: 210, to: 407},
+ {from: 210, to: 420},
+ {from: 210, to: 488},
+ {from: 210, to: 533},
+ {from: 210, to: 579},
+ {from: 210, to: 626},
+ {from: 210, to: 627},
+ {from: 210, to: 662},
+ {from: 210, to: 705},
+ {from: 211, to: 212},
+ {from: 211, to: 221},
+ {from: 211, to: 225},
+ {from: 211, to: 261},
+ {from: 211, to: 287},
+ {from: 211, to: 319},
+ {from: 211, to: 358},
+ {from: 211, to: 419},
+ {from: 211, to: 424},
+ {from: 211, to: 450},
+ {from: 211, to: 451},
+ {from: 211, to: 462},
+ {from: 211, to: 486},
+ {from: 211, to: 487},
+ {from: 211, to: 555},
+ {from: 211, to: 600},
+ {from: 211, to: 608},
+ {from: 211, to: 618},
+ {from: 211, to: 642},
+ {from: 211, to: 645},
+ {from: 212, to: 221},
+ {from: 212, to: 225},
+ {from: 212, to: 261},
+ {from: 212, to: 287},
+ {from: 212, to: 319},
+ {from: 212, to: 358},
+ {from: 212, to: 419},
+ {from: 212, to: 424},
+ {from: 212, to: 425},
+ {from: 212, to: 449},
+ {from: 212, to: 450},
+ {from: 212, to: 451},
+ {from: 212, to: 462},
+ {from: 212, to: 487},
+ {from: 212, to: 490},
+ {from: 212, to: 555},
+ {from: 212, to: 600},
+ {from: 212, to: 608},
+ {from: 212, to: 622},
+ {from: 212, to: 642},
+ {from: 212, to: 645},
+ {from: 212, to: 675},
+ {from: 212, to: 676},
+ {from: 212, to: 728},
+ {from: 213, to: 242},
+ {from: 213, to: 265},
+ {from: 213, to: 326},
+ {from: 213, to: 341},
+ {from: 213, to: 365},
+ {from: 213, to: 375},
+ {from: 213, to: 406},
+ {from: 213, to: 476},
+ {from: 213, to: 502},
+ {from: 213, to: 513},
+ {from: 213, to: 530},
+ {from: 213, to: 544},
+ {from: 213, to: 635},
+ {from: 213, to: 681},
+ {from: 213, to: 683},
+ {from: 214, to: 223},
+ {from: 214, to: 230},
+ {from: 214, to: 239},
+ {from: 214, to: 262},
+ {from: 214, to: 320},
+ {from: 214, to: 344},
+ {from: 214, to: 354},
+ {from: 214, to: 361},
+ {from: 214, to: 362},
+ {from: 214, to: 445},
+ {from: 214, to: 483},
+ {from: 214, to: 484},
+ {from: 214, to: 512},
+ {from: 215, to: 241},
+ {from: 215, to: 257},
+ {from: 215, to: 260},
+ {from: 215, to: 266},
+ {from: 215, to: 271},
+ {from: 215, to: 339},
+ {from: 215, to: 364},
+ {from: 215, to: 445},
+ {from: 215, to: 453},
+ {from: 215, to: 504},
+ {from: 215, to: 578},
+ {from: 215, to: 596},
+ {from: 215, to: 602},
+ {from: 215, to: 610},
+ {from: 215, to: 638},
+ {from: 215, to: 661},
+ {from: 215, to: 665},
+ {from: 215, to: 690},
+ {from: 215, to: 692},
+ {from: 215, to: 693},
+ {from: 215, to: 721},
+ {from: 215, to: 723},
+ {from: 216, to: 277},
+ {from: 216, to: 286},
+ {from: 216, to: 294},
+ {from: 216, to: 332},
+ {from: 216, to: 333},
+ {from: 216, to: 381},
+ {from: 216, to: 428},
+ {from: 216, to: 432},
+ {from: 216, to: 443},
+ {from: 216, to: 511},
+ {from: 216, to: 528},
+ {from: 216, to: 571},
+ {from: 216, to: 580},
+ {from: 216, to: 589},
+ {from: 216, to: 593},
+ {from: 216, to: 601},
+ {from: 216, to: 618},
+ {from: 216, to: 619},
+ {from: 216, to: 623},
+ {from: 216, to: 644},
+ {from: 216, to: 652},
+ {from: 216, to: 703},
+ {from: 216, to: 716},
+ {from: 216, to: 719},
+ {from: 217, to: 278},
+ {from: 217, to: 321},
+ {from: 217, to: 337},
+ {from: 217, to: 407},
+ {from: 217, to: 420},
+ {from: 217, to: 488},
+ {from: 217, to: 533},
+ {from: 217, to: 579},
+ {from: 217, to: 625},
+ {from: 217, to: 626},
+ {from: 217, to: 627},
+ {from: 217, to: 662},
+ {from: 217, to: 705},
+ {from: 218, to: 221},
+ {from: 218, to: 260},
+ {from: 218, to: 261},
+ {from: 218, to: 274},
+ {from: 218, to: 279},
+ {from: 218, to: 296},
+ {from: 218, to: 366},
+ {from: 218, to: 418},
+ {from: 218, to: 422},
+ {from: 218, to: 435},
+ {from: 218, to: 493},
+ {from: 218, to: 494},
+ {from: 218, to: 519},
+ {from: 218, to: 525},
+ {from: 218, to: 526},
+ {from: 218, to: 572},
+ {from: 218, to: 582},
+ {from: 218, to: 585},
+ {from: 218, to: 591},
+ {from: 218, to: 605},
+ {from: 218, to: 631},
+ {from: 218, to: 655},
+ {from: 218, to: 693},
+ {from: 218, to: 722},
+ {from: 219, to: 234},
+ {from: 219, to: 304},
+ {from: 219, to: 309},
+ {from: 219, to: 366},
+ {from: 219, to: 369},
+ {from: 219, to: 370},
+ {from: 219, to: 457},
+ {from: 219, to: 554},
+ {from: 219, to: 630},
+ {from: 219, to: 672},
+ {from: 219, to: 701},
+ {from: 220, to: 272},
+ {from: 220, to: 340},
+ {from: 220, to: 346},
+ {from: 220, to: 347},
+ {from: 220, to: 387},
+ {from: 220, to: 404},
+ {from: 220, to: 437},
+ {from: 220, to: 503},
+ {from: 220, to: 520},
+ {from: 220, to: 590},
+ {from: 220, to: 628},
+ {from: 220, to: 664},
+ {from: 220, to: 670},
+ {from: 220, to: 709},
+ {from: 221, to: 225},
+ {from: 221, to: 260},
+ {from: 221, to: 261},
+ {from: 221, to: 279},
+ {from: 221, to: 287},
+ {from: 221, to: 319},
+ {from: 221, to: 358},
+ {from: 221, to: 366},
+ {from: 221, to: 419},
+ {from: 221, to: 422},
+ {from: 221, to: 424},
+ {from: 221, to: 450},
+ {from: 221, to: 451},
+ {from: 221, to: 462},
+ {from: 221, to: 487},
+ {from: 221, to: 555},
+ {from: 221, to: 572},
+ {from: 221, to: 591},
+ {from: 221, to: 600},
+ {from: 221, to: 608},
+ {from: 221, to: 642},
+ {from: 221, to: 645},
+ {from: 221, to: 693},
+ {from: 222, to: 228},
+ {from: 222, to: 235},
+ {from: 222, to: 236},
+ {from: 222, to: 305},
+ {from: 222, to: 324},
+ {from: 222, to: 334},
+ {from: 222, to: 353},
+ {from: 222, to: 368},
+ {from: 222, to: 429},
+ {from: 222, to: 489},
+ {from: 222, to: 499},
+ {from: 222, to: 548},
+ {from: 222, to: 552},
+ {from: 222, to: 595},
+ {from: 222, to: 710},
+ {from: 223, to: 230},
+ {from: 223, to: 239},
+ {from: 223, to: 262},
+ {from: 223, to: 320},
+ {from: 223, to: 344},
+ {from: 223, to: 354},
+ {from: 223, to: 361},
+ {from: 223, to: 362},
+ {from: 223, to: 445},
+ {from: 223, to: 483},
+ {from: 223, to: 484},
+ {from: 223, to: 512},
+ {from: 224, to: 233},
+ {from: 224, to: 279},
+ {from: 224, to: 280},
+ {from: 224, to: 289},
+ {from: 224, to: 308},
+ {from: 224, to: 323},
+ {from: 224, to: 331},
+ {from: 224, to: 335},
+ {from: 224, to: 376},
+ {from: 224, to: 431},
+ {from: 224, to: 436},
+ {from: 224, to: 443},
+ {from: 224, to: 462},
+ {from: 224, to: 490},
+ {from: 224, to: 529},
+ {from: 224, to: 547},
+ {from: 224, to: 555},
+ {from: 224, to: 567},
+ {from: 224, to: 586},
+ {from: 224, to: 642},
+ {from: 224, to: 676},
+ {from: 224, to: 699},
+ {from: 224, to: 707},
+ {from: 224, to: 717},
+ {from: 224, to: 726},
+ {from: 225, to: 261},
+ {from: 225, to: 287},
+ {from: 225, to: 319},
+ {from: 225, to: 358},
+ {from: 225, to: 419},
+ {from: 225, to: 424},
+ {from: 225, to: 450},
+ {from: 225, to: 451},
+ {from: 225, to: 462},
+ {from: 225, to: 487},
+ {from: 225, to: 555},
+ {from: 225, to: 600},
+ {from: 225, to: 608},
+ {from: 225, to: 642},
+ {from: 225, to: 645},
+ {from: 226, to: 240},
+ {from: 226, to: 302},
+ {from: 226, to: 352},
+ {from: 226, to: 359},
+ {from: 226, to: 430},
+ {from: 226, to: 461},
+ {from: 226, to: 463},
+ {from: 226, to: 486},
+ {from: 226, to: 531},
+ {from: 226, to: 607},
+ {from: 226, to: 634},
+ {from: 226, to: 711},
+ {from: 226, to: 714},
+ {from: 227, to: 231},
+ {from: 227, to: 238},
+ {from: 227, to: 245},
+ {from: 227, to: 294},
+ {from: 227, to: 316},
+ {from: 227, to: 342},
+ {from: 227, to: 349},
+ {from: 227, to: 371},
+ {from: 227, to: 373},
+ {from: 227, to: 397},
+ {from: 227, to: 547},
+ {from: 227, to: 569},
+ {from: 227, to: 572},
+ {from: 227, to: 586},
+ {from: 227, to: 591},
+ {from: 227, to: 627},
+ {from: 227, to: 629},
+ {from: 227, to: 643},
+ {from: 227, to: 644},
+ {from: 227, to: 717},
+ {from: 227, to: 719},
+ {from: 227, to: 720},
+ {from: 228, to: 235},
+ {from: 228, to: 236},
+ {from: 228, to: 305},
+ {from: 228, to: 324},
+ {from: 228, to: 334},
+ {from: 228, to: 353},
+ {from: 228, to: 368},
+ {from: 228, to: 429},
+ {from: 228, to: 489},
+ {from: 228, to: 499},
+ {from: 228, to: 548},
+ {from: 228, to: 552},
+ {from: 228, to: 595},
+ {from: 228, to: 710},
+ {from: 229, to: 256},
+ {from: 229, to: 267},
+ {from: 229, to: 275},
+ {from: 229, to: 276},
+ {from: 229, to: 295},
+ {from: 229, to: 317},
+ {from: 229, to: 318},
+ {from: 229, to: 355},
+ {from: 229, to: 357},
+ {from: 229, to: 446},
+ {from: 229, to: 509},
+ {from: 229, to: 510},
+ {from: 229, to: 546},
+ {from: 229, to: 564},
+ {from: 229, to: 581},
+ {from: 229, to: 592},
+ {from: 230, to: 239},
+ {from: 230, to: 262},
+ {from: 230, to: 320},
+ {from: 230, to: 344},
+ {from: 230, to: 354},
+ {from: 230, to: 361},
+ {from: 230, to: 362},
+ {from: 230, to: 445},
+ {from: 230, to: 483},
+ {from: 230, to: 484},
+ {from: 230, to: 512},
+ {from: 231, to: 232},
+ {from: 231, to: 238},
+ {from: 231, to: 258},
+ {from: 231, to: 303},
+ {from: 231, to: 308},
+ {from: 231, to: 335},
+ {from: 231, to: 342},
+ {from: 231, to: 348},
+ {from: 231, to: 415},
+ {from: 231, to: 434},
+ {from: 231, to: 547},
+ {from: 231, to: 575},
+ {from: 231, to: 576},
+ {from: 231, to: 583},
+ {from: 231, to: 586},
+ {from: 231, to: 603},
+ {from: 231, to: 616},
+ {from: 231, to: 627},
+ {from: 231, to: 668},
+ {from: 231, to: 713},
+ {from: 231, to: 717},
+ {from: 232, to: 238},
+ {from: 232, to: 254},
+ {from: 232, to: 258},
+ {from: 232, to: 303},
+ {from: 232, to: 308},
+ {from: 232, to: 335},
+ {from: 232, to: 348},
+ {from: 232, to: 415},
+ {from: 232, to: 434},
+ {from: 232, to: 575},
+ {from: 232, to: 576},
+ {from: 232, to: 583},
+ {from: 232, to: 603},
+ {from: 232, to: 616},
+ {from: 232, to: 668},
+ {from: 232, to: 713},
+ {from: 233, to: 279},
+ {from: 233, to: 280},
+ {from: 233, to: 289},
+ {from: 233, to: 323},
+ {from: 233, to: 331},
+ {from: 233, to: 376},
+ {from: 233, to: 431},
+ {from: 233, to: 436},
+ {from: 233, to: 443},
+ {from: 233, to: 490},
+ {from: 233, to: 529},
+ {from: 233, to: 547},
+ {from: 233, to: 567},
+ {from: 233, to: 586},
+ {from: 233, to: 676},
+ {from: 233, to: 699},
+ {from: 233, to: 717},
+ {from: 234, to: 280},
+ {from: 234, to: 287},
+ {from: 234, to: 304},
+ {from: 234, to: 309},
+ {from: 234, to: 366},
+ {from: 234, to: 369},
+ {from: 234, to: 370},
+ {from: 234, to: 457},
+ {from: 234, to: 469},
+ {from: 234, to: 554},
+ {from: 234, to: 600},
+ {from: 234, to: 608},
+ {from: 234, to: 630},
+ {from: 234, to: 631},
+ {from: 234, to: 672},
+ {from: 234, to: 701},
+ {from: 234, to: 734},
+ {from: 235, to: 236},
+ {from: 235, to: 305},
+ {from: 235, to: 324},
+ {from: 235, to: 334},
+ {from: 235, to: 353},
+ {from: 235, to: 368},
+ {from: 235, to: 429},
+ {from: 235, to: 489},
+ {from: 235, to: 499},
+ {from: 235, to: 548},
+ {from: 235, to: 552},
+ {from: 235, to: 595},
+ {from: 235, to: 710},
+ {from: 236, to: 305},
+ {from: 236, to: 324},
+ {from: 236, to: 334},
+ {from: 236, to: 353},
+ {from: 236, to: 368},
+ {from: 236, to: 429},
+ {from: 236, to: 489},
+ {from: 236, to: 499},
+ {from: 236, to: 548},
+ {from: 236, to: 552},
+ {from: 236, to: 595},
+ {from: 236, to: 710},
+ {from: 237, to: 249},
+ {from: 237, to: 252},
+ {from: 237, to: 291},
+ {from: 237, to: 416},
+ {from: 237, to: 422},
+ {from: 237, to: 447},
+ {from: 237, to: 449},
+ {from: 237, to: 452},
+ {from: 237, to: 478},
+ {from: 237, to: 481},
+ {from: 237, to: 482},
+ {from: 237, to: 622},
+ {from: 237, to: 675},
+ {from: 237, to: 711},
+ {from: 238, to: 258},
+ {from: 238, to: 303},
+ {from: 238, to: 308},
+ {from: 238, to: 335},
+ {from: 238, to: 342},
+ {from: 238, to: 348},
+ {from: 238, to: 415},
+ {from: 238, to: 434},
+ {from: 238, to: 547},
+ {from: 238, to: 575},
+ {from: 238, to: 576},
+ {from: 238, to: 583},
+ {from: 238, to: 586},
+ {from: 238, to: 603},
+ {from: 238, to: 616},
+ {from: 238, to: 627},
+ {from: 238, to: 668},
+ {from: 238, to: 713},
+ {from: 238, to: 717},
+ {from: 239, to: 262},
+ {from: 239, to: 320},
+ {from: 239, to: 344},
+ {from: 239, to: 354},
+ {from: 239, to: 361},
+ {from: 239, to: 362},
+ {from: 239, to: 391},
+ {from: 239, to: 445},
+ {from: 239, to: 483},
+ {from: 239, to: 484},
+ {from: 239, to: 512},
+ {from: 240, to: 352},
+ {from: 240, to: 359},
+ {from: 240, to: 430},
+ {from: 240, to: 434},
+ {from: 240, to: 461},
+ {from: 240, to: 463},
+ {from: 240, to: 486},
+ {from: 240, to: 491},
+ {from: 240, to: 521},
+ {from: 240, to: 531},
+ {from: 240, to: 603},
+ {from: 240, to: 607},
+ {from: 240, to: 634},
+ {from: 240, to: 711},
+ {from: 241, to: 260},
+ {from: 241, to: 266},
+ {from: 241, to: 271},
+ {from: 241, to: 339},
+ {from: 241, to: 364},
+ {from: 241, to: 453},
+ {from: 241, to: 480},
+ {from: 241, to: 497},
+ {from: 241, to: 504},
+ {from: 241, to: 578},
+ {from: 241, to: 596},
+ {from: 241, to: 602},
+ {from: 241, to: 610},
+ {from: 241, to: 661},
+ {from: 241, to: 665},
+ {from: 241, to: 690},
+ {from: 241, to: 692},
+ {from: 241, to: 693},
+ {from: 241, to: 721},
+ {from: 241, to: 723},
+ {from: 242, to: 265},
+ {from: 242, to: 326},
+ {from: 242, to: 341},
+ {from: 242, to: 365},
+ {from: 242, to: 375},
+ {from: 242, to: 406},
+ {from: 242, to: 476},
+ {from: 242, to: 502},
+ {from: 242, to: 513},
+ {from: 242, to: 530},
+ {from: 242, to: 544},
+ {from: 242, to: 574},
+ {from: 242, to: 681},
+ {from: 242, to: 683},
+ {from: 242, to: 718},
+ {from: 243, to: 292},
+ {from: 243, to: 293},
+ {from: 243, to: 439},
+ {from: 243, to: 540},
+ {from: 243, to: 568},
+ {from: 243, to: 640},
+ {from: 243, to: 641},
+ {from: 243, to: 695},
+ {from: 243, to: 704},
+ {from: 243, to: 708},
+ {from: 243, to: 732},
+ {from: 243, to: 733},
+ {from: 244, to: 314},
+ {from: 244, to: 325},
+ {from: 244, to: 338},
+ {from: 244, to: 345},
+ {from: 244, to: 350},
+ {from: 244, to: 396},
+ {from: 244, to: 417},
+ {from: 244, to: 496},
+ {from: 244, to: 507},
+ {from: 244, to: 534},
+ {from: 244, to: 566},
+ {from: 244, to: 606},
+ {from: 244, to: 613},
+ {from: 244, to: 630},
+ {from: 244, to: 659},
+ {from: 244, to: 673},
+ {from: 244, to: 682},
+ {from: 244, to: 714},
+ {from: 245, to: 294},
+ {from: 245, to: 316},
+ {from: 245, to: 319},
+ {from: 245, to: 349},
+ {from: 245, to: 368},
+ {from: 245, to: 371},
+ {from: 245, to: 373},
+ {from: 245, to: 397},
+ {from: 245, to: 419},
+ {from: 245, to: 429},
+ {from: 245, to: 489},
+ {from: 245, to: 529},
+ {from: 245, to: 569},
+ {from: 245, to: 572},
+ {from: 245, to: 591},
+ {from: 245, to: 629},
+ {from: 245, to: 643},
+ {from: 245, to: 644},
+ {from: 245, to: 719},
+ {from: 245, to: 720},
+ {from: 246, to: 257},
+ {from: 246, to: 297},
+ {from: 246, to: 322},
+ {from: 246, to: 398},
+ {from: 246, to: 436},
+ {from: 246, to: 474},
+ {from: 246, to: 485},
+ {from: 246, to: 516},
+ {from: 246, to: 553},
+ {from: 246, to: 621},
+ {from: 246, to: 632},
+ {from: 246, to: 638},
+ {from: 246, to: 639},
+ {from: 246, to: 657},
+ {from: 246, to: 671},
+ {from: 246, to: 696},
+ {from: 246, to: 715},
+ {from: 246, to: 726},
+ {from: 247, to: 273},
+ {from: 247, to: 284},
+ {from: 247, to: 306},
+ {from: 247, to: 315},
+ {from: 247, to: 380},
+ {from: 247, to: 389},
+ {from: 247, to: 467},
+ {from: 247, to: 495},
+ {from: 247, to: 570},
+ {from: 247, to: 584},
+ {from: 247, to: 598},
+ {from: 247, to: 599},
+ {from: 247, to: 666},
+ {from: 248, to: 336},
+ {from: 248, to: 343},
+ {from: 248, to: 360},
+ {from: 248, to: 378},
+ {from: 248, to: 388},
+ {from: 248, to: 448},
+ {from: 248, to: 501},
+ {from: 248, to: 506},
+ {from: 248, to: 550},
+ {from: 248, to: 563},
+ {from: 248, to: 588},
+ {from: 248, to: 617},
+ {from: 248, to: 712},
+ {from: 248, to: 727},
+ {from: 249, to: 252},
+ {from: 249, to: 291},
+ {from: 249, to: 404},
+ {from: 249, to: 416},
+ {from: 249, to: 422},
+ {from: 249, to: 447},
+ {from: 249, to: 449},
+ {from: 249, to: 452},
+ {from: 249, to: 461},
+ {from: 249, to: 478},
+ {from: 249, to: 481},
+ {from: 249, to: 482},
+ {from: 249, to: 483},
+ {from: 249, to: 565},
+ {from: 249, to: 622},
+ {from: 249, to: 661},
+ {from: 249, to: 675},
+ {from: 250, to: 251},
+ {from: 250, to: 253},
+ {from: 250, to: 254},
+ {from: 250, to: 255},
+ {from: 250, to: 356},
+ {from: 250, to: 400},
+ {from: 250, to: 401},
+ {from: 250, to: 402},
+ {from: 250, to: 410},
+ {from: 250, to: 423},
+ {from: 250, to: 482},
+ {from: 250, to: 545},
+ {from: 250, to: 556},
+ {from: 250, to: 557},
+ {from: 250, to: 558},
+ {from: 250, to: 653},
+ {from: 250, to: 656},
+ {from: 250, to: 660},
+ {from: 250, to: 674},
+ {from: 250, to: 694},
+ {from: 250, to: 696},
+ {from: 251, to: 253},
+ {from: 251, to: 254},
+ {from: 251, to: 255},
+ {from: 251, to: 336},
+ {from: 251, to: 356},
+ {from: 251, to: 400},
+ {from: 251, to: 401},
+ {from: 251, to: 402},
+ {from: 251, to: 410},
+ {from: 251, to: 423},
+ {from: 251, to: 545},
+ {from: 251, to: 556},
+ {from: 251, to: 557},
+ {from: 251, to: 558},
+ {from: 251, to: 656},
+ {from: 251, to: 660},
+ {from: 251, to: 674},
+ {from: 251, to: 694},
+ {from: 251, to: 696},
+ {from: 252, to: 291},
+ {from: 252, to: 404},
+ {from: 252, to: 416},
+ {from: 252, to: 422},
+ {from: 252, to: 447},
+ {from: 252, to: 449},
+ {from: 252, to: 452},
+ {from: 252, to: 461},
+ {from: 252, to: 478},
+ {from: 252, to: 481},
+ {from: 252, to: 482},
+ {from: 252, to: 483},
+ {from: 252, to: 565},
+ {from: 252, to: 622},
+ {from: 252, to: 661},
+ {from: 252, to: 675},
+ {from: 253, to: 254},
+ {from: 253, to: 255},
+ {from: 253, to: 356},
+ {from: 253, to: 400},
+ {from: 253, to: 401},
+ {from: 253, to: 402},
+ {from: 253, to: 410},
+ {from: 253, to: 423},
+ {from: 253, to: 545},
+ {from: 253, to: 556},
+ {from: 253, to: 557},
+ {from: 253, to: 558},
+ {from: 253, to: 656},
+ {from: 253, to: 660},
+ {from: 253, to: 674},
+ {from: 253, to: 694},
+ {from: 253, to: 696},
+ {from: 254, to: 255},
+ {from: 254, to: 356},
+ {from: 254, to: 400},
+ {from: 254, to: 401},
+ {from: 254, to: 402},
+ {from: 254, to: 410},
+ {from: 254, to: 423},
+ {from: 254, to: 545},
+ {from: 254, to: 556},
+ {from: 254, to: 557},
+ {from: 254, to: 558},
+ {from: 254, to: 656},
+ {from: 254, to: 660},
+ {from: 254, to: 674},
+ {from: 254, to: 694},
+ {from: 254, to: 696},
+ {from: 255, to: 356},
+ {from: 255, to: 400},
+ {from: 255, to: 401},
+ {from: 255, to: 402},
+ {from: 255, to: 410},
+ {from: 255, to: 423},
+ {from: 255, to: 545},
+ {from: 255, to: 556},
+ {from: 255, to: 557},
+ {from: 255, to: 558},
+ {from: 255, to: 656},
+ {from: 255, to: 660},
+ {from: 255, to: 674},
+ {from: 255, to: 694},
+ {from: 255, to: 696},
+ {from: 256, to: 267},
+ {from: 256, to: 275},
+ {from: 256, to: 276},
+ {from: 256, to: 295},
+ {from: 256, to: 317},
+ {from: 256, to: 318},
+ {from: 256, to: 355},
+ {from: 256, to: 357},
+ {from: 256, to: 446},
+ {from: 256, to: 509},
+ {from: 256, to: 510},
+ {from: 256, to: 546},
+ {from: 256, to: 564},
+ {from: 256, to: 581},
+ {from: 256, to: 592},
+ {from: 257, to: 297},
+ {from: 257, to: 322},
+ {from: 257, to: 398},
+ {from: 257, to: 445},
+ {from: 257, to: 474},
+ {from: 257, to: 485},
+ {from: 257, to: 553},
+ {from: 257, to: 621},
+ {from: 257, to: 632},
+ {from: 257, to: 638},
+ {from: 257, to: 639},
+ {from: 257, to: 657},
+ {from: 257, to: 671},
+ {from: 257, to: 692},
+ {from: 257, to: 715},
+ {from: 257, to: 723},
+ {from: 257, to: 726},
+ {from: 258, to: 303},
+ {from: 258, to: 308},
+ {from: 258, to: 335},
+ {from: 258, to: 348},
+ {from: 258, to: 398},
+ {from: 258, to: 415},
+ {from: 258, to: 430},
+ {from: 258, to: 434},
+ {from: 258, to: 440},
+ {from: 258, to: 575},
+ {from: 258, to: 576},
+ {from: 258, to: 583},
+ {from: 258, to: 603},
+ {from: 258, to: 616},
+ {from: 258, to: 654},
+ {from: 258, to: 668},
+ {from: 258, to: 702},
+ {from: 258, to: 713},
+ {from: 259, to: 342},
+ {from: 259, to: 363},
+ {from: 259, to: 379},
+ {from: 259, to: 383},
+ {from: 259, to: 403},
+ {from: 259, to: 500},
+ {from: 259, to: 505},
+ {from: 259, to: 537},
+ {from: 259, to: 553},
+ {from: 259, to: 574},
+ {from: 259, to: 587},
+ {from: 259, to: 597},
+ {from: 259, to: 649},
+ {from: 259, to: 691},
+ {from: 259, to: 702},
+ {from: 259, to: 706},
+ {from: 260, to: 261},
+ {from: 260, to: 266},
+ {from: 260, to: 271},
+ {from: 260, to: 279},
+ {from: 260, to: 339},
+ {from: 260, to: 364},
+ {from: 260, to: 366},
+ {from: 260, to: 422},
+ {from: 260, to: 453},
+ {from: 260, to: 504},
+ {from: 260, to: 572},
+ {from: 260, to: 578},
+ {from: 260, to: 591},
+ {from: 260, to: 596},
+ {from: 260, to: 602},
+ {from: 260, to: 610},
+ {from: 260, to: 661},
+ {from: 260, to: 665},
+ {from: 260, to: 690},
+ {from: 260, to: 692},
+ {from: 260, to: 693},
+ {from: 260, to: 721},
+ {from: 260, to: 723},
+ {from: 261, to: 279},
+ {from: 261, to: 287},
+ {from: 261, to: 319},
+ {from: 261, to: 358},
+ {from: 261, to: 366},
+ {from: 261, to: 419},
+ {from: 261, to: 422},
+ {from: 261, to: 424},
+ {from: 261, to: 450},
+ {from: 261, to: 451},
+ {from: 261, to: 462},
+ {from: 261, to: 487},
+ {from: 261, to: 555},
+ {from: 261, to: 572},
+ {from: 261, to: 591},
+ {from: 261, to: 600},
+ {from: 261, to: 608},
+ {from: 261, to: 642},
+ {from: 261, to: 645},
+ {from: 261, to: 693},
+ {from: 262, to: 320},
+ {from: 262, to: 344},
+ {from: 262, to: 354},
+ {from: 262, to: 361},
+ {from: 262, to: 362},
+ {from: 262, to: 445},
+ {from: 262, to: 483},
+ {from: 262, to: 484},
+ {from: 262, to: 512},
+ {from: 263, to: 299},
+ {from: 263, to: 300},
+ {from: 263, to: 301},
+ {from: 263, to: 432},
+ {from: 263, to: 444},
+ {from: 263, to: 455},
+ {from: 263, to: 469},
+ {from: 263, to: 514},
+ {from: 263, to: 535},
+ {from: 263, to: 539},
+ {from: 263, to: 542},
+ {from: 263, to: 624},
+ {from: 263, to: 653},
+ {from: 263, to: 660},
+ {from: 263, to: 669},
+ {from: 263, to: 698},
+ {from: 264, to: 281},
+ {from: 264, to: 282},
+ {from: 264, to: 285},
+ {from: 264, to: 382},
+ {from: 264, to: 438},
+ {from: 264, to: 441},
+ {from: 264, to: 465},
+ {from: 264, to: 466},
+ {from: 264, to: 491},
+ {from: 264, to: 646},
+ {from: 264, to: 647},
+ {from: 264, to: 650},
+ {from: 264, to: 651},
+ {from: 264, to: 689},
+ {from: 264, to: 697},
+ {from: 264, to: 724},
+ {from: 264, to: 725},
+ {from: 264, to: 729},
+ {from: 264, to: 730},
+ {from: 264, to: 734},
+ {from: 264, to: 735},
+ {from: 265, to: 326},
+ {from: 265, to: 341},
+ {from: 265, to: 365},
+ {from: 265, to: 375},
+ {from: 265, to: 406},
+ {from: 265, to: 476},
+ {from: 265, to: 502},
+ {from: 265, to: 513},
+ {from: 265, to: 530},
+ {from: 265, to: 544},
+ {from: 265, to: 681},
+ {from: 265, to: 683},
+ {from: 266, to: 271},
+ {from: 266, to: 339},
+ {from: 266, to: 364},
+ {from: 266, to: 453},
+ {from: 266, to: 504},
+ {from: 266, to: 578},
+ {from: 266, to: 596},
+ {from: 266, to: 602},
+ {from: 266, to: 610},
+ {from: 266, to: 661},
+ {from: 266, to: 665},
+ {from: 266, to: 690},
+ {from: 266, to: 692},
+ {from: 266, to: 693},
+ {from: 266, to: 721},
+ {from: 266, to: 723},
+ {from: 267, to: 275},
+ {from: 267, to: 276},
+ {from: 267, to: 295},
+ {from: 267, to: 317},
+ {from: 267, to: 318},
+ {from: 267, to: 355},
+ {from: 267, to: 357},
+ {from: 267, to: 446},
+ {from: 267, to: 494},
+ {from: 267, to: 509},
+ {from: 267, to: 510},
+ {from: 267, to: 546},
+ {from: 267, to: 564},
+ {from: 267, to: 581},
+ {from: 267, to: 592},
+ {from: 268, to: 269},
+ {from: 268, to: 283},
+ {from: 268, to: 290},
+ {from: 268, to: 330},
+ {from: 268, to: 377},
+ {from: 268, to: 390},
+ {from: 268, to: 391},
+ {from: 268, to: 392},
+ {from: 268, to: 393},
+ {from: 268, to: 394},
+ {from: 268, to: 395},
+ {from: 268, to: 399},
+ {from: 268, to: 405},
+ {from: 268, to: 411},
+ {from: 268, to: 412},
+ {from: 268, to: 413},
+ {from: 268, to: 414},
+ {from: 268, to: 559},
+ {from: 268, to: 560},
+ {from: 268, to: 561},
+ {from: 268, to: 658},
+ {from: 268, to: 731},
+ {from: 269, to: 283},
+ {from: 269, to: 290},
+ {from: 269, to: 330},
+ {from: 269, to: 377},
+ {from: 269, to: 390},
+ {from: 269, to: 391},
+ {from: 269, to: 392},
+ {from: 269, to: 393},
+ {from: 269, to: 394},
+ {from: 269, to: 395},
+ {from: 269, to: 399},
+ {from: 269, to: 405},
+ {from: 269, to: 411},
+ {from: 269, to: 412},
+ {from: 269, to: 413},
+ {from: 269, to: 414},
+ {from: 269, to: 559},
+ {from: 269, to: 560},
+ {from: 269, to: 561},
+ {from: 269, to: 658},
+ {from: 269, to: 731},
+ {from: 270, to: 302},
+ {from: 270, to: 312},
+ {from: 270, to: 497},
+ {from: 270, to: 516},
+ {from: 270, to: 524},
+ {from: 270, to: 538},
+ {from: 270, to: 633},
+ {from: 270, to: 635},
+ {from: 270, to: 636},
+ {from: 270, to: 637},
+ {from: 270, to: 684},
+ {from: 270, to: 688},
+ {from: 270, to: 697},
+ {from: 270, to: 736},
+ {from: 271, to: 339},
+ {from: 271, to: 364},
+ {from: 271, to: 453},
+ {from: 271, to: 504},
+ {from: 271, to: 578},
+ {from: 271, to: 596},
+ {from: 271, to: 602},
+ {from: 271, to: 610},
+ {from: 271, to: 615},
+ {from: 271, to: 661},
+ {from: 271, to: 665},
+ {from: 271, to: 690},
+ {from: 271, to: 692},
+ {from: 271, to: 693},
+ {from: 271, to: 721},
+ {from: 271, to: 723},
+ {from: 272, to: 340},
+ {from: 272, to: 346},
+ {from: 272, to: 347},
+ {from: 272, to: 387},
+ {from: 272, to: 404},
+ {from: 272, to: 437},
+ {from: 272, to: 503},
+ {from: 272, to: 520},
+ {from: 272, to: 590},
+ {from: 272, to: 628},
+ {from: 272, to: 664},
+ {from: 272, to: 670},
+ {from: 272, to: 709},
+ {from: 273, to: 284},
+ {from: 273, to: 306},
+ {from: 273, to: 315},
+ {from: 273, to: 380},
+ {from: 273, to: 389},
+ {from: 273, to: 467},
+ {from: 273, to: 495},
+ {from: 273, to: 570},
+ {from: 273, to: 584},
+ {from: 273, to: 598},
+ {from: 273, to: 599},
+ {from: 273, to: 666},
+ {from: 274, to: 296},
+ {from: 274, to: 418},
+ {from: 274, to: 435},
+ {from: 274, to: 493},
+ {from: 274, to: 494},
+ {from: 274, to: 519},
+ {from: 274, to: 525},
+ {from: 274, to: 526},
+ {from: 274, to: 582},
+ {from: 274, to: 585},
+ {from: 274, to: 605},
+ {from: 274, to: 631},
+ {from: 274, to: 655},
+ {from: 274, to: 722},
+ {from: 275, to: 276},
+ {from: 275, to: 295},
+ {from: 275, to: 304},
+ {from: 275, to: 317},
+ {from: 275, to: 318},
+ {from: 275, to: 352},
+ {from: 275, to: 355},
+ {from: 275, to: 357},
+ {from: 275, to: 369},
+ {from: 275, to: 446},
+ {from: 275, to: 509},
+ {from: 275, to: 510},
+ {from: 275, to: 526},
+ {from: 275, to: 546},
+ {from: 275, to: 564},
+ {from: 275, to: 581},
+ {from: 275, to: 592},
+ {from: 275, to: 652},
+ {from: 275, to: 667},
+ {from: 276, to: 295},
+ {from: 276, to: 317},
+ {from: 276, to: 318},
+ {from: 276, to: 355},
+ {from: 276, to: 357},
+ {from: 276, to: 446},
+ {from: 276, to: 509},
+ {from: 276, to: 510},
+ {from: 276, to: 546},
+ {from: 276, to: 564},
+ {from: 276, to: 581},
+ {from: 276, to: 592},
+ {from: 277, to: 286},
+ {from: 277, to: 332},
+ {from: 277, to: 333},
+ {from: 277, to: 424},
+ {from: 277, to: 428},
+ {from: 277, to: 511},
+ {from: 277, to: 517},
+ {from: 277, to: 528},
+ {from: 277, to: 537},
+ {from: 277, to: 571},
+ {from: 277, to: 580},
+ {from: 277, to: 593},
+ {from: 277, to: 601},
+ {from: 277, to: 618},
+ {from: 277, to: 619},
+ {from: 277, to: 636},
+ {from: 277, to: 652},
+ {from: 277, to: 703},
+ {from: 277, to: 716},
+ {from: 278, to: 321},
+ {from: 278, to: 337},
+ {from: 278, to: 407},
+ {from: 278, to: 420},
+ {from: 278, to: 488},
+ {from: 278, to: 533},
+ {from: 278, to: 579},
+ {from: 278, to: 626},
+ {from: 278, to: 627},
+ {from: 278, to: 662},
+ {from: 278, to: 705},
+ {from: 279, to: 280},
+ {from: 279, to: 289},
+ {from: 279, to: 323},
+ {from: 279, to: 331},
+ {from: 279, to: 366},
+ {from: 279, to: 376},
+ {from: 279, to: 422},
+ {from: 279, to: 431},
+ {from: 279, to: 436},
+ {from: 279, to: 443},
+ {from: 279, to: 490},
+ {from: 279, to: 529},
+ {from: 279, to: 547},
+ {from: 279, to: 567},
+ {from: 279, to: 572},
+ {from: 279, to: 586},
+ {from: 279, to: 591},
+ {from: 279, to: 676},
+ {from: 279, to: 693},
+ {from: 279, to: 699},
+ {from: 279, to: 717},
+ {from: 280, to: 287},
+ {from: 280, to: 289},
+ {from: 280, to: 323},
+ {from: 280, to: 331},
+ {from: 280, to: 376},
+ {from: 280, to: 431},
+ {from: 280, to: 436},
+ {from: 280, to: 443},
+ {from: 280, to: 469},
+ {from: 280, to: 490},
+ {from: 280, to: 529},
+ {from: 280, to: 547},
+ {from: 280, to: 567},
+ {from: 280, to: 586},
+ {from: 280, to: 600},
+ {from: 280, to: 608},
+ {from: 280, to: 631},
+ {from: 280, to: 676},
+ {from: 280, to: 699},
+ {from: 280, to: 717},
+ {from: 280, to: 734},
+ {from: 281, to: 282},
+ {from: 281, to: 285},
+ {from: 281, to: 382},
+ {from: 281, to: 438},
+ {from: 281, to: 441},
+ {from: 281, to: 465},
+ {from: 281, to: 466},
+ {from: 281, to: 491},
+ {from: 281, to: 614},
+ {from: 281, to: 646},
+ {from: 281, to: 647},
+ {from: 281, to: 650},
+ {from: 281, to: 651},
+ {from: 281, to: 689},
+ {from: 281, to: 724},
+ {from: 281, to: 725},
+ {from: 281, to: 729},
+ {from: 281, to: 730},
+ {from: 281, to: 734},
+ {from: 281, to: 735},
+ {from: 282, to: 285},
+ {from: 282, to: 364},
+ {from: 282, to: 382},
+ {from: 282, to: 438},
+ {from: 282, to: 441},
+ {from: 282, to: 465},
+ {from: 282, to: 466},
+ {from: 282, to: 491},
+ {from: 282, to: 646},
+ {from: 282, to: 647},
+ {from: 282, to: 650},
+ {from: 282, to: 651},
+ {from: 282, to: 683},
+ {from: 282, to: 689},
+ {from: 282, to: 724},
+ {from: 282, to: 725},
+ {from: 282, to: 729},
+ {from: 282, to: 730},
+ {from: 282, to: 734},
+ {from: 282, to: 735},
+ {from: 283, to: 290},
+ {from: 283, to: 330},
+ {from: 283, to: 377},
+ {from: 283, to: 390},
+ {from: 283, to: 391},
+ {from: 283, to: 392},
+ {from: 283, to: 393},
+ {from: 283, to: 394},
+ {from: 283, to: 395},
+ {from: 283, to: 399},
+ {from: 283, to: 405},
+ {from: 283, to: 411},
+ {from: 283, to: 412},
+ {from: 283, to: 413},
+ {from: 283, to: 414},
+ {from: 283, to: 559},
+ {from: 283, to: 560},
+ {from: 283, to: 561},
+ {from: 283, to: 566},
+ {from: 283, to: 658},
+ {from: 283, to: 731},
+ {from: 284, to: 306},
+ {from: 284, to: 315},
+ {from: 284, to: 380},
+ {from: 284, to: 389},
+ {from: 284, to: 467},
+ {from: 284, to: 495},
+ {from: 284, to: 570},
+ {from: 284, to: 584},
+ {from: 284, to: 598},
+ {from: 284, to: 599},
+ {from: 284, to: 666},
+ {from: 285, to: 382},
+ {from: 285, to: 438},
+ {from: 285, to: 441},
+ {from: 285, to: 465},
+ {from: 285, to: 466},
+ {from: 285, to: 491},
+ {from: 285, to: 646},
+ {from: 285, to: 647},
+ {from: 285, to: 650},
+ {from: 285, to: 651},
+ {from: 285, to: 689},
+ {from: 285, to: 724},
+ {from: 285, to: 725},
+ {from: 285, to: 729},
+ {from: 285, to: 730},
+ {from: 285, to: 734},
+ {from: 285, to: 735},
+ {from: 286, to: 326},
+ {from: 286, to: 332},
+ {from: 286, to: 333},
+ {from: 286, to: 428},
+ {from: 286, to: 511},
+ {from: 286, to: 528},
+ {from: 286, to: 571},
+ {from: 286, to: 580},
+ {from: 286, to: 593},
+ {from: 286, to: 601},
+ {from: 286, to: 618},
+ {from: 286, to: 619},
+ {from: 286, to: 652},
+ {from: 286, to: 703},
+ {from: 286, to: 716},
+ {from: 287, to: 319},
+ {from: 287, to: 358},
+ {from: 287, to: 419},
+ {from: 287, to: 424},
+ {from: 287, to: 450},
+ {from: 287, to: 451},
+ {from: 287, to: 462},
+ {from: 287, to: 469},
+ {from: 287, to: 487},
+ {from: 287, to: 555},
+ {from: 287, to: 600},
+ {from: 287, to: 608},
+ {from: 287, to: 631},
+ {from: 287, to: 642},
+ {from: 287, to: 645},
+ {from: 287, to: 734},
+ {from: 288, to: 311},
+ {from: 288, to: 381},
+ {from: 288, to: 409},
+ {from: 288, to: 421},
+ {from: 288, to: 425},
+ {from: 288, to: 440},
+ {from: 288, to: 472},
+ {from: 288, to: 473},
+ {from: 288, to: 508},
+ {from: 288, to: 521},
+ {from: 288, to: 522},
+ {from: 288, to: 523},
+ {from: 288, to: 525},
+ {from: 288, to: 527},
+ {from: 288, to: 543},
+ {from: 288, to: 562},
+ {from: 288, to: 565},
+ {from: 288, to: 567},
+ {from: 288, to: 589},
+ {from: 288, to: 594},
+ {from: 288, to: 604},
+ {from: 288, to: 663},
+ {from: 288, to: 728},
+ {from: 289, to: 323},
+ {from: 289, to: 331},
+ {from: 289, to: 376},
+ {from: 289, to: 428},
+ {from: 289, to: 431},
+ {from: 289, to: 436},
+ {from: 289, to: 443},
+ {from: 289, to: 490},
+ {from: 289, to: 529},
+ {from: 289, to: 532},
+ {from: 289, to: 540},
+ {from: 289, to: 547},
+ {from: 289, to: 567},
+ {from: 289, to: 586},
+ {from: 289, to: 676},
+ {from: 289, to: 699},
+ {from: 289, to: 704},
+ {from: 289, to: 717},
+ {from: 289, to: 732},
+ {from: 290, to: 330},
+ {from: 290, to: 377},
+ {from: 290, to: 390},
+ {from: 290, to: 391},
+ {from: 290, to: 392},
+ {from: 290, to: 393},
+ {from: 290, to: 394},
+ {from: 290, to: 395},
+ {from: 290, to: 399},
+ {from: 290, to: 405},
+ {from: 290, to: 411},
+ {from: 290, to: 412},
+ {from: 290, to: 413},
+ {from: 290, to: 414},
+ {from: 290, to: 559},
+ {from: 290, to: 560},
+ {from: 290, to: 561},
+ {from: 290, to: 658},
+ {from: 290, to: 689},
+ {from: 290, to: 731},
+ {from: 291, to: 382},
+ {from: 291, to: 416},
+ {from: 291, to: 422},
+ {from: 291, to: 447},
+ {from: 291, to: 449},
+ {from: 291, to: 452},
+ {from: 291, to: 478},
+ {from: 291, to: 481},
+ {from: 291, to: 482},
+ {from: 291, to: 503},
+ {from: 291, to: 534},
+ {from: 291, to: 622},
+ {from: 291, to: 670},
+ {from: 291, to: 675},
+ {from: 292, to: 293},
+ {from: 292, to: 439},
+ {from: 292, to: 540},
+ {from: 292, to: 568},
+ {from: 292, to: 640},
+ {from: 292, to: 641},
+ {from: 292, to: 695},
+ {from: 292, to: 704},
+ {from: 292, to: 708},
+ {from: 292, to: 732},
+ {from: 292, to: 733},
+ {from: 293, to: 439},
+ {from: 293, to: 540},
+ {from: 293, to: 568},
+ {from: 293, to: 640},
+ {from: 293, to: 641},
+ {from: 293, to: 695},
+ {from: 293, to: 704},
+ {from: 293, to: 708},
+ {from: 293, to: 732},
+ {from: 293, to: 733},
+ {from: 294, to: 316},
+ {from: 294, to: 349},
+ {from: 294, to: 371},
+ {from: 294, to: 373},
+ {from: 294, to: 381},
+ {from: 294, to: 397},
+ {from: 294, to: 432},
+ {from: 294, to: 443},
+ {from: 294, to: 569},
+ {from: 294, to: 571},
+ {from: 294, to: 572},
+ {from: 294, to: 589},
+ {from: 294, to: 591},
+ {from: 294, to: 623},
+ {from: 294, to: 629},
+ {from: 294, to: 643},
+ {from: 294, to: 644},
+ {from: 294, to: 719},
+ {from: 294, to: 720},
+ {from: 295, to: 317},
+ {from: 295, to: 318},
+ {from: 295, to: 355},
+ {from: 295, to: 357},
+ {from: 295, to: 446},
+ {from: 295, to: 509},
+ {from: 295, to: 510},
+ {from: 295, to: 546},
+ {from: 295, to: 564},
+ {from: 295, to: 581},
+ {from: 295, to: 592},
+ {from: 296, to: 418},
+ {from: 296, to: 435},
+ {from: 296, to: 450},
+ {from: 296, to: 493},
+ {from: 296, to: 494},
+ {from: 296, to: 519},
+ {from: 296, to: 525},
+ {from: 296, to: 526},
+ {from: 296, to: 582},
+ {from: 296, to: 585},
+ {from: 296, to: 605},
+ {from: 296, to: 619},
+ {from: 296, to: 631},
+ {from: 296, to: 655},
+ {from: 296, to: 716},
+ {from: 296, to: 722},
+ {from: 297, to: 322},
+ {from: 297, to: 398},
+ {from: 297, to: 474},
+ {from: 297, to: 485},
+ {from: 297, to: 553},
+ {from: 297, to: 621},
+ {from: 297, to: 632},
+ {from: 297, to: 638},
+ {from: 297, to: 639},
+ {from: 297, to: 657},
+ {from: 297, to: 663},
+ {from: 297, to: 671},
+ {from: 297, to: 715},
+ {from: 297, to: 726},
+ {from: 298, to: 307},
+ {from: 298, to: 310},
+ {from: 298, to: 313},
+ {from: 298, to: 458},
+ {from: 298, to: 459},
+ {from: 298, to: 468},
+ {from: 298, to: 470},
+ {from: 298, to: 471},
+ {from: 298, to: 477},
+ {from: 298, to: 479},
+ {from: 298, to: 515},
+ {from: 298, to: 518},
+ {from: 298, to: 541},
+ {from: 298, to: 620},
+ {from: 298, to: 680},
+ {from: 298, to: 686},
+ {from: 299, to: 300},
+ {from: 299, to: 301},
+ {from: 299, to: 384},
+ {from: 299, to: 431},
+ {from: 299, to: 432},
+ {from: 299, to: 444},
+ {from: 299, to: 455},
+ {from: 299, to: 469},
+ {from: 299, to: 514},
+ {from: 299, to: 535},
+ {from: 299, to: 539},
+ {from: 299, to: 542},
+ {from: 299, to: 602},
+ {from: 299, to: 624},
+ {from: 299, to: 653},
+ {from: 299, to: 669},
+ {from: 299, to: 698},
+ {from: 299, to: 703},
+ {from: 300, to: 301},
+ {from: 300, to: 432},
+ {from: 300, to: 444},
+ {from: 300, to: 455},
+ {from: 300, to: 469},
+ {from: 300, to: 514},
+ {from: 300, to: 535},
+ {from: 300, to: 539},
+ {from: 300, to: 542},
+ {from: 300, to: 624},
+ {from: 300, to: 653},
+ {from: 300, to: 662},
+ {from: 300, to: 669},
+ {from: 300, to: 698},
+ {from: 301, to: 384},
+ {from: 301, to: 431},
+ {from: 301, to: 432},
+ {from: 301, to: 444},
+ {from: 301, to: 455},
+ {from: 301, to: 469},
+ {from: 301, to: 514},
+ {from: 301, to: 535},
+ {from: 301, to: 539},
+ {from: 301, to: 542},
+ {from: 301, to: 602},
+ {from: 301, to: 624},
+ {from: 301, to: 653},
+ {from: 301, to: 669},
+ {from: 301, to: 698},
+ {from: 301, to: 703},
+ {from: 302, to: 312},
+ {from: 302, to: 497},
+ {from: 302, to: 516},
+ {from: 302, to: 524},
+ {from: 302, to: 538},
+ {from: 302, to: 633},
+ {from: 302, to: 635},
+ {from: 302, to: 636},
+ {from: 302, to: 637},
+ {from: 302, to: 684},
+ {from: 302, to: 688},
+ {from: 302, to: 697},
+ {from: 302, to: 714},
+ {from: 302, to: 736},
+ {from: 303, to: 308},
+ {from: 303, to: 335},
+ {from: 303, to: 348},
+ {from: 303, to: 409},
+ {from: 303, to: 415},
+ {from: 303, to: 433},
+ {from: 303, to: 434},
+ {from: 303, to: 498},
+ {from: 303, to: 543},
+ {from: 303, to: 573},
+ {from: 303, to: 575},
+ {from: 303, to: 576},
+ {from: 303, to: 583},
+ {from: 303, to: 603},
+ {from: 303, to: 616},
+ {from: 303, to: 629},
+ {from: 303, to: 668},
+ {from: 303, to: 679},
+ {from: 303, to: 713},
+ {from: 304, to: 309},
+ {from: 304, to: 352},
+ {from: 304, to: 366},
+ {from: 304, to: 369},
+ {from: 304, to: 370},
+ {from: 304, to: 457},
+ {from: 304, to: 526},
+ {from: 304, to: 554},
+ {from: 304, to: 630},
+ {from: 304, to: 652},
+ {from: 304, to: 667},
+ {from: 304, to: 672},
+ {from: 304, to: 701},
+ {from: 305, to: 324},
+ {from: 305, to: 334},
+ {from: 305, to: 353},
+ {from: 305, to: 368},
+ {from: 305, to: 429},
+ {from: 305, to: 489},
+ {from: 305, to: 499},
+ {from: 305, to: 548},
+ {from: 305, to: 552},
+ {from: 305, to: 595},
+ {from: 305, to: 710},
+ {from: 306, to: 315},
+ {from: 306, to: 380},
+ {from: 306, to: 389},
+ {from: 306, to: 467},
+ {from: 306, to: 495},
+ {from: 306, to: 570},
+ {from: 306, to: 584},
+ {from: 306, to: 598},
+ {from: 306, to: 599},
+ {from: 306, to: 666},
+ {from: 307, to: 310},
+ {from: 307, to: 313},
+ {from: 307, to: 458},
+ {from: 307, to: 459},
+ {from: 307, to: 468},
+ {from: 307, to: 470},
+ {from: 307, to: 471},
+ {from: 307, to: 477},
+ {from: 307, to: 479},
+ {from: 307, to: 515},
+ {from: 307, to: 518},
+ {from: 307, to: 541},
+ {from: 307, to: 620},
+ {from: 307, to: 680},
+ {from: 307, to: 686},
+ {from: 308, to: 335},
+ {from: 308, to: 348},
+ {from: 308, to: 415},
+ {from: 308, to: 434},
+ {from: 308, to: 462},
+ {from: 308, to: 555},
+ {from: 308, to: 575},
+ {from: 308, to: 576},
+ {from: 308, to: 583},
+ {from: 308, to: 603},
+ {from: 308, to: 616},
+ {from: 308, to: 642},
+ {from: 308, to: 668},
+ {from: 308, to: 707},
+ {from: 308, to: 713},
+ {from: 308, to: 726},
+ {from: 309, to: 332},
+ {from: 309, to: 366},
+ {from: 309, to: 369},
+ {from: 309, to: 370},
+ {from: 309, to: 457},
+ {from: 309, to: 554},
+ {from: 309, to: 630},
+ {from: 309, to: 645},
+ {from: 309, to: 672},
+ {from: 309, to: 701},
+ {from: 310, to: 313},
+ {from: 310, to: 458},
+ {from: 310, to: 459},
+ {from: 310, to: 468},
+ {from: 310, to: 470},
+ {from: 310, to: 471},
+ {from: 310, to: 477},
+ {from: 310, to: 479},
+ {from: 310, to: 515},
+ {from: 310, to: 518},
+ {from: 310, to: 541},
+ {from: 310, to: 620},
+ {from: 310, to: 680},
+ {from: 310, to: 686},
+ {from: 311, to: 384},
+ {from: 311, to: 386},
+ {from: 311, to: 408},
+ {from: 311, to: 460},
+ {from: 311, to: 522},
+ {from: 311, to: 525},
+ {from: 311, to: 527},
+ {from: 311, to: 532},
+ {from: 311, to: 567},
+ {from: 311, to: 612},
+ {from: 311, to: 625},
+ {from: 311, to: 654},
+ {from: 311, to: 667},
+ {from: 311, to: 677},
+ {from: 311, to: 679},
+ {from: 311, to: 685},
+ {from: 311, to: 707},
+ {from: 312, to: 497},
+ {from: 312, to: 516},
+ {from: 312, to: 524},
+ {from: 312, to: 538},
+ {from: 312, to: 633},
+ {from: 312, to: 635},
+ {from: 312, to: 636},
+ {from: 312, to: 637},
+ {from: 312, to: 684},
+ {from: 312, to: 688},
+ {from: 312, to: 697},
+ {from: 312, to: 736},
+ {from: 313, to: 458},
+ {from: 313, to: 459},
+ {from: 313, to: 468},
+ {from: 313, to: 470},
+ {from: 313, to: 471},
+ {from: 313, to: 477},
+ {from: 313, to: 479},
+ {from: 313, to: 515},
+ {from: 313, to: 518},
+ {from: 313, to: 541},
+ {from: 313, to: 620},
+ {from: 313, to: 680},
+ {from: 313, to: 686},
+ {from: 314, to: 325},
+ {from: 314, to: 338},
+ {from: 314, to: 345},
+ {from: 314, to: 350},
+ {from: 314, to: 396},
+ {from: 314, to: 417},
+ {from: 314, to: 496},
+ {from: 314, to: 507},
+ {from: 314, to: 534},
+ {from: 314, to: 566},
+ {from: 314, to: 606},
+ {from: 314, to: 613},
+ {from: 314, to: 659},
+ {from: 314, to: 673},
+ {from: 314, to: 682},
+ {from: 314, to: 714},
+ {from: 315, to: 380},
+ {from: 315, to: 389},
+ {from: 315, to: 467},
+ {from: 315, to: 495},
+ {from: 315, to: 570},
+ {from: 315, to: 584},
+ {from: 315, to: 598},
+ {from: 315, to: 599},
+ {from: 315, to: 666},
+ {from: 316, to: 327},
+ {from: 316, to: 349},
+ {from: 316, to: 371},
+ {from: 316, to: 373},
+ {from: 316, to: 375},
+ {from: 316, to: 397},
+ {from: 316, to: 442},
+ {from: 316, to: 454},
+ {from: 316, to: 455},
+ {from: 316, to: 569},
+ {from: 316, to: 572},
+ {from: 316, to: 577},
+ {from: 316, to: 591},
+ {from: 316, to: 629},
+ {from: 316, to: 643},
+ {from: 316, to: 644},
+ {from: 316, to: 678},
+ {from: 316, to: 687},
+ {from: 316, to: 719},
+ {from: 316, to: 720},
+ {from: 316, to: 721},
+ {from: 317, to: 318},
+ {from: 317, to: 355},
+ {from: 317, to: 357},
+ {from: 317, to: 446},
+ {from: 317, to: 509},
+ {from: 317, to: 510},
+ {from: 317, to: 546},
+ {from: 317, to: 564},
+ {from: 317, to: 581},
+ {from: 317, to: 592},
+ {from: 318, to: 355},
+ {from: 318, to: 357},
+ {from: 318, to: 371},
+ {from: 318, to: 446},
+ {from: 318, to: 460},
+ {from: 318, to: 509},
+ {from: 318, to: 510},
+ {from: 318, to: 528},
+ {from: 318, to: 546},
+ {from: 318, to: 562},
+ {from: 318, to: 564},
+ {from: 318, to: 576},
+ {from: 318, to: 581},
+ {from: 318, to: 592},
+ {from: 318, to: 606},
+ {from: 318, to: 646},
+ {from: 318, to: 713},
+ {from: 319, to: 349},
+ {from: 319, to: 358},
+ {from: 319, to: 368},
+ {from: 319, to: 419},
+ {from: 319, to: 424},
+ {from: 319, to: 429},
+ {from: 319, to: 450},
+ {from: 319, to: 451},
+ {from: 319, to: 462},
+ {from: 319, to: 487},
+ {from: 319, to: 489},
+ {from: 319, to: 529},
+ {from: 319, to: 555},
+ {from: 319, to: 569},
+ {from: 319, to: 600},
+ {from: 319, to: 608},
+ {from: 319, to: 642},
+ {from: 319, to: 643},
+ {from: 319, to: 645},
+ {from: 319, to: 720},
+ {from: 320, to: 344},
+ {from: 320, to: 354},
+ {from: 320, to: 361},
+ {from: 320, to: 362},
+ {from: 320, to: 367},
+ {from: 320, to: 445},
+ {from: 320, to: 483},
+ {from: 320, to: 484},
+ {from: 320, to: 512},
+ {from: 320, to: 609},
+ {from: 321, to: 337},
+ {from: 321, to: 340},
+ {from: 321, to: 407},
+ {from: 321, to: 420},
+ {from: 321, to: 488},
+ {from: 321, to: 533},
+ {from: 321, to: 579},
+ {from: 321, to: 626},
+ {from: 321, to: 627},
+ {from: 321, to: 662},
+ {from: 321, to: 705},
+ {from: 322, to: 398},
+ {from: 322, to: 474},
+ {from: 322, to: 485},
+ {from: 322, to: 553},
+ {from: 322, to: 621},
+ {from: 322, to: 632},
+ {from: 322, to: 638},
+ {from: 322, to: 639},
+ {from: 322, to: 657},
+ {from: 322, to: 671},
+ {from: 322, to: 715},
+ {from: 322, to: 726},
+ {from: 323, to: 331},
+ {from: 323, to: 376},
+ {from: 323, to: 431},
+ {from: 323, to: 436},
+ {from: 323, to: 443},
+ {from: 323, to: 490},
+ {from: 323, to: 529},
+ {from: 323, to: 547},
+ {from: 323, to: 567},
+ {from: 323, to: 586},
+ {from: 323, to: 676},
+ {from: 323, to: 699},
+ {from: 323, to: 717},
+ {from: 324, to: 334},
+ {from: 324, to: 353},
+ {from: 324, to: 368},
+ {from: 324, to: 429},
+ {from: 324, to: 489},
+ {from: 324, to: 499},
+ {from: 324, to: 548},
+ {from: 324, to: 552},
+ {from: 324, to: 595},
+ {from: 324, to: 710},
+ {from: 325, to: 338},
+ {from: 325, to: 345},
+ {from: 325, to: 350},
+ {from: 325, to: 396},
+ {from: 325, to: 417},
+ {from: 325, to: 496},
+ {from: 325, to: 507},
+ {from: 325, to: 511},
+ {from: 325, to: 534},
+ {from: 325, to: 539},
+ {from: 325, to: 566},
+ {from: 325, to: 606},
+ {from: 325, to: 613},
+ {from: 325, to: 659},
+ {from: 325, to: 673},
+ {from: 325, to: 682},
+ {from: 325, to: 714},
+ {from: 326, to: 341},
+ {from: 326, to: 365},
+ {from: 326, to: 375},
+ {from: 326, to: 406},
+ {from: 326, to: 476},
+ {from: 326, to: 502},
+ {from: 326, to: 513},
+ {from: 326, to: 530},
+ {from: 326, to: 544},
+ {from: 326, to: 681},
+ {from: 326, to: 683},
+ {from: 327, to: 374},
+ {from: 327, to: 375},
+ {from: 327, to: 385},
+ {from: 327, to: 433},
+ {from: 327, to: 442},
+ {from: 327, to: 454},
+ {from: 327, to: 455},
+ {from: 327, to: 475},
+ {from: 327, to: 480},
+ {from: 327, to: 498},
+ {from: 327, to: 517},
+ {from: 327, to: 573},
+ {from: 327, to: 577},
+ {from: 327, to: 611},
+ {from: 327, to: 614},
+ {from: 327, to: 623},
+ {from: 327, to: 648},
+ {from: 327, to: 678},
+ {from: 327, to: 687},
+ {from: 327, to: 721},
+ {from: 328, to: 329},
+ {from: 328, to: 351},
+ {from: 328, to: 367},
+ {from: 328, to: 372},
+ {from: 328, to: 426},
+ {from: 328, to: 427},
+ {from: 328, to: 456},
+ {from: 328, to: 464},
+ {from: 328, to: 492},
+ {from: 328, to: 536},
+ {from: 328, to: 549},
+ {from: 328, to: 551},
+ {from: 328, to: 609},
+ {from: 328, to: 615},
+ {from: 328, to: 700},
+ {from: 328, to: 718},
+ {from: 329, to: 343},
+ {from: 329, to: 351},
+ {from: 329, to: 367},
+ {from: 329, to: 372},
+ {from: 329, to: 426},
+ {from: 329, to: 427},
+ {from: 329, to: 456},
+ {from: 329, to: 464},
+ {from: 329, to: 492},
+ {from: 329, to: 536},
+ {from: 329, to: 549},
+ {from: 329, to: 551},
+ {from: 329, to: 563},
+ {from: 329, to: 609},
+ {from: 329, to: 615},
+ {from: 329, to: 700},
+ {from: 329, to: 718},
+ {from: 330, to: 377},
+ {from: 330, to: 390},
+ {from: 330, to: 391},
+ {from: 330, to: 392},
+ {from: 330, to: 393},
+ {from: 330, to: 394},
+ {from: 330, to: 395},
+ {from: 330, to: 399},
+ {from: 330, to: 405},
+ {from: 330, to: 411},
+ {from: 330, to: 412},
+ {from: 330, to: 413},
+ {from: 330, to: 414},
+ {from: 330, to: 559},
+ {from: 330, to: 560},
+ {from: 330, to: 561},
+ {from: 330, to: 566},
+ {from: 330, to: 658},
+ {from: 330, to: 731},
+ {from: 331, to: 376},
+ {from: 331, to: 431},
+ {from: 331, to: 436},
+ {from: 331, to: 443},
+ {from: 331, to: 490},
+ {from: 331, to: 529},
+ {from: 331, to: 547},
+ {from: 331, to: 567},
+ {from: 331, to: 586},
+ {from: 331, to: 676},
+ {from: 331, to: 699},
+ {from: 331, to: 717},
+ {from: 332, to: 333},
+ {from: 332, to: 428},
+ {from: 332, to: 511},
+ {from: 332, to: 528},
+ {from: 332, to: 571},
+ {from: 332, to: 580},
+ {from: 332, to: 593},
+ {from: 332, to: 601},
+ {from: 332, to: 618},
+ {from: 332, to: 619},
+ {from: 332, to: 645},
+ {from: 332, to: 652},
+ {from: 332, to: 703},
+ {from: 332, to: 716},
+ {from: 333, to: 428},
+ {from: 333, to: 511},
+ {from: 333, to: 528},
+ {from: 333, to: 571},
+ {from: 333, to: 578},
+ {from: 333, to: 580},
+ {from: 333, to: 593},
+ {from: 333, to: 601},
+ {from: 333, to: 618},
+ {from: 333, to: 619},
+ {from: 333, to: 652},
+ {from: 333, to: 655},
+ {from: 333, to: 703},
+ {from: 333, to: 716},
+ {from: 334, to: 353},
+ {from: 334, to: 355},
+ {from: 334, to: 368},
+ {from: 334, to: 429},
+ {from: 334, to: 446},
+ {from: 334, to: 489},
+ {from: 334, to: 499},
+ {from: 334, to: 548},
+ {from: 334, to: 552},
+ {from: 334, to: 595},
+ {from: 334, to: 710},
+ {from: 335, to: 348},
+ {from: 335, to: 415},
+ {from: 335, to: 434},
+ {from: 335, to: 462},
+ {from: 335, to: 555},
+ {from: 335, to: 575},
+ {from: 335, to: 576},
+ {from: 335, to: 583},
+ {from: 335, to: 603},
+ {from: 335, to: 616},
+ {from: 335, to: 642},
+ {from: 335, to: 668},
+ {from: 335, to: 707},
+ {from: 335, to: 713},
+ {from: 335, to: 726},
+ {from: 336, to: 343},
+ {from: 336, to: 356},
+ {from: 336, to: 360},
+ {from: 336, to: 378},
+ {from: 336, to: 388},
+ {from: 336, to: 401},
+ {from: 336, to: 448},
+ {from: 336, to: 501},
+ {from: 336, to: 506},
+ {from: 336, to: 550},
+ {from: 336, to: 563},
+ {from: 336, to: 588},
+ {from: 336, to: 617},
+ {from: 336, to: 712},
+ {from: 336, to: 727},
+ {from: 337, to: 374},
+ {from: 337, to: 387},
+ {from: 337, to: 396},
+ {from: 337, to: 407},
+ {from: 337, to: 420},
+ {from: 337, to: 488},
+ {from: 337, to: 533},
+ {from: 337, to: 579},
+ {from: 337, to: 626},
+ {from: 337, to: 627},
+ {from: 337, to: 633},
+ {from: 337, to: 662},
+ {from: 337, to: 705},
+ {from: 338, to: 345},
+ {from: 338, to: 350},
+ {from: 338, to: 396},
+ {from: 338, to: 417},
+ {from: 338, to: 496},
+ {from: 338, to: 507},
+ {from: 338, to: 534},
+ {from: 338, to: 566},
+ {from: 338, to: 606},
+ {from: 338, to: 613},
+ {from: 338, to: 659},
+ {from: 338, to: 673},
+ {from: 338, to: 682},
+ {from: 338, to: 714},
+ {from: 339, to: 364},
+ {from: 339, to: 453},
+ {from: 339, to: 504},
+ {from: 339, to: 514},
+ {from: 339, to: 578},
+ {from: 339, to: 596},
+ {from: 339, to: 602},
+ {from: 339, to: 610},
+ {from: 339, to: 661},
+ {from: 339, to: 665},
+ {from: 339, to: 690},
+ {from: 339, to: 692},
+ {from: 339, to: 693},
+ {from: 339, to: 721},
+ {from: 339, to: 723},
+ {from: 340, to: 346},
+ {from: 340, to: 347},
+ {from: 340, to: 387},
+ {from: 340, to: 404},
+ {from: 340, to: 437},
+ {from: 340, to: 503},
+ {from: 340, to: 520},
+ {from: 340, to: 590},
+ {from: 340, to: 628},
+ {from: 340, to: 664},
+ {from: 340, to: 670},
+ {from: 340, to: 709},
+ {from: 341, to: 365},
+ {from: 341, to: 375},
+ {from: 341, to: 406},
+ {from: 341, to: 476},
+ {from: 341, to: 502},
+ {from: 341, to: 513},
+ {from: 341, to: 530},
+ {from: 341, to: 544},
+ {from: 341, to: 681},
+ {from: 341, to: 683},
+ {from: 342, to: 363},
+ {from: 342, to: 379},
+ {from: 342, to: 383},
+ {from: 342, to: 403},
+ {from: 342, to: 500},
+ {from: 342, to: 505},
+ {from: 342, to: 537},
+ {from: 342, to: 547},
+ {from: 342, to: 574},
+ {from: 342, to: 586},
+ {from: 342, to: 587},
+ {from: 342, to: 597},
+ {from: 342, to: 627},
+ {from: 342, to: 649},
+ {from: 342, to: 691},
+ {from: 342, to: 702},
+ {from: 342, to: 706},
+ {from: 342, to: 717},
+ {from: 343, to: 360},
+ {from: 343, to: 378},
+ {from: 343, to: 388},
+ {from: 343, to: 448},
+ {from: 343, to: 501},
+ {from: 343, to: 506},
+ {from: 343, to: 550},
+ {from: 343, to: 563},
+ {from: 343, to: 588},
+ {from: 343, to: 617},
+ {from: 343, to: 712},
+ {from: 343, to: 727},
+ {from: 344, to: 354},
+ {from: 344, to: 361},
+ {from: 344, to: 362},
+ {from: 344, to: 445},
+ {from: 344, to: 483},
+ {from: 344, to: 484},
+ {from: 344, to: 512},
+ {from: 345, to: 350},
+ {from: 345, to: 396},
+ {from: 345, to: 417},
+ {from: 345, to: 496},
+ {from: 345, to: 507},
+ {from: 345, to: 534},
+ {from: 345, to: 566},
+ {from: 345, to: 606},
+ {from: 345, to: 613},
+ {from: 345, to: 659},
+ {from: 345, to: 673},
+ {from: 345, to: 682},
+ {from: 345, to: 714},
+ {from: 345, to: 715},
+ {from: 346, to: 347},
+ {from: 346, to: 387},
+ {from: 346, to: 404},
+ {from: 346, to: 437},
+ {from: 346, to: 503},
+ {from: 346, to: 520},
+ {from: 346, to: 590},
+ {from: 346, to: 628},
+ {from: 346, to: 664},
+ {from: 346, to: 670},
+ {from: 346, to: 709},
+ {from: 347, to: 387},
+ {from: 347, to: 404},
+ {from: 347, to: 437},
+ {from: 347, to: 503},
+ {from: 347, to: 520},
+ {from: 347, to: 590},
+ {from: 347, to: 628},
+ {from: 347, to: 664},
+ {from: 347, to: 670},
+ {from: 347, to: 709},
+ {from: 348, to: 398},
+ {from: 348, to: 415},
+ {from: 348, to: 430},
+ {from: 348, to: 434},
+ {from: 348, to: 440},
+ {from: 348, to: 575},
+ {from: 348, to: 576},
+ {from: 348, to: 583},
+ {from: 348, to: 603},
+ {from: 348, to: 616},
+ {from: 348, to: 654},
+ {from: 348, to: 668},
+ {from: 348, to: 702},
+ {from: 348, to: 713},
+ {from: 349, to: 368},
+ {from: 349, to: 371},
+ {from: 349, to: 373},
+ {from: 349, to: 397},
+ {from: 349, to: 419},
+ {from: 349, to: 429},
+ {from: 349, to: 489},
+ {from: 349, to: 529},
+ {from: 349, to: 569},
+ {from: 349, to: 572},
+ {from: 349, to: 591},
+ {from: 349, to: 629},
+ {from: 349, to: 643},
+ {from: 349, to: 644},
+ {from: 349, to: 719},
+ {from: 349, to: 720},
+ {from: 350, to: 396},
+ {from: 350, to: 417},
+ {from: 350, to: 496},
+ {from: 350, to: 507},
+ {from: 350, to: 534},
+ {from: 350, to: 566},
+ {from: 350, to: 606},
+ {from: 350, to: 613},
+ {from: 350, to: 659},
+ {from: 350, to: 673},
+ {from: 350, to: 682},
+ {from: 350, to: 714},
+ {from: 351, to: 367},
+ {from: 351, to: 372},
+ {from: 351, to: 426},
+ {from: 351, to: 427},
+ {from: 351, to: 456},
+ {from: 351, to: 464},
+ {from: 351, to: 492},
+ {from: 351, to: 536},
+ {from: 351, to: 549},
+ {from: 351, to: 551},
+ {from: 351, to: 609},
+ {from: 351, to: 615},
+ {from: 351, to: 700},
+ {from: 351, to: 718},
+ {from: 352, to: 359},
+ {from: 352, to: 369},
+ {from: 352, to: 430},
+ {from: 352, to: 461},
+ {from: 352, to: 463},
+ {from: 352, to: 486},
+ {from: 352, to: 526},
+ {from: 352, to: 531},
+ {from: 352, to: 607},
+ {from: 352, to: 634},
+ {from: 352, to: 652},
+ {from: 352, to: 667},
+ {from: 352, to: 711},
+ {from: 353, to: 368},
+ {from: 353, to: 429},
+ {from: 353, to: 489},
+ {from: 353, to: 499},
+ {from: 353, to: 548},
+ {from: 353, to: 552},
+ {from: 353, to: 595},
+ {from: 353, to: 710},
+ {from: 354, to: 361},
+ {from: 354, to: 362},
+ {from: 354, to: 445},
+ {from: 354, to: 483},
+ {from: 354, to: 484},
+ {from: 354, to: 512},
+ {from: 355, to: 357},
+ {from: 355, to: 446},
+ {from: 355, to: 509},
+ {from: 355, to: 510},
+ {from: 355, to: 546},
+ {from: 355, to: 564},
+ {from: 355, to: 581},
+ {from: 355, to: 592},
+ {from: 356, to: 400},
+ {from: 356, to: 401},
+ {from: 356, to: 402},
+ {from: 356, to: 410},
+ {from: 356, to: 423},
+ {from: 356, to: 545},
+ {from: 356, to: 556},
+ {from: 356, to: 557},
+ {from: 356, to: 558},
+ {from: 356, to: 656},
+ {from: 356, to: 660},
+ {from: 356, to: 674},
+ {from: 356, to: 694},
+ {from: 356, to: 696},
+ {from: 357, to: 446},
+ {from: 357, to: 509},
+ {from: 357, to: 510},
+ {from: 357, to: 546},
+ {from: 357, to: 564},
+ {from: 357, to: 581},
+ {from: 357, to: 592},
+ {from: 358, to: 419},
+ {from: 358, to: 424},
+ {from: 358, to: 450},
+ {from: 358, to: 451},
+ {from: 358, to: 462},
+ {from: 358, to: 487},
+ {from: 358, to: 555},
+ {from: 358, to: 600},
+ {from: 358, to: 608},
+ {from: 358, to: 642},
+ {from: 358, to: 645},
+ {from: 359, to: 373},
+ {from: 359, to: 397},
+ {from: 359, to: 430},
+ {from: 359, to: 461},
+ {from: 359, to: 463},
+ {from: 359, to: 486},
+ {from: 359, to: 531},
+ {from: 359, to: 607},
+ {from: 359, to: 634},
+ {from: 359, to: 677},
+ {from: 359, to: 685},
+ {from: 359, to: 711},
+ {from: 360, to: 378},
+ {from: 360, to: 388},
+ {from: 360, to: 448},
+ {from: 360, to: 501},
+ {from: 360, to: 506},
+ {from: 360, to: 550},
+ {from: 360, to: 563},
+ {from: 360, to: 588},
+ {from: 360, to: 617},
+ {from: 360, to: 712},
+ {from: 360, to: 727},
+ {from: 361, to: 362},
+ {from: 361, to: 445},
+ {from: 361, to: 483},
+ {from: 361, to: 484},
+ {from: 361, to: 512},
+ {from: 362, to: 445},
+ {from: 362, to: 483},
+ {from: 362, to: 484},
+ {from: 362, to: 512},
+ {from: 363, to: 379},
+ {from: 363, to: 383},
+ {from: 363, to: 403},
+ {from: 363, to: 417},
+ {from: 363, to: 500},
+ {from: 363, to: 505},
+ {from: 363, to: 537},
+ {from: 363, to: 574},
+ {from: 363, to: 587},
+ {from: 363, to: 597},
+ {from: 363, to: 649},
+ {from: 363, to: 691},
+ {from: 363, to: 702},
+ {from: 363, to: 706},
+ {from: 364, to: 438},
+ {from: 364, to: 453},
+ {from: 364, to: 504},
+ {from: 364, to: 578},
+ {from: 364, to: 596},
+ {from: 364, to: 602},
+ {from: 364, to: 610},
+ {from: 364, to: 661},
+ {from: 364, to: 665},
+ {from: 364, to: 683},
+ {from: 364, to: 690},
+ {from: 364, to: 692},
+ {from: 364, to: 693},
+ {from: 364, to: 721},
+ {from: 364, to: 723},
+ {from: 365, to: 375},
+ {from: 365, to: 390},
+ {from: 365, to: 406},
+ {from: 365, to: 476},
+ {from: 365, to: 502},
+ {from: 365, to: 513},
+ {from: 365, to: 530},
+ {from: 365, to: 544},
+ {from: 365, to: 681},
+ {from: 365, to: 683},
+ {from: 366, to: 369},
+ {from: 366, to: 370},
+ {from: 366, to: 422},
+ {from: 366, to: 457},
+ {from: 366, to: 554},
+ {from: 366, to: 572},
+ {from: 366, to: 591},
+ {from: 366, to: 630},
+ {from: 366, to: 672},
+ {from: 366, to: 693},
+ {from: 366, to: 701},
+ {from: 367, to: 372},
+ {from: 367, to: 426},
+ {from: 367, to: 427},
+ {from: 367, to: 456},
+ {from: 367, to: 464},
+ {from: 367, to: 492},
+ {from: 367, to: 536},
+ {from: 367, to: 549},
+ {from: 367, to: 551},
+ {from: 367, to: 609},
+ {from: 367, to: 615},
+ {from: 367, to: 700},
+ {from: 367, to: 718},
+ {from: 368, to: 419},
+ {from: 368, to: 429},
+ {from: 368, to: 489},
+ {from: 368, to: 499},
+ {from: 368, to: 529},
+ {from: 368, to: 548},
+ {from: 368, to: 552},
+ {from: 368, to: 569},
+ {from: 368, to: 595},
+ {from: 368, to: 643},
+ {from: 368, to: 710},
+ {from: 368, to: 720},
+ {from: 369, to: 370},
+ {from: 369, to: 457},
+ {from: 369, to: 526},
+ {from: 369, to: 554},
+ {from: 369, to: 630},
+ {from: 369, to: 652},
+ {from: 369, to: 667},
+ {from: 369, to: 672},
+ {from: 369, to: 701},
+ {from: 370, to: 457},
+ {from: 370, to: 554},
+ {from: 370, to: 630},
+ {from: 370, to: 672},
+ {from: 370, to: 701},
+ {from: 371, to: 373},
+ {from: 371, to: 397},
+ {from: 371, to: 460},
+ {from: 371, to: 528},
+ {from: 371, to: 562},
+ {from: 371, to: 569},
+ {from: 371, to: 572},
+ {from: 371, to: 576},
+ {from: 371, to: 591},
+ {from: 371, to: 606},
+ {from: 371, to: 629},
+ {from: 371, to: 643},
+ {from: 371, to: 644},
+ {from: 371, to: 646},
+ {from: 371, to: 713},
+ {from: 371, to: 719},
+ {from: 371, to: 720},
+ {from: 372, to: 426},
+ {from: 372, to: 427},
+ {from: 372, to: 456},
+ {from: 372, to: 464},
+ {from: 372, to: 492},
+ {from: 372, to: 536},
+ {from: 372, to: 549},
+ {from: 372, to: 551},
+ {from: 372, to: 609},
+ {from: 372, to: 615},
+ {from: 372, to: 700},
+ {from: 372, to: 718},
+ {from: 373, to: 397},
+ {from: 373, to: 569},
+ {from: 373, to: 572},
+ {from: 373, to: 591},
+ {from: 373, to: 629},
+ {from: 373, to: 643},
+ {from: 373, to: 644},
+ {from: 373, to: 677},
+ {from: 373, to: 685},
+ {from: 373, to: 719},
+ {from: 373, to: 720},
+ {from: 374, to: 385},
+ {from: 374, to: 387},
+ {from: 374, to: 396},
+ {from: 374, to: 433},
+ {from: 374, to: 442},
+ {from: 374, to: 454},
+ {from: 374, to: 475},
+ {from: 374, to: 480},
+ {from: 374, to: 498},
+ {from: 374, to: 517},
+ {from: 374, to: 573},
+ {from: 374, to: 577},
+ {from: 374, to: 611},
+ {from: 374, to: 614},
+ {from: 374, to: 623},
+ {from: 374, to: 633},
+ {from: 374, to: 648},
+ {from: 374, to: 678},
+ {from: 374, to: 687},
+ {from: 375, to: 406},
+ {from: 375, to: 442},
+ {from: 375, to: 454},
+ {from: 375, to: 455},
+ {from: 375, to: 476},
+ {from: 375, to: 502},
+ {from: 375, to: 513},
+ {from: 375, to: 530},
+ {from: 375, to: 544},
+ {from: 375, to: 577},
+ {from: 375, to: 678},
+ {from: 375, to: 681},
+ {from: 375, to: 683},
+ {from: 375, to: 687},
+ {from: 375, to: 721},
+ {from: 376, to: 431},
+ {from: 376, to: 436},
+ {from: 376, to: 443},
+ {from: 376, to: 490},
+ {from: 376, to: 502},
+ {from: 376, to: 529},
+ {from: 376, to: 547},
+ {from: 376, to: 567},
+ {from: 376, to: 586},
+ {from: 376, to: 676},
+ {from: 376, to: 699},
+ {from: 376, to: 717},
+ {from: 377, to: 390},
+ {from: 377, to: 391},
+ {from: 377, to: 392},
+ {from: 377, to: 393},
+ {from: 377, to: 394},
+ {from: 377, to: 395},
+ {from: 377, to: 399},
+ {from: 377, to: 405},
+ {from: 377, to: 411},
+ {from: 377, to: 412},
+ {from: 377, to: 413},
+ {from: 377, to: 414},
+ {from: 377, to: 559},
+ {from: 377, to: 560},
+ {from: 377, to: 561},
+ {from: 377, to: 658},
+ {from: 377, to: 731},
+ {from: 378, to: 388},
+ {from: 378, to: 399},
+ {from: 378, to: 448},
+ {from: 378, to: 488},
+ {from: 378, to: 501},
+ {from: 378, to: 506},
+ {from: 378, to: 550},
+ {from: 378, to: 561},
+ {from: 378, to: 563},
+ {from: 378, to: 588},
+ {from: 378, to: 617},
+ {from: 378, to: 647},
+ {from: 378, to: 712},
+ {from: 378, to: 727},
+ {from: 379, to: 383},
+ {from: 379, to: 403},
+ {from: 379, to: 500},
+ {from: 379, to: 505},
+ {from: 379, to: 537},
+ {from: 379, to: 574},
+ {from: 379, to: 587},
+ {from: 379, to: 597},
+ {from: 379, to: 649},
+ {from: 379, to: 691},
+ {from: 379, to: 702},
+ {from: 379, to: 706},
+ {from: 380, to: 389},
+ {from: 380, to: 467},
+ {from: 380, to: 495},
+ {from: 380, to: 570},
+ {from: 380, to: 584},
+ {from: 380, to: 598},
+ {from: 380, to: 599},
+ {from: 380, to: 666},
+ {from: 381, to: 409},
+ {from: 381, to: 421},
+ {from: 381, to: 425},
+ {from: 381, to: 432},
+ {from: 381, to: 440},
+ {from: 381, to: 443},
+ {from: 381, to: 472},
+ {from: 381, to: 473},
+ {from: 381, to: 508},
+ {from: 381, to: 521},
+ {from: 381, to: 523},
+ {from: 381, to: 543},
+ {from: 381, to: 562},
+ {from: 381, to: 565},
+ {from: 381, to: 571},
+ {from: 381, to: 589},
+ {from: 381, to: 594},
+ {from: 381, to: 604},
+ {from: 381, to: 623},
+ {from: 381, to: 644},
+ {from: 381, to: 663},
+ {from: 381, to: 719},
+ {from: 381, to: 728},
+ {from: 382, to: 438},
+ {from: 382, to: 441},
+ {from: 382, to: 452},
+ {from: 382, to: 465},
+ {from: 382, to: 466},
+ {from: 382, to: 481},
+ {from: 382, to: 491},
+ {from: 382, to: 503},
+ {from: 382, to: 534},
+ {from: 382, to: 646},
+ {from: 382, to: 647},
+ {from: 382, to: 650},
+ {from: 382, to: 651},
+ {from: 382, to: 670},
+ {from: 382, to: 689},
+ {from: 382, to: 724},
+ {from: 382, to: 725},
+ {from: 382, to: 729},
+ {from: 382, to: 730},
+ {from: 382, to: 734},
+ {from: 382, to: 735},
+ {from: 383, to: 403},
+ {from: 383, to: 500},
+ {from: 383, to: 505},
+ {from: 383, to: 537},
+ {from: 383, to: 574},
+ {from: 383, to: 587},
+ {from: 383, to: 597},
+ {from: 383, to: 649},
+ {from: 383, to: 691},
+ {from: 383, to: 702},
+ {from: 383, to: 706},
+ {from: 384, to: 386},
+ {from: 384, to: 408},
+ {from: 384, to: 431},
+ {from: 384, to: 460},
+ {from: 384, to: 522},
+ {from: 384, to: 527},
+ {from: 384, to: 532},
+ {from: 384, to: 602},
+ {from: 384, to: 612},
+ {from: 384, to: 625},
+ {from: 384, to: 654},
+ {from: 384, to: 667},
+ {from: 384, to: 677},
+ {from: 384, to: 679},
+ {from: 384, to: 685},
+ {from: 384, to: 703},
+ {from: 384, to: 707},
+ {from: 385, to: 433},
+ {from: 385, to: 442},
+ {from: 385, to: 454},
+ {from: 385, to: 475},
+ {from: 385, to: 480},
+ {from: 385, to: 498},
+ {from: 385, to: 517},
+ {from: 385, to: 518},
+ {from: 385, to: 573},
+ {from: 385, to: 577},
+ {from: 385, to: 611},
+ {from: 385, to: 614},
+ {from: 385, to: 623},
+ {from: 385, to: 648},
+ {from: 385, to: 656},
+ {from: 385, to: 678},
+ {from: 385, to: 687},
+ {from: 386, to: 408},
+ {from: 386, to: 415},
+ {from: 386, to: 460},
+ {from: 386, to: 522},
+ {from: 386, to: 527},
+ {from: 386, to: 532},
+ {from: 386, to: 575},
+ {from: 386, to: 612},
+ {from: 386, to: 616},
+ {from: 386, to: 625},
+ {from: 386, to: 654},
+ {from: 386, to: 667},
+ {from: 386, to: 677},
+ {from: 386, to: 679},
+ {from: 386, to: 681},
+ {from: 386, to: 685},
+ {from: 386, to: 707},
+ {from: 387, to: 396},
+ {from: 387, to: 404},
+ {from: 387, to: 437},
+ {from: 387, to: 503},
+ {from: 387, to: 520},
+ {from: 387, to: 590},
+ {from: 387, to: 628},
+ {from: 387, to: 633},
+ {from: 387, to: 664},
+ {from: 387, to: 670},
+ {from: 387, to: 709},
+ {from: 388, to: 423},
+ {from: 388, to: 448},
+ {from: 388, to: 501},
+ {from: 388, to: 506},
+ {from: 388, to: 550},
+ {from: 388, to: 563},
+ {from: 388, to: 588},
+ {from: 388, to: 617},
+ {from: 388, to: 712},
+ {from: 388, to: 727},
+ {from: 389, to: 467},
+ {from: 389, to: 495},
+ {from: 389, to: 570},
+ {from: 389, to: 584},
+ {from: 389, to: 598},
+ {from: 389, to: 599},
+ {from: 389, to: 666},
+ {from: 390, to: 391},
+ {from: 390, to: 392},
+ {from: 390, to: 393},
+ {from: 390, to: 394},
+ {from: 390, to: 395},
+ {from: 390, to: 399},
+ {from: 390, to: 405},
+ {from: 390, to: 411},
+ {from: 390, to: 412},
+ {from: 390, to: 413},
+ {from: 390, to: 414},
+ {from: 390, to: 559},
+ {from: 390, to: 560},
+ {from: 390, to: 561},
+ {from: 390, to: 658},
+ {from: 390, to: 731},
+ {from: 391, to: 392},
+ {from: 391, to: 393},
+ {from: 391, to: 394},
+ {from: 391, to: 395},
+ {from: 391, to: 399},
+ {from: 391, to: 405},
+ {from: 391, to: 411},
+ {from: 391, to: 412},
+ {from: 391, to: 413},
+ {from: 391, to: 414},
+ {from: 391, to: 559},
+ {from: 391, to: 560},
+ {from: 391, to: 561},
+ {from: 391, to: 658},
+ {from: 391, to: 731},
+ {from: 392, to: 393},
+ {from: 392, to: 394},
+ {from: 392, to: 395},
+ {from: 392, to: 399},
+ {from: 392, to: 405},
+ {from: 392, to: 411},
+ {from: 392, to: 412},
+ {from: 392, to: 413},
+ {from: 392, to: 414},
+ {from: 392, to: 559},
+ {from: 392, to: 560},
+ {from: 392, to: 561},
+ {from: 392, to: 658},
+ {from: 392, to: 731},
+ {from: 393, to: 394},
+ {from: 393, to: 395},
+ {from: 393, to: 399},
+ {from: 393, to: 405},
+ {from: 393, to: 411},
+ {from: 393, to: 412},
+ {from: 393, to: 413},
+ {from: 393, to: 414},
+ {from: 393, to: 559},
+ {from: 393, to: 560},
+ {from: 393, to: 561},
+ {from: 393, to: 658},
+ {from: 393, to: 731},
+ {from: 394, to: 395},
+ {from: 394, to: 399},
+ {from: 394, to: 405},
+ {from: 394, to: 411},
+ {from: 394, to: 412},
+ {from: 394, to: 413},
+ {from: 394, to: 414},
+ {from: 394, to: 559},
+ {from: 394, to: 560},
+ {from: 394, to: 561},
+ {from: 394, to: 658},
+ {from: 394, to: 731},
+ {from: 395, to: 399},
+ {from: 395, to: 405},
+ {from: 395, to: 411},
+ {from: 395, to: 412},
+ {from: 395, to: 413},
+ {from: 395, to: 414},
+ {from: 395, to: 559},
+ {from: 395, to: 560},
+ {from: 395, to: 561},
+ {from: 395, to: 658},
+ {from: 395, to: 731},
+ {from: 396, to: 417},
+ {from: 396, to: 496},
+ {from: 396, to: 507},
+ {from: 396, to: 534},
+ {from: 396, to: 566},
+ {from: 396, to: 606},
+ {from: 396, to: 613},
+ {from: 396, to: 633},
+ {from: 396, to: 659},
+ {from: 396, to: 673},
+ {from: 396, to: 682},
+ {from: 396, to: 714},
+ {from: 397, to: 569},
+ {from: 397, to: 572},
+ {from: 397, to: 591},
+ {from: 397, to: 629},
+ {from: 397, to: 643},
+ {from: 397, to: 644},
+ {from: 397, to: 677},
+ {from: 397, to: 685},
+ {from: 397, to: 719},
+ {from: 397, to: 720},
+ {from: 398, to: 430},
+ {from: 398, to: 440},
+ {from: 398, to: 474},
+ {from: 398, to: 485},
+ {from: 398, to: 553},
+ {from: 398, to: 583},
+ {from: 398, to: 621},
+ {from: 398, to: 632},
+ {from: 398, to: 638},
+ {from: 398, to: 639},
+ {from: 398, to: 654},
+ {from: 398, to: 657},
+ {from: 398, to: 668},
+ {from: 398, to: 671},
+ {from: 398, to: 702},
+ {from: 398, to: 715},
+ {from: 398, to: 726},
+ {from: 399, to: 405},
+ {from: 399, to: 411},
+ {from: 399, to: 412},
+ {from: 399, to: 413},
+ {from: 399, to: 414},
+ {from: 399, to: 488},
+ {from: 399, to: 559},
+ {from: 399, to: 560},
+ {from: 399, to: 561},
+ {from: 399, to: 647},
+ {from: 399, to: 658},
+ {from: 399, to: 731},
+ {from: 400, to: 401},
+ {from: 400, to: 402},
+ {from: 400, to: 410},
+ {from: 400, to: 423},
+ {from: 400, to: 545},
+ {from: 400, to: 556},
+ {from: 400, to: 557},
+ {from: 400, to: 558},
+ {from: 400, to: 656},
+ {from: 400, to: 660},
+ {from: 400, to: 674},
+ {from: 400, to: 694},
+ {from: 400, to: 696},
+ {from: 401, to: 402},
+ {from: 401, to: 410},
+ {from: 401, to: 423},
+ {from: 401, to: 545},
+ {from: 401, to: 556},
+ {from: 401, to: 557},
+ {from: 401, to: 558},
+ {from: 401, to: 656},
+ {from: 401, to: 660},
+ {from: 401, to: 674},
+ {from: 401, to: 694},
+ {from: 401, to: 696},
+ {from: 402, to: 410},
+ {from: 402, to: 423},
+ {from: 402, to: 545},
+ {from: 402, to: 556},
+ {from: 402, to: 557},
+ {from: 402, to: 558},
+ {from: 402, to: 656},
+ {from: 402, to: 660},
+ {from: 402, to: 674},
+ {from: 402, to: 694},
+ {from: 402, to: 696},
+ {from: 403, to: 500},
+ {from: 403, to: 505},
+ {from: 403, to: 537},
+ {from: 403, to: 574},
+ {from: 403, to: 587},
+ {from: 403, to: 597},
+ {from: 403, to: 649},
+ {from: 403, to: 691},
+ {from: 403, to: 702},
+ {from: 403, to: 706},
+ {from: 404, to: 416},
+ {from: 404, to: 437},
+ {from: 404, to: 461},
+ {from: 404, to: 483},
+ {from: 404, to: 503},
+ {from: 404, to: 520},
+ {from: 404, to: 565},
+ {from: 404, to: 590},
+ {from: 404, to: 628},
+ {from: 404, to: 661},
+ {from: 404, to: 664},
+ {from: 404, to: 670},
+ {from: 404, to: 709},
+ {from: 405, to: 411},
+ {from: 405, to: 412},
+ {from: 405, to: 413},
+ {from: 405, to: 414},
+ {from: 405, to: 559},
+ {from: 405, to: 560},
+ {from: 405, to: 561},
+ {from: 405, to: 658},
+ {from: 405, to: 731},
+ {from: 406, to: 476},
+ {from: 406, to: 502},
+ {from: 406, to: 513},
+ {from: 406, to: 530},
+ {from: 406, to: 544},
+ {from: 406, to: 681},
+ {from: 406, to: 683},
+ {from: 407, to: 420},
+ {from: 407, to: 488},
+ {from: 407, to: 533},
+ {from: 407, to: 579},
+ {from: 407, to: 626},
+ {from: 407, to: 627},
+ {from: 407, to: 662},
+ {from: 407, to: 705},
+ {from: 408, to: 460},
+ {from: 408, to: 522},
+ {from: 408, to: 527},
+ {from: 408, to: 532},
+ {from: 408, to: 612},
+ {from: 408, to: 625},
+ {from: 408, to: 654},
+ {from: 408, to: 667},
+ {from: 408, to: 677},
+ {from: 408, to: 679},
+ {from: 408, to: 685},
+ {from: 408, to: 707},
+ {from: 409, to: 421},
+ {from: 409, to: 425},
+ {from: 409, to: 433},
+ {from: 409, to: 440},
+ {from: 409, to: 472},
+ {from: 409, to: 473},
+ {from: 409, to: 498},
+ {from: 409, to: 508},
+ {from: 409, to: 521},
+ {from: 409, to: 523},
+ {from: 409, to: 543},
+ {from: 409, to: 562},
+ {from: 409, to: 565},
+ {from: 409, to: 573},
+ {from: 409, to: 589},
+ {from: 409, to: 594},
+ {from: 409, to: 604},
+ {from: 409, to: 629},
+ {from: 409, to: 663},
+ {from: 409, to: 679},
+ {from: 409, to: 728},
+ {from: 410, to: 423},
+ {from: 410, to: 545},
+ {from: 410, to: 556},
+ {from: 410, to: 557},
+ {from: 410, to: 558},
+ {from: 410, to: 656},
+ {from: 410, to: 660},
+ {from: 410, to: 674},
+ {from: 410, to: 694},
+ {from: 410, to: 696},
+ {from: 411, to: 412},
+ {from: 411, to: 413},
+ {from: 411, to: 414},
+ {from: 411, to: 559},
+ {from: 411, to: 560},
+ {from: 411, to: 561},
+ {from: 411, to: 658},
+ {from: 411, to: 731},
+ {from: 412, to: 413},
+ {from: 412, to: 414},
+ {from: 412, to: 559},
+ {from: 412, to: 560},
+ {from: 412, to: 561},
+ {from: 412, to: 658},
+ {from: 412, to: 731},
+ {from: 413, to: 414},
+ {from: 413, to: 559},
+ {from: 413, to: 560},
+ {from: 413, to: 561},
+ {from: 413, to: 658},
+ {from: 413, to: 731},
+ {from: 414, to: 559},
+ {from: 414, to: 560},
+ {from: 414, to: 561},
+ {from: 414, to: 658},
+ {from: 414, to: 731},
+ {from: 415, to: 434},
+ {from: 415, to: 575},
+ {from: 415, to: 576},
+ {from: 415, to: 583},
+ {from: 415, to: 603},
+ {from: 415, to: 612},
+ {from: 415, to: 616},
+ {from: 415, to: 668},
+ {from: 415, to: 681},
+ {from: 415, to: 713},
+ {from: 416, to: 422},
+ {from: 416, to: 447},
+ {from: 416, to: 449},
+ {from: 416, to: 452},
+ {from: 416, to: 461},
+ {from: 416, to: 478},
+ {from: 416, to: 481},
+ {from: 416, to: 482},
+ {from: 416, to: 483},
+ {from: 416, to: 565},
+ {from: 416, to: 622},
+ {from: 416, to: 661},
+ {from: 416, to: 675},
+ {from: 417, to: 496},
+ {from: 417, to: 507},
+ {from: 417, to: 534},
+ {from: 417, to: 566},
+ {from: 417, to: 606},
+ {from: 417, to: 613},
+ {from: 417, to: 659},
+ {from: 417, to: 673},
+ {from: 417, to: 682},
+ {from: 417, to: 714},
+ {from: 418, to: 435},
+ {from: 418, to: 493},
+ {from: 418, to: 494},
+ {from: 418, to: 519},
+ {from: 418, to: 525},
+ {from: 418, to: 526},
+ {from: 418, to: 582},
+ {from: 418, to: 585},
+ {from: 418, to: 605},
+ {from: 418, to: 631},
+ {from: 418, to: 655},
+ {from: 418, to: 722},
+ {from: 419, to: 424},
+ {from: 419, to: 429},
+ {from: 419, to: 450},
+ {from: 419, to: 451},
+ {from: 419, to: 462},
+ {from: 419, to: 487},
+ {from: 419, to: 489},
+ {from: 419, to: 529},
+ {from: 419, to: 555},
+ {from: 419, to: 569},
+ {from: 419, to: 600},
+ {from: 419, to: 608},
+ {from: 419, to: 642},
+ {from: 419, to: 643},
+ {from: 419, to: 645},
+ {from: 419, to: 720},
+ {from: 420, to: 488},
+ {from: 420, to: 533},
+ {from: 420, to: 579},
+ {from: 420, to: 626},
+ {from: 420, to: 627},
+ {from: 420, to: 662},
+ {from: 420, to: 705},
+ {from: 421, to: 425},
+ {from: 421, to: 440},
+ {from: 421, to: 472},
+ {from: 421, to: 473},
+ {from: 421, to: 508},
+ {from: 421, to: 521},
+ {from: 421, to: 523},
+ {from: 421, to: 543},
+ {from: 421, to: 562},
+ {from: 421, to: 565},
+ {from: 421, to: 589},
+ {from: 421, to: 594},
+ {from: 421, to: 604},
+ {from: 421, to: 649},
+ {from: 421, to: 663},
+ {from: 421, to: 682},
+ {from: 421, to: 728},
+ {from: 422, to: 447},
+ {from: 422, to: 449},
+ {from: 422, to: 452},
+ {from: 422, to: 478},
+ {from: 422, to: 481},
+ {from: 422, to: 482},
+ {from: 422, to: 572},
+ {from: 422, to: 591},
+ {from: 422, to: 622},
+ {from: 422, to: 675},
+ {from: 422, to: 693},
+ {from: 423, to: 545},
+ {from: 423, to: 556},
+ {from: 423, to: 557},
+ {from: 423, to: 558},
+ {from: 423, to: 656},
+ {from: 423, to: 660},
+ {from: 423, to: 674},
+ {from: 423, to: 694},
+ {from: 423, to: 696},
+ {from: 424, to: 450},
+ {from: 424, to: 451},
+ {from: 424, to: 462},
+ {from: 424, to: 487},
+ {from: 424, to: 517},
+ {from: 424, to: 537},
+ {from: 424, to: 555},
+ {from: 424, to: 600},
+ {from: 424, to: 608},
+ {from: 424, to: 636},
+ {from: 424, to: 642},
+ {from: 424, to: 645},
+ {from: 425, to: 440},
+ {from: 425, to: 449},
+ {from: 425, to: 472},
+ {from: 425, to: 473},
+ {from: 425, to: 490},
+ {from: 425, to: 508},
+ {from: 425, to: 521},
+ {from: 425, to: 523},
+ {from: 425, to: 543},
+ {from: 425, to: 562},
+ {from: 425, to: 565},
+ {from: 425, to: 589},
+ {from: 425, to: 594},
+ {from: 425, to: 604},
+ {from: 425, to: 622},
+ {from: 425, to: 663},
+ {from: 425, to: 675},
+ {from: 425, to: 676},
+ {from: 425, to: 728},
+ {from: 426, to: 427},
+ {from: 426, to: 456},
+ {from: 426, to: 464},
+ {from: 426, to: 492},
+ {from: 426, to: 536},
+ {from: 426, to: 549},
+ {from: 426, to: 551},
+ {from: 426, to: 609},
+ {from: 426, to: 615},
+ {from: 426, to: 700},
+ {from: 426, to: 718},
+ {from: 427, to: 456},
+ {from: 427, to: 464},
+ {from: 427, to: 492},
+ {from: 427, to: 536},
+ {from: 427, to: 549},
+ {from: 427, to: 551},
+ {from: 427, to: 609},
+ {from: 427, to: 615},
+ {from: 427, to: 700},
+ {from: 427, to: 718},
+ {from: 428, to: 511},
+ {from: 428, to: 528},
+ {from: 428, to: 532},
+ {from: 428, to: 540},
+ {from: 428, to: 571},
+ {from: 428, to: 580},
+ {from: 428, to: 593},
+ {from: 428, to: 601},
+ {from: 428, to: 618},
+ {from: 428, to: 619},
+ {from: 428, to: 652},
+ {from: 428, to: 703},
+ {from: 428, to: 704},
+ {from: 428, to: 716},
+ {from: 428, to: 732},
+ {from: 429, to: 489},
+ {from: 429, to: 499},
+ {from: 429, to: 529},
+ {from: 429, to: 548},
+ {from: 429, to: 552},
+ {from: 429, to: 569},
+ {from: 429, to: 595},
+ {from: 429, to: 643},
+ {from: 429, to: 710},
+ {from: 429, to: 720},
+ {from: 430, to: 440},
+ {from: 430, to: 461},
+ {from: 430, to: 463},
+ {from: 430, to: 486},
+ {from: 430, to: 531},
+ {from: 430, to: 583},
+ {from: 430, to: 607},
+ {from: 430, to: 634},
+ {from: 430, to: 654},
+ {from: 430, to: 668},
+ {from: 430, to: 702},
+ {from: 430, to: 711},
+ {from: 431, to: 436},
+ {from: 431, to: 443},
+ {from: 431, to: 490},
+ {from: 431, to: 529},
+ {from: 431, to: 547},
+ {from: 431, to: 567},
+ {from: 431, to: 586},
+ {from: 431, to: 602},
+ {from: 431, to: 676},
+ {from: 431, to: 699},
+ {from: 431, to: 703},
+ {from: 431, to: 717},
+ {from: 432, to: 443},
+ {from: 432, to: 444},
+ {from: 432, to: 455},
+ {from: 432, to: 469},
+ {from: 432, to: 514},
+ {from: 432, to: 535},
+ {from: 432, to: 539},
+ {from: 432, to: 542},
+ {from: 432, to: 571},
+ {from: 432, to: 589},
+ {from: 432, to: 623},
+ {from: 432, to: 624},
+ {from: 432, to: 644},
+ {from: 432, to: 653},
+ {from: 432, to: 669},
+ {from: 432, to: 698},
+ {from: 432, to: 719},
+ {from: 433, to: 442},
+ {from: 433, to: 454},
+ {from: 433, to: 475},
+ {from: 433, to: 480},
+ {from: 433, to: 498},
+ {from: 433, to: 517},
+ {from: 433, to: 543},
+ {from: 433, to: 573},
+ {from: 433, to: 577},
+ {from: 433, to: 611},
+ {from: 433, to: 614},
+ {from: 433, to: 623},
+ {from: 433, to: 629},
+ {from: 433, to: 648},
+ {from: 433, to: 678},
+ {from: 433, to: 679},
+ {from: 433, to: 687},
+ {from: 434, to: 491},
+ {from: 434, to: 521},
+ {from: 434, to: 575},
+ {from: 434, to: 576},
+ {from: 434, to: 583},
+ {from: 434, to: 603},
+ {from: 434, to: 616},
+ {from: 434, to: 668},
+ {from: 434, to: 713},
+ {from: 435, to: 493},
+ {from: 435, to: 494},
+ {from: 435, to: 519},
+ {from: 435, to: 525},
+ {from: 435, to: 526},
+ {from: 435, to: 582},
+ {from: 435, to: 585},
+ {from: 435, to: 605},
+ {from: 435, to: 631},
+ {from: 435, to: 655},
+ {from: 435, to: 722},
+ {from: 436, to: 443},
+ {from: 436, to: 490},
+ {from: 436, to: 516},
+ {from: 436, to: 529},
+ {from: 436, to: 547},
+ {from: 436, to: 567},
+ {from: 436, to: 586},
+ {from: 436, to: 676},
+ {from: 436, to: 696},
+ {from: 436, to: 699},
+ {from: 436, to: 717},
+ {from: 437, to: 503},
+ {from: 437, to: 520},
+ {from: 437, to: 590},
+ {from: 437, to: 628},
+ {from: 437, to: 664},
+ {from: 437, to: 670},
+ {from: 437, to: 709},
+ {from: 438, to: 441},
+ {from: 438, to: 465},
+ {from: 438, to: 466},
+ {from: 438, to: 491},
+ {from: 438, to: 646},
+ {from: 438, to: 647},
+ {from: 438, to: 650},
+ {from: 438, to: 651},
+ {from: 438, to: 683},
+ {from: 438, to: 689},
+ {from: 438, to: 724},
+ {from: 438, to: 725},
+ {from: 438, to: 729},
+ {from: 438, to: 730},
+ {from: 438, to: 734},
+ {from: 438, to: 735},
+ {from: 439, to: 540},
+ {from: 439, to: 568},
+ {from: 439, to: 640},
+ {from: 439, to: 641},
+ {from: 439, to: 695},
+ {from: 439, to: 704},
+ {from: 439, to: 708},
+ {from: 439, to: 709},
+ {from: 439, to: 732},
+ {from: 439, to: 733},
+ {from: 440, to: 472},
+ {from: 440, to: 473},
+ {from: 440, to: 508},
+ {from: 440, to: 521},
+ {from: 440, to: 523},
+ {from: 440, to: 543},
+ {from: 440, to: 562},
+ {from: 440, to: 565},
+ {from: 440, to: 583},
+ {from: 440, to: 589},
+ {from: 440, to: 594},
+ {from: 440, to: 604},
+ {from: 440, to: 654},
+ {from: 440, to: 663},
+ {from: 440, to: 668},
+ {from: 440, to: 702},
+ {from: 440, to: 728},
+ {from: 441, to: 465},
+ {from: 441, to: 466},
+ {from: 441, to: 491},
+ {from: 441, to: 646},
+ {from: 441, to: 647},
+ {from: 441, to: 650},
+ {from: 441, to: 651},
+ {from: 441, to: 689},
+ {from: 441, to: 724},
+ {from: 441, to: 725},
+ {from: 441, to: 729},
+ {from: 441, to: 730},
+ {from: 441, to: 734},
+ {from: 441, to: 735},
+ {from: 442, to: 454},
+ {from: 442, to: 455},
+ {from: 442, to: 475},
+ {from: 442, to: 480},
+ {from: 442, to: 498},
+ {from: 442, to: 517},
+ {from: 442, to: 573},
+ {from: 442, to: 577},
+ {from: 442, to: 611},
+ {from: 442, to: 614},
+ {from: 442, to: 623},
+ {from: 442, to: 648},
+ {from: 442, to: 678},
+ {from: 442, to: 687},
+ {from: 442, to: 721},
+ {from: 443, to: 490},
+ {from: 443, to: 529},
+ {from: 443, to: 547},
+ {from: 443, to: 567},
+ {from: 443, to: 571},
+ {from: 443, to: 586},
+ {from: 443, to: 589},
+ {from: 443, to: 623},
+ {from: 443, to: 644},
+ {from: 443, to: 676},
+ {from: 443, to: 699},
+ {from: 443, to: 717},
+ {from: 443, to: 719},
+ {from: 444, to: 455},
+ {from: 444, to: 469},
+ {from: 444, to: 514},
+ {from: 444, to: 535},
+ {from: 444, to: 539},
+ {from: 444, to: 542},
+ {from: 444, to: 624},
+ {from: 444, to: 653},
+ {from: 444, to: 669},
+ {from: 444, to: 698},
+ {from: 445, to: 483},
+ {from: 445, to: 484},
+ {from: 445, to: 512},
+ {from: 445, to: 638},
+ {from: 445, to: 692},
+ {from: 445, to: 723},
+ {from: 446, to: 509},
+ {from: 446, to: 510},
+ {from: 446, to: 546},
+ {from: 446, to: 564},
+ {from: 446, to: 581},
+ {from: 446, to: 592},
+ {from: 447, to: 449},
+ {from: 447, to: 452},
+ {from: 447, to: 478},
+ {from: 447, to: 481},
+ {from: 447, to: 482},
+ {from: 447, to: 622},
+ {from: 447, to: 675},
+ {from: 447, to: 711},
+ {from: 448, to: 501},
+ {from: 448, to: 506},
+ {from: 448, to: 520},
+ {from: 448, to: 550},
+ {from: 448, to: 563},
+ {from: 448, to: 588},
+ {from: 448, to: 617},
+ {from: 448, to: 712},
+ {from: 448, to: 727},
+ {from: 449, to: 452},
+ {from: 449, to: 478},
+ {from: 449, to: 481},
+ {from: 449, to: 482},
+ {from: 449, to: 490},
+ {from: 449, to: 622},
+ {from: 449, to: 675},
+ {from: 449, to: 676},
+ {from: 449, to: 728},
+ {from: 450, to: 451},
+ {from: 450, to: 462},
+ {from: 450, to: 487},
+ {from: 450, to: 555},
+ {from: 450, to: 600},
+ {from: 450, to: 608},
+ {from: 450, to: 619},
+ {from: 450, to: 642},
+ {from: 450, to: 645},
+ {from: 450, to: 716},
+ {from: 451, to: 462},
+ {from: 451, to: 487},
+ {from: 451, to: 555},
+ {from: 451, to: 600},
+ {from: 451, to: 608},
+ {from: 451, to: 642},
+ {from: 451, to: 645},
+ {from: 452, to: 478},
+ {from: 452, to: 481},
+ {from: 452, to: 482},
+ {from: 452, to: 503},
+ {from: 452, to: 534},
+ {from: 452, to: 622},
+ {from: 452, to: 670},
+ {from: 452, to: 675},
+ {from: 453, to: 504},
+ {from: 453, to: 578},
+ {from: 453, to: 596},
+ {from: 453, to: 602},
+ {from: 453, to: 610},
+ {from: 453, to: 661},
+ {from: 453, to: 665},
+ {from: 453, to: 690},
+ {from: 453, to: 692},
+ {from: 453, to: 693},
+ {from: 453, to: 721},
+ {from: 453, to: 723},
+ {from: 454, to: 455},
+ {from: 454, to: 475},
+ {from: 454, to: 480},
+ {from: 454, to: 498},
+ {from: 454, to: 517},
+ {from: 454, to: 573},
+ {from: 454, to: 577},
+ {from: 454, to: 611},
+ {from: 454, to: 614},
+ {from: 454, to: 623},
+ {from: 454, to: 648},
+ {from: 454, to: 678},
+ {from: 454, to: 687},
+ {from: 454, to: 721},
+ {from: 455, to: 469},
+ {from: 455, to: 514},
+ {from: 455, to: 535},
+ {from: 455, to: 539},
+ {from: 455, to: 542},
+ {from: 455, to: 577},
+ {from: 455, to: 624},
+ {from: 455, to: 653},
+ {from: 455, to: 669},
+ {from: 455, to: 678},
+ {from: 455, to: 687},
+ {from: 455, to: 698},
+ {from: 455, to: 721},
+ {from: 456, to: 464},
+ {from: 456, to: 492},
+ {from: 456, to: 536},
+ {from: 456, to: 549},
+ {from: 456, to: 551},
+ {from: 456, to: 609},
+ {from: 456, to: 615},
+ {from: 456, to: 700},
+ {from: 456, to: 718},
+ {from: 457, to: 554},
+ {from: 457, to: 630},
+ {from: 457, to: 672},
+ {from: 457, to: 701},
+ {from: 458, to: 459},
+ {from: 458, to: 468},
+ {from: 458, to: 470},
+ {from: 458, to: 471},
+ {from: 458, to: 477},
+ {from: 458, to: 479},
+ {from: 458, to: 515},
+ {from: 458, to: 518},
+ {from: 458, to: 541},
+ {from: 458, to: 620},
+ {from: 458, to: 680},
+ {from: 458, to: 686},
+ {from: 459, to: 468},
+ {from: 459, to: 470},
+ {from: 459, to: 471},
+ {from: 459, to: 477},
+ {from: 459, to: 479},
+ {from: 459, to: 515},
+ {from: 459, to: 518},
+ {from: 459, to: 541},
+ {from: 459, to: 620},
+ {from: 459, to: 680},
+ {from: 459, to: 686},
+ {from: 460, to: 522},
+ {from: 460, to: 527},
+ {from: 460, to: 528},
+ {from: 460, to: 532},
+ {from: 460, to: 562},
+ {from: 460, to: 576},
+ {from: 460, to: 606},
+ {from: 460, to: 612},
+ {from: 460, to: 625},
+ {from: 460, to: 646},
+ {from: 460, to: 654},
+ {from: 460, to: 667},
+ {from: 460, to: 677},
+ {from: 460, to: 679},
+ {from: 460, to: 685},
+ {from: 460, to: 707},
+ {from: 460, to: 713},
+ {from: 461, to: 463},
+ {from: 461, to: 483},
+ {from: 461, to: 486},
+ {from: 461, to: 531},
+ {from: 461, to: 565},
+ {from: 461, to: 607},
+ {from: 461, to: 634},
+ {from: 461, to: 661},
+ {from: 461, to: 711},
+ {from: 462, to: 487},
+ {from: 462, to: 555},
+ {from: 462, to: 600},
+ {from: 462, to: 608},
+ {from: 462, to: 642},
+ {from: 462, to: 645},
+ {from: 462, to: 707},
+ {from: 462, to: 726},
+ {from: 463, to: 486},
+ {from: 463, to: 531},
+ {from: 463, to: 607},
+ {from: 463, to: 634},
+ {from: 463, to: 711},
+ {from: 464, to: 492},
+ {from: 464, to: 536},
+ {from: 464, to: 549},
+ {from: 464, to: 551},
+ {from: 464, to: 552},
+ {from: 464, to: 609},
+ {from: 464, to: 615},
+ {from: 464, to: 700},
+ {from: 464, to: 718},
+ {from: 465, to: 466},
+ {from: 465, to: 491},
+ {from: 465, to: 646},
+ {from: 465, to: 647},
+ {from: 465, to: 650},
+ {from: 465, to: 651},
+ {from: 465, to: 689},
+ {from: 465, to: 724},
+ {from: 465, to: 725},
+ {from: 465, to: 729},
+ {from: 465, to: 730},
+ {from: 465, to: 734},
+ {from: 465, to: 735},
+ {from: 466, to: 491},
+ {from: 466, to: 646},
+ {from: 466, to: 647},
+ {from: 466, to: 650},
+ {from: 466, to: 651},
+ {from: 466, to: 689},
+ {from: 466, to: 724},
+ {from: 466, to: 725},
+ {from: 466, to: 729},
+ {from: 466, to: 730},
+ {from: 466, to: 734},
+ {from: 466, to: 735},
+ {from: 467, to: 495},
+ {from: 467, to: 570},
+ {from: 467, to: 584},
+ {from: 467, to: 598},
+ {from: 467, to: 599},
+ {from: 467, to: 666},
+ {from: 468, to: 470},
+ {from: 468, to: 471},
+ {from: 468, to: 477},
+ {from: 468, to: 479},
+ {from: 468, to: 515},
+ {from: 468, to: 518},
+ {from: 468, to: 541},
+ {from: 468, to: 620},
+ {from: 468, to: 680},
+ {from: 468, to: 686},
+ {from: 469, to: 514},
+ {from: 469, to: 535},
+ {from: 469, to: 539},
+ {from: 469, to: 542},
+ {from: 469, to: 600},
+ {from: 469, to: 608},
+ {from: 469, to: 624},
+ {from: 469, to: 631},
+ {from: 469, to: 653},
+ {from: 469, to: 669},
+ {from: 469, to: 698},
+ {from: 469, to: 734},
+ {from: 470, to: 471},
+ {from: 470, to: 477},
+ {from: 470, to: 479},
+ {from: 470, to: 515},
+ {from: 470, to: 518},
+ {from: 470, to: 541},
+ {from: 470, to: 620},
+ {from: 470, to: 680},
+ {from: 470, to: 686},
+ {from: 471, to: 477},
+ {from: 471, to: 479},
+ {from: 471, to: 515},
+ {from: 471, to: 518},
+ {from: 471, to: 541},
+ {from: 471, to: 550},
+ {from: 471, to: 620},
+ {from: 471, to: 680},
+ {from: 471, to: 686},
+ {from: 472, to: 473},
+ {from: 472, to: 508},
+ {from: 472, to: 521},
+ {from: 472, to: 523},
+ {from: 472, to: 543},
+ {from: 472, to: 562},
+ {from: 472, to: 565},
+ {from: 472, to: 589},
+ {from: 472, to: 594},
+ {from: 472, to: 604},
+ {from: 472, to: 649},
+ {from: 472, to: 663},
+ {from: 472, to: 682},
+ {from: 472, to: 728},
+ {from: 473, to: 508},
+ {from: 473, to: 521},
+ {from: 473, to: 523},
+ {from: 473, to: 533},
+ {from: 473, to: 543},
+ {from: 473, to: 562},
+ {from: 473, to: 565},
+ {from: 473, to: 589},
+ {from: 473, to: 594},
+ {from: 473, to: 604},
+ {from: 473, to: 663},
+ {from: 473, to: 728},
+ {from: 474, to: 485},
+ {from: 474, to: 553},
+ {from: 474, to: 621},
+ {from: 474, to: 632},
+ {from: 474, to: 638},
+ {from: 474, to: 639},
+ {from: 474, to: 657},
+ {from: 474, to: 671},
+ {from: 474, to: 715},
+ {from: 474, to: 726},
+ {from: 475, to: 480},
+ {from: 475, to: 498},
+ {from: 475, to: 517},
+ {from: 475, to: 518},
+ {from: 475, to: 573},
+ {from: 475, to: 577},
+ {from: 475, to: 611},
+ {from: 475, to: 614},
+ {from: 475, to: 623},
+ {from: 475, to: 648},
+ {from: 475, to: 656},
+ {from: 475, to: 678},
+ {from: 475, to: 687},
+ {from: 476, to: 502},
+ {from: 476, to: 513},
+ {from: 476, to: 530},
+ {from: 476, to: 544},
+ {from: 476, to: 681},
+ {from: 476, to: 683},
+ {from: 477, to: 479},
+ {from: 477, to: 515},
+ {from: 477, to: 518},
+ {from: 477, to: 541},
+ {from: 477, to: 620},
+ {from: 477, to: 680},
+ {from: 477, to: 686},
+ {from: 478, to: 481},
+ {from: 478, to: 482},
+ {from: 478, to: 558},
+ {from: 478, to: 622},
+ {from: 478, to: 675},
+ {from: 479, to: 515},
+ {from: 479, to: 518},
+ {from: 479, to: 541},
+ {from: 479, to: 620},
+ {from: 479, to: 680},
+ {from: 479, to: 686},
+ {from: 480, to: 497},
+ {from: 480, to: 498},
+ {from: 480, to: 517},
+ {from: 480, to: 573},
+ {from: 480, to: 577},
+ {from: 480, to: 611},
+ {from: 480, to: 614},
+ {from: 480, to: 623},
+ {from: 480, to: 648},
+ {from: 480, to: 678},
+ {from: 480, to: 687},
+ {from: 481, to: 482},
+ {from: 481, to: 503},
+ {from: 481, to: 534},
+ {from: 481, to: 622},
+ {from: 481, to: 670},
+ {from: 481, to: 675},
+ {from: 482, to: 622},
+ {from: 482, to: 653},
+ {from: 482, to: 675},
+ {from: 483, to: 484},
+ {from: 483, to: 512},
+ {from: 483, to: 565},
+ {from: 483, to: 661},
+ {from: 484, to: 512},
+ {from: 484, to: 701},
+ {from: 485, to: 553},
+ {from: 485, to: 621},
+ {from: 485, to: 632},
+ {from: 485, to: 638},
+ {from: 485, to: 639},
+ {from: 485, to: 657},
+ {from: 485, to: 663},
+ {from: 485, to: 671},
+ {from: 485, to: 715},
+ {from: 485, to: 726},
+ {from: 486, to: 531},
+ {from: 486, to: 607},
+ {from: 486, to: 618},
+ {from: 486, to: 634},
+ {from: 486, to: 711},
+ {from: 487, to: 555},
+ {from: 487, to: 600},
+ {from: 487, to: 608},
+ {from: 487, to: 642},
+ {from: 487, to: 645},
+ {from: 488, to: 533},
+ {from: 488, to: 561},
+ {from: 488, to: 579},
+ {from: 488, to: 626},
+ {from: 488, to: 627},
+ {from: 488, to: 647},
+ {from: 488, to: 662},
+ {from: 488, to: 705},
+ {from: 489, to: 499},
+ {from: 489, to: 529},
+ {from: 489, to: 548},
+ {from: 489, to: 552},
+ {from: 489, to: 569},
+ {from: 489, to: 595},
+ {from: 489, to: 643},
+ {from: 489, to: 710},
+ {from: 489, to: 720},
+ {from: 490, to: 529},
+ {from: 490, to: 547},
+ {from: 490, to: 567},
+ {from: 490, to: 586},
+ {from: 490, to: 622},
+ {from: 490, to: 675},
+ {from: 490, to: 676},
+ {from: 490, to: 699},
+ {from: 490, to: 717},
+ {from: 490, to: 728},
+ {from: 491, to: 521},
+ {from: 491, to: 603},
+ {from: 491, to: 646},
+ {from: 491, to: 647},
+ {from: 491, to: 650},
+ {from: 491, to: 651},
+ {from: 491, to: 689},
+ {from: 491, to: 724},
+ {from: 491, to: 725},
+ {from: 491, to: 729},
+ {from: 491, to: 730},
+ {from: 491, to: 734},
+ {from: 491, to: 735},
+ {from: 492, to: 535},
+ {from: 492, to: 536},
+ {from: 492, to: 549},
+ {from: 492, to: 551},
+ {from: 492, to: 609},
+ {from: 492, to: 615},
+ {from: 492, to: 700},
+ {from: 492, to: 718},
+ {from: 493, to: 494},
+ {from: 493, to: 519},
+ {from: 493, to: 525},
+ {from: 493, to: 526},
+ {from: 493, to: 582},
+ {from: 493, to: 585},
+ {from: 493, to: 605},
+ {from: 493, to: 624},
+ {from: 493, to: 631},
+ {from: 493, to: 655},
+ {from: 493, to: 722},
+ {from: 494, to: 519},
+ {from: 494, to: 525},
+ {from: 494, to: 526},
+ {from: 494, to: 582},
+ {from: 494, to: 585},
+ {from: 494, to: 605},
+ {from: 494, to: 631},
+ {from: 494, to: 655},
+ {from: 494, to: 722},
+ {from: 495, to: 570},
+ {from: 495, to: 584},
+ {from: 495, to: 598},
+ {from: 495, to: 599},
+ {from: 495, to: 666},
+ {from: 496, to: 507},
+ {from: 496, to: 534},
+ {from: 496, to: 566},
+ {from: 496, to: 606},
+ {from: 496, to: 613},
+ {from: 496, to: 630},
+ {from: 496, to: 659},
+ {from: 496, to: 673},
+ {from: 496, to: 682},
+ {from: 496, to: 714},
+ {from: 497, to: 516},
+ {from: 497, to: 524},
+ {from: 497, to: 538},
+ {from: 497, to: 633},
+ {from: 497, to: 635},
+ {from: 497, to: 636},
+ {from: 497, to: 637},
+ {from: 497, to: 684},
+ {from: 497, to: 688},
+ {from: 497, to: 697},
+ {from: 497, to: 736},
+ {from: 498, to: 517},
+ {from: 498, to: 543},
+ {from: 498, to: 573},
+ {from: 498, to: 577},
+ {from: 498, to: 611},
+ {from: 498, to: 614},
+ {from: 498, to: 623},
+ {from: 498, to: 629},
+ {from: 498, to: 648},
+ {from: 498, to: 678},
+ {from: 498, to: 679},
+ {from: 498, to: 687},
+ {from: 499, to: 548},
+ {from: 499, to: 552},
+ {from: 499, to: 595},
+ {from: 499, to: 710},
+ {from: 500, to: 505},
+ {from: 500, to: 537},
+ {from: 500, to: 574},
+ {from: 500, to: 587},
+ {from: 500, to: 597},
+ {from: 500, to: 649},
+ {from: 500, to: 691},
+ {from: 500, to: 702},
+ {from: 500, to: 706},
+ {from: 501, to: 506},
+ {from: 501, to: 550},
+ {from: 501, to: 563},
+ {from: 501, to: 588},
+ {from: 501, to: 617},
+ {from: 501, to: 712},
+ {from: 501, to: 727},
+ {from: 502, to: 513},
+ {from: 502, to: 530},
+ {from: 502, to: 544},
+ {from: 502, to: 681},
+ {from: 502, to: 683},
+ {from: 503, to: 520},
+ {from: 503, to: 534},
+ {from: 503, to: 590},
+ {from: 503, to: 628},
+ {from: 503, to: 664},
+ {from: 503, to: 670},
+ {from: 503, to: 709},
+ {from: 504, to: 578},
+ {from: 504, to: 596},
+ {from: 504, to: 602},
+ {from: 504, to: 610},
+ {from: 504, to: 661},
+ {from: 504, to: 665},
+ {from: 504, to: 690},
+ {from: 504, to: 692},
+ {from: 504, to: 693},
+ {from: 504, to: 721},
+ {from: 504, to: 723},
+ {from: 505, to: 537},
+ {from: 505, to: 574},
+ {from: 505, to: 587},
+ {from: 505, to: 597},
+ {from: 505, to: 649},
+ {from: 505, to: 691},
+ {from: 505, to: 702},
+ {from: 505, to: 706},
+ {from: 506, to: 550},
+ {from: 506, to: 563},
+ {from: 506, to: 588},
+ {from: 506, to: 617},
+ {from: 506, to: 712},
+ {from: 506, to: 727},
+ {from: 507, to: 534},
+ {from: 507, to: 566},
+ {from: 507, to: 606},
+ {from: 507, to: 613},
+ {from: 507, to: 659},
+ {from: 507, to: 673},
+ {from: 507, to: 682},
+ {from: 507, to: 714},
+ {from: 507, to: 715},
+ {from: 508, to: 521},
+ {from: 508, to: 523},
+ {from: 508, to: 543},
+ {from: 508, to: 562},
+ {from: 508, to: 565},
+ {from: 508, to: 589},
+ {from: 508, to: 594},
+ {from: 508, to: 604},
+ {from: 508, to: 663},
+ {from: 508, to: 728},
+ {from: 509, to: 510},
+ {from: 509, to: 546},
+ {from: 509, to: 564},
+ {from: 509, to: 581},
+ {from: 509, to: 592},
+ {from: 510, to: 546},
+ {from: 510, to: 564},
+ {from: 510, to: 581},
+ {from: 510, to: 592},
+ {from: 511, to: 528},
+ {from: 511, to: 539},
+ {from: 511, to: 571},
+ {from: 511, to: 580},
+ {from: 511, to: 593},
+ {from: 511, to: 601},
+ {from: 511, to: 618},
+ {from: 511, to: 619},
+ {from: 511, to: 652},
+ {from: 511, to: 703},
+ {from: 511, to: 716},
+ {from: 513, to: 530},
+ {from: 513, to: 544},
+ {from: 513, to: 681},
+ {from: 513, to: 683},
+ {from: 514, to: 535},
+ {from: 514, to: 539},
+ {from: 514, to: 542},
+ {from: 514, to: 624},
+ {from: 514, to: 653},
+ {from: 514, to: 669},
+ {from: 514, to: 698},
+ {from: 515, to: 518},
+ {from: 515, to: 541},
+ {from: 515, to: 620},
+ {from: 515, to: 680},
+ {from: 515, to: 686},
+ {from: 516, to: 524},
+ {from: 516, to: 538},
+ {from: 516, to: 633},
+ {from: 516, to: 635},
+ {from: 516, to: 636},
+ {from: 516, to: 637},
+ {from: 516, to: 684},
+ {from: 516, to: 688},
+ {from: 516, to: 696},
+ {from: 516, to: 697},
+ {from: 516, to: 736},
+ {from: 517, to: 537},
+ {from: 517, to: 573},
+ {from: 517, to: 577},
+ {from: 517, to: 611},
+ {from: 517, to: 614},
+ {from: 517, to: 623},
+ {from: 517, to: 636},
+ {from: 517, to: 648},
+ {from: 517, to: 678},
+ {from: 517, to: 687},
+ {from: 518, to: 541},
+ {from: 518, to: 611},
+ {from: 518, to: 620},
+ {from: 518, to: 656},
+ {from: 518, to: 680},
+ {from: 518, to: 686},
+ {from: 519, to: 525},
+ {from: 519, to: 526},
+ {from: 519, to: 582},
+ {from: 519, to: 585},
+ {from: 519, to: 605},
+ {from: 519, to: 631},
+ {from: 519, to: 655},
+ {from: 519, to: 722},
+ {from: 520, to: 590},
+ {from: 520, to: 628},
+ {from: 520, to: 664},
+ {from: 520, to: 670},
+ {from: 520, to: 709},
+ {from: 521, to: 523},
+ {from: 521, to: 543},
+ {from: 521, to: 562},
+ {from: 521, to: 565},
+ {from: 521, to: 589},
+ {from: 521, to: 594},
+ {from: 521, to: 603},
+ {from: 521, to: 604},
+ {from: 521, to: 663},
+ {from: 521, to: 728},
+ {from: 522, to: 525},
+ {from: 522, to: 527},
+ {from: 522, to: 532},
+ {from: 522, to: 567},
+ {from: 522, to: 612},
+ {from: 522, to: 625},
+ {from: 522, to: 654},
+ {from: 522, to: 667},
+ {from: 522, to: 677},
+ {from: 522, to: 679},
+ {from: 522, to: 685},
+ {from: 522, to: 707},
+ {from: 523, to: 543},
+ {from: 523, to: 562},
+ {from: 523, to: 565},
+ {from: 523, to: 589},
+ {from: 523, to: 594},
+ {from: 523, to: 604},
+ {from: 523, to: 649},
+ {from: 523, to: 663},
+ {from: 523, to: 682},
+ {from: 523, to: 728},
+ {from: 524, to: 538},
+ {from: 524, to: 633},
+ {from: 524, to: 635},
+ {from: 524, to: 636},
+ {from: 524, to: 637},
+ {from: 524, to: 684},
+ {from: 524, to: 688},
+ {from: 524, to: 697},
+ {from: 524, to: 736},
+ {from: 525, to: 526},
+ {from: 525, to: 527},
+ {from: 525, to: 567},
+ {from: 525, to: 582},
+ {from: 525, to: 585},
+ {from: 525, to: 605},
+ {from: 525, to: 631},
+ {from: 525, to: 655},
+ {from: 525, to: 722},
+ {from: 526, to: 582},
+ {from: 526, to: 585},
+ {from: 526, to: 605},
+ {from: 526, to: 631},
+ {from: 526, to: 652},
+ {from: 526, to: 655},
+ {from: 526, to: 667},
+ {from: 526, to: 722},
+ {from: 527, to: 532},
+ {from: 527, to: 567},
+ {from: 527, to: 612},
+ {from: 527, to: 625},
+ {from: 527, to: 654},
+ {from: 527, to: 667},
+ {from: 527, to: 677},
+ {from: 527, to: 679},
+ {from: 527, to: 685},
+ {from: 527, to: 707},
+ {from: 528, to: 562},
+ {from: 528, to: 571},
+ {from: 528, to: 576},
+ {from: 528, to: 580},
+ {from: 528, to: 593},
+ {from: 528, to: 601},
+ {from: 528, to: 606},
+ {from: 528, to: 618},
+ {from: 528, to: 619},
+ {from: 528, to: 646},
+ {from: 528, to: 652},
+ {from: 528, to: 703},
+ {from: 528, to: 713},
+ {from: 528, to: 716},
+ {from: 529, to: 547},
+ {from: 529, to: 567},
+ {from: 529, to: 569},
+ {from: 529, to: 586},
+ {from: 529, to: 643},
+ {from: 529, to: 676},
+ {from: 529, to: 699},
+ {from: 529, to: 717},
+ {from: 529, to: 720},
+ {from: 530, to: 544},
+ {from: 530, to: 681},
+ {from: 530, to: 683},
+ {from: 531, to: 607},
+ {from: 531, to: 634},
+ {from: 531, to: 711},
+ {from: 532, to: 540},
+ {from: 532, to: 612},
+ {from: 532, to: 625},
+ {from: 532, to: 654},
+ {from: 532, to: 667},
+ {from: 532, to: 677},
+ {from: 532, to: 679},
+ {from: 532, to: 685},
+ {from: 532, to: 704},
+ {from: 532, to: 707},
+ {from: 532, to: 732},
+ {from: 533, to: 579},
+ {from: 533, to: 626},
+ {from: 533, to: 627},
+ {from: 533, to: 662},
+ {from: 533, to: 705},
+ {from: 534, to: 566},
+ {from: 534, to: 606},
+ {from: 534, to: 613},
+ {from: 534, to: 659},
+ {from: 534, to: 670},
+ {from: 534, to: 673},
+ {from: 534, to: 682},
+ {from: 534, to: 714},
+ {from: 535, to: 539},
+ {from: 535, to: 542},
+ {from: 535, to: 624},
+ {from: 535, to: 653},
+ {from: 535, to: 669},
+ {from: 535, to: 698},
+ {from: 536, to: 549},
+ {from: 536, to: 551},
+ {from: 536, to: 609},
+ {from: 536, to: 615},
+ {from: 536, to: 700},
+ {from: 536, to: 718},
+ {from: 537, to: 574},
+ {from: 537, to: 587},
+ {from: 537, to: 597},
+ {from: 537, to: 636},
+ {from: 537, to: 649},
+ {from: 537, to: 691},
+ {from: 537, to: 702},
+ {from: 537, to: 706},
+ {from: 538, to: 633},
+ {from: 538, to: 635},
+ {from: 538, to: 636},
+ {from: 538, to: 637},
+ {from: 538, to: 684},
+ {from: 538, to: 688},
+ {from: 538, to: 697},
+ {from: 538, to: 736},
+ {from: 539, to: 542},
+ {from: 539, to: 624},
+ {from: 539, to: 653},
+ {from: 539, to: 669},
+ {from: 539, to: 698},
+ {from: 540, to: 568},
+ {from: 540, to: 640},
+ {from: 540, to: 641},
+ {from: 540, to: 695},
+ {from: 540, to: 704},
+ {from: 540, to: 708},
+ {from: 540, to: 732},
+ {from: 540, to: 733},
+ {from: 541, to: 620},
+ {from: 541, to: 680},
+ {from: 541, to: 686},
+ {from: 542, to: 624},
+ {from: 542, to: 653},
+ {from: 542, to: 669},
+ {from: 542, to: 698},
+ {from: 543, to: 562},
+ {from: 543, to: 565},
+ {from: 543, to: 573},
+ {from: 543, to: 589},
+ {from: 543, to: 594},
+ {from: 543, to: 604},
+ {from: 543, to: 629},
+ {from: 543, to: 663},
+ {from: 543, to: 679},
+ {from: 543, to: 728},
+ {from: 544, to: 681},
+ {from: 544, to: 683},
+ {from: 545, to: 556},
+ {from: 545, to: 557},
+ {from: 545, to: 558},
+ {from: 545, to: 656},
+ {from: 545, to: 660},
+ {from: 545, to: 674},
+ {from: 545, to: 694},
+ {from: 545, to: 696},
+ {from: 545, to: 722},
+ {from: 546, to: 564},
+ {from: 546, to: 581},
+ {from: 546, to: 592},
+ {from: 547, to: 567},
+ {from: 547, to: 586},
+ {from: 547, to: 627},
+ {from: 547, to: 676},
+ {from: 547, to: 699},
+ {from: 547, to: 717},
+ {from: 548, to: 552},
+ {from: 548, to: 595},
+ {from: 548, to: 710},
+ {from: 549, to: 551},
+ {from: 549, to: 609},
+ {from: 549, to: 615},
+ {from: 549, to: 700},
+ {from: 549, to: 718},
+ {from: 550, to: 563},
+ {from: 550, to: 588},
+ {from: 550, to: 617},
+ {from: 550, to: 712},
+ {from: 550, to: 727},
+ {from: 551, to: 609},
+ {from: 551, to: 615},
+ {from: 551, to: 700},
+ {from: 551, to: 718},
+ {from: 552, to: 595},
+ {from: 552, to: 710},
+ {from: 553, to: 621},
+ {from: 553, to: 632},
+ {from: 553, to: 638},
+ {from: 553, to: 639},
+ {from: 553, to: 657},
+ {from: 553, to: 671},
+ {from: 553, to: 715},
+ {from: 553, to: 726},
+ {from: 554, to: 630},
+ {from: 554, to: 672},
+ {from: 554, to: 701},
+ {from: 555, to: 600},
+ {from: 555, to: 608},
+ {from: 555, to: 642},
+ {from: 555, to: 645},
+ {from: 555, to: 707},
+ {from: 555, to: 726},
+ {from: 556, to: 557},
+ {from: 556, to: 558},
+ {from: 556, to: 656},
+ {from: 556, to: 660},
+ {from: 556, to: 674},
+ {from: 556, to: 694},
+ {from: 556, to: 696},
+ {from: 557, to: 558},
+ {from: 557, to: 656},
+ {from: 557, to: 660},
+ {from: 557, to: 674},
+ {from: 557, to: 694},
+ {from: 557, to: 696},
+ {from: 558, to: 656},
+ {from: 558, to: 660},
+ {from: 558, to: 674},
+ {from: 558, to: 694},
+ {from: 558, to: 696},
+ {from: 559, to: 560},
+ {from: 559, to: 561},
+ {from: 559, to: 658},
+ {from: 559, to: 731},
+ {from: 560, to: 561},
+ {from: 560, to: 658},
+ {from: 560, to: 731},
+ {from: 561, to: 647},
+ {from: 561, to: 658},
+ {from: 561, to: 731},
+ {from: 562, to: 565},
+ {from: 562, to: 576},
+ {from: 562, to: 589},
+ {from: 562, to: 594},
+ {from: 562, to: 604},
+ {from: 562, to: 606},
+ {from: 562, to: 646},
+ {from: 562, to: 663},
+ {from: 562, to: 713},
+ {from: 562, to: 728},
+ {from: 563, to: 588},
+ {from: 563, to: 617},
+ {from: 563, to: 712},
+ {from: 563, to: 727},
+ {from: 564, to: 581},
+ {from: 564, to: 592},
+ {from: 565, to: 589},
+ {from: 565, to: 594},
+ {from: 565, to: 604},
+ {from: 565, to: 661},
+ {from: 565, to: 663},
+ {from: 565, to: 728},
+ {from: 566, to: 606},
+ {from: 566, to: 613},
+ {from: 566, to: 659},
+ {from: 566, to: 673},
+ {from: 566, to: 682},
+ {from: 566, to: 714},
+ {from: 567, to: 586},
+ {from: 567, to: 676},
+ {from: 567, to: 699},
+ {from: 567, to: 717},
+ {from: 568, to: 640},
+ {from: 568, to: 641},
+ {from: 568, to: 695},
+ {from: 568, to: 704},
+ {from: 568, to: 708},
+ {from: 568, to: 709},
+ {from: 568, to: 732},
+ {from: 568, to: 733},
+ {from: 569, to: 572},
+ {from: 569, to: 591},
+ {from: 569, to: 629},
+ {from: 569, to: 643},
+ {from: 569, to: 644},
+ {from: 569, to: 719},
+ {from: 569, to: 720},
+ {from: 570, to: 584},
+ {from: 570, to: 598},
+ {from: 570, to: 599},
+ {from: 570, to: 666},
+ {from: 571, to: 580},
+ {from: 571, to: 589},
+ {from: 571, to: 593},
+ {from: 571, to: 601},
+ {from: 571, to: 618},
+ {from: 571, to: 619},
+ {from: 571, to: 623},
+ {from: 571, to: 644},
+ {from: 571, to: 652},
+ {from: 571, to: 703},
+ {from: 571, to: 716},
+ {from: 571, to: 719},
+ {from: 572, to: 591},
+ {from: 572, to: 629},
+ {from: 572, to: 643},
+ {from: 572, to: 644},
+ {from: 572, to: 693},
+ {from: 572, to: 719},
+ {from: 572, to: 720},
+ {from: 573, to: 577},
+ {from: 573, to: 611},
+ {from: 573, to: 614},
+ {from: 573, to: 623},
+ {from: 573, to: 629},
+ {from: 573, to: 648},
+ {from: 573, to: 678},
+ {from: 573, to: 679},
+ {from: 573, to: 687},
+ {from: 574, to: 587},
+ {from: 574, to: 597},
+ {from: 574, to: 649},
+ {from: 574, to: 691},
+ {from: 574, to: 702},
+ {from: 574, to: 706},
+ {from: 574, to: 718},
+ {from: 575, to: 576},
+ {from: 575, to: 583},
+ {from: 575, to: 603},
+ {from: 575, to: 612},
+ {from: 575, to: 616},
+ {from: 575, to: 668},
+ {from: 575, to: 681},
+ {from: 575, to: 713},
+ {from: 576, to: 583},
+ {from: 576, to: 603},
+ {from: 576, to: 606},
+ {from: 576, to: 616},
+ {from: 576, to: 646},
+ {from: 576, to: 668},
+ {from: 576, to: 713},
+ {from: 577, to: 611},
+ {from: 577, to: 614},
+ {from: 577, to: 623},
+ {from: 577, to: 648},
+ {from: 577, to: 678},
+ {from: 577, to: 687},
+ {from: 577, to: 721},
+ {from: 578, to: 596},
+ {from: 578, to: 601},
+ {from: 578, to: 602},
+ {from: 578, to: 610},
+ {from: 578, to: 655},
+ {from: 578, to: 661},
+ {from: 578, to: 665},
+ {from: 578, to: 690},
+ {from: 578, to: 692},
+ {from: 578, to: 693},
+ {from: 578, to: 721},
+ {from: 578, to: 723},
+ {from: 579, to: 593},
+ {from: 579, to: 626},
+ {from: 579, to: 627},
+ {from: 579, to: 662},
+ {from: 579, to: 705},
+ {from: 580, to: 593},
+ {from: 580, to: 601},
+ {from: 580, to: 618},
+ {from: 580, to: 619},
+ {from: 580, to: 652},
+ {from: 580, to: 703},
+ {from: 580, to: 716},
+ {from: 581, to: 592},
+ {from: 582, to: 585},
+ {from: 582, to: 605},
+ {from: 582, to: 631},
+ {from: 582, to: 655},
+ {from: 582, to: 722},
+ {from: 583, to: 603},
+ {from: 583, to: 616},
+ {from: 583, to: 654},
+ {from: 583, to: 668},
+ {from: 583, to: 702},
+ {from: 583, to: 713},
+ {from: 584, to: 598},
+ {from: 584, to: 599},
+ {from: 584, to: 666},
+ {from: 585, to: 605},
+ {from: 585, to: 631},
+ {from: 585, to: 655},
+ {from: 585, to: 722},
+ {from: 586, to: 627},
+ {from: 586, to: 676},
+ {from: 586, to: 699},
+ {from: 586, to: 717},
+ {from: 587, to: 597},
+ {from: 587, to: 649},
+ {from: 587, to: 691},
+ {from: 587, to: 702},
+ {from: 587, to: 706},
+ {from: 588, to: 617},
+ {from: 588, to: 712},
+ {from: 588, to: 727},
+ {from: 589, to: 594},
+ {from: 589, to: 604},
+ {from: 589, to: 623},
+ {from: 589, to: 644},
+ {from: 589, to: 663},
+ {from: 589, to: 719},
+ {from: 589, to: 728},
+ {from: 590, to: 628},
+ {from: 590, to: 664},
+ {from: 590, to: 670},
+ {from: 590, to: 709},
+ {from: 591, to: 629},
+ {from: 591, to: 643},
+ {from: 591, to: 644},
+ {from: 591, to: 693},
+ {from: 591, to: 719},
+ {from: 591, to: 720},
+ {from: 593, to: 601},
+ {from: 593, to: 618},
+ {from: 593, to: 619},
+ {from: 593, to: 652},
+ {from: 593, to: 703},
+ {from: 593, to: 716},
+ {from: 594, to: 604},
+ {from: 594, to: 663},
+ {from: 594, to: 728},
+ {from: 595, to: 710},
+ {from: 596, to: 602},
+ {from: 596, to: 610},
+ {from: 596, to: 661},
+ {from: 596, to: 665},
+ {from: 596, to: 690},
+ {from: 596, to: 692},
+ {from: 596, to: 693},
+ {from: 596, to: 721},
+ {from: 596, to: 723},
+ {from: 597, to: 649},
+ {from: 597, to: 691},
+ {from: 597, to: 702},
+ {from: 597, to: 706},
+ {from: 598, to: 599},
+ {from: 598, to: 666},
+ {from: 599, to: 666},
+ {from: 600, to: 608},
+ {from: 600, to: 631},
+ {from: 600, to: 642},
+ {from: 600, to: 645},
+ {from: 600, to: 734},
+ {from: 601, to: 618},
+ {from: 601, to: 619},
+ {from: 601, to: 652},
+ {from: 601, to: 655},
+ {from: 601, to: 703},
+ {from: 601, to: 716},
+ {from: 602, to: 610},
+ {from: 602, to: 661},
+ {from: 602, to: 665},
+ {from: 602, to: 690},
+ {from: 602, to: 692},
+ {from: 602, to: 693},
+ {from: 602, to: 703},
+ {from: 602, to: 721},
+ {from: 602, to: 723},
+ {from: 603, to: 616},
+ {from: 603, to: 668},
+ {from: 603, to: 713},
+ {from: 604, to: 621},
+ {from: 604, to: 663},
+ {from: 604, to: 706},
+ {from: 604, to: 728},
+ {from: 605, to: 631},
+ {from: 605, to: 655},
+ {from: 605, to: 722},
+ {from: 606, to: 613},
+ {from: 606, to: 646},
+ {from: 606, to: 659},
+ {from: 606, to: 673},
+ {from: 606, to: 682},
+ {from: 606, to: 713},
+ {from: 606, to: 714},
+ {from: 607, to: 634},
+ {from: 607, to: 711},
+ {from: 608, to: 631},
+ {from: 608, to: 642},
+ {from: 608, to: 645},
+ {from: 608, to: 734},
+ {from: 609, to: 615},
+ {from: 609, to: 700},
+ {from: 609, to: 718},
+ {from: 610, to: 661},
+ {from: 610, to: 665},
+ {from: 610, to: 690},
+ {from: 610, to: 692},
+ {from: 610, to: 693},
+ {from: 610, to: 721},
+ {from: 610, to: 723},
+ {from: 611, to: 614},
+ {from: 611, to: 623},
+ {from: 611, to: 648},
+ {from: 611, to: 656},
+ {from: 611, to: 678},
+ {from: 611, to: 687},
+ {from: 612, to: 616},
+ {from: 612, to: 625},
+ {from: 612, to: 654},
+ {from: 612, to: 667},
+ {from: 612, to: 677},
+ {from: 612, to: 679},
+ {from: 612, to: 681},
+ {from: 612, to: 685},
+ {from: 612, to: 707},
+ {from: 613, to: 659},
+ {from: 613, to: 673},
+ {from: 613, to: 682},
+ {from: 613, to: 714},
+ {from: 614, to: 623},
+ {from: 614, to: 648},
+ {from: 614, to: 678},
+ {from: 614, to: 687},
+ {from: 615, to: 700},
+ {from: 615, to: 718},
+ {from: 616, to: 668},
+ {from: 616, to: 681},
+ {from: 616, to: 713},
+ {from: 617, to: 680},
+ {from: 617, to: 712},
+ {from: 617, to: 727},
+ {from: 618, to: 619},
+ {from: 618, to: 652},
+ {from: 618, to: 703},
+ {from: 618, to: 716},
+ {from: 619, to: 652},
+ {from: 619, to: 703},
+ {from: 619, to: 716},
+ {from: 620, to: 680},
+ {from: 620, to: 686},
+ {from: 621, to: 632},
+ {from: 621, to: 638},
+ {from: 621, to: 639},
+ {from: 621, to: 657},
+ {from: 621, to: 671},
+ {from: 621, to: 706},
+ {from: 621, to: 715},
+ {from: 621, to: 726},
+ {from: 622, to: 675},
+ {from: 622, to: 676},
+ {from: 622, to: 728},
+ {from: 623, to: 644},
+ {from: 623, to: 648},
+ {from: 623, to: 678},
+ {from: 623, to: 687},
+ {from: 623, to: 719},
+ {from: 624, to: 653},
+ {from: 624, to: 669},
+ {from: 624, to: 698},
+ {from: 625, to: 654},
+ {from: 625, to: 667},
+ {from: 625, to: 677},
+ {from: 625, to: 679},
+ {from: 625, to: 685},
+ {from: 625, to: 707},
+ {from: 626, to: 627},
+ {from: 626, to: 662},
+ {from: 626, to: 705},
+ {from: 627, to: 662},
+ {from: 627, to: 705},
+ {from: 627, to: 717},
+ {from: 628, to: 664},
+ {from: 628, to: 670},
+ {from: 628, to: 709},
+ {from: 629, to: 643},
+ {from: 629, to: 644},
+ {from: 629, to: 679},
+ {from: 629, to: 719},
+ {from: 629, to: 720},
+ {from: 630, to: 672},
+ {from: 630, to: 701},
+ {from: 631, to: 655},
+ {from: 631, to: 722},
+ {from: 631, to: 734},
+ {from: 632, to: 638},
+ {from: 632, to: 639},
+ {from: 632, to: 657},
+ {from: 632, to: 671},
+ {from: 632, to: 715},
+ {from: 632, to: 726},
+ {from: 633, to: 635},
+ {from: 633, to: 636},
+ {from: 633, to: 637},
+ {from: 633, to: 684},
+ {from: 633, to: 688},
+ {from: 633, to: 697},
+ {from: 633, to: 736},
+ {from: 634, to: 711},
+ {from: 635, to: 636},
+ {from: 635, to: 637},
+ {from: 635, to: 684},
+ {from: 635, to: 688},
+ {from: 635, to: 697},
+ {from: 635, to: 736},
+ {from: 636, to: 637},
+ {from: 636, to: 684},
+ {from: 636, to: 688},
+ {from: 636, to: 697},
+ {from: 636, to: 736},
+ {from: 637, to: 684},
+ {from: 637, to: 688},
+ {from: 637, to: 697},
+ {from: 637, to: 736},
+ {from: 638, to: 639},
+ {from: 638, to: 657},
+ {from: 638, to: 671},
+ {from: 638, to: 692},
+ {from: 638, to: 715},
+ {from: 638, to: 723},
+ {from: 638, to: 726},
+ {from: 639, to: 657},
+ {from: 639, to: 671},
+ {from: 639, to: 715},
+ {from: 639, to: 726},
+ {from: 640, to: 641},
+ {from: 640, to: 695},
+ {from: 640, to: 704},
+ {from: 640, to: 708},
+ {from: 640, to: 732},
+ {from: 640, to: 733},
+ {from: 641, to: 695},
+ {from: 641, to: 704},
+ {from: 641, to: 708},
+ {from: 641, to: 709},
+ {from: 641, to: 732},
+ {from: 641, to: 733},
+ {from: 642, to: 645},
+ {from: 642, to: 707},
+ {from: 642, to: 726},
+ {from: 643, to: 644},
+ {from: 643, to: 719},
+ {from: 643, to: 720},
+ {from: 644, to: 719},
+ {from: 644, to: 720},
+ {from: 646, to: 647},
+ {from: 646, to: 650},
+ {from: 646, to: 651},
+ {from: 646, to: 689},
+ {from: 646, to: 713},
+ {from: 646, to: 724},
+ {from: 646, to: 725},
+ {from: 646, to: 729},
+ {from: 646, to: 730},
+ {from: 646, to: 734},
+ {from: 646, to: 735},
+ {from: 647, to: 650},
+ {from: 647, to: 651},
+ {from: 647, to: 689},
+ {from: 647, to: 724},
+ {from: 647, to: 725},
+ {from: 647, to: 729},
+ {from: 647, to: 730},
+ {from: 647, to: 734},
+ {from: 647, to: 735},
+ {from: 648, to: 678},
+ {from: 648, to: 687},
+ {from: 649, to: 682},
+ {from: 649, to: 691},
+ {from: 649, to: 702},
+ {from: 649, to: 706},
+ {from: 650, to: 651},
+ {from: 650, to: 689},
+ {from: 650, to: 724},
+ {from: 650, to: 725},
+ {from: 650, to: 729},
+ {from: 650, to: 730},
+ {from: 650, to: 734},
+ {from: 650, to: 735},
+ {from: 651, to: 689},
+ {from: 651, to: 724},
+ {from: 651, to: 725},
+ {from: 651, to: 729},
+ {from: 651, to: 730},
+ {from: 651, to: 734},
+ {from: 651, to: 735},
+ {from: 652, to: 667},
+ {from: 652, to: 703},
+ {from: 652, to: 716},
+ {from: 653, to: 669},
+ {from: 653, to: 698},
+ {from: 654, to: 667},
+ {from: 654, to: 668},
+ {from: 654, to: 677},
+ {from: 654, to: 679},
+ {from: 654, to: 685},
+ {from: 654, to: 702},
+ {from: 654, to: 707},
+ {from: 655, to: 722},
+ {from: 656, to: 660},
+ {from: 656, to: 674},
+ {from: 656, to: 694},
+ {from: 656, to: 696},
+ {from: 657, to: 671},
+ {from: 657, to: 715},
+ {from: 657, to: 726},
+ {from: 658, to: 731},
+ {from: 659, to: 673},
+ {from: 659, to: 682},
+ {from: 659, to: 714},
+ {from: 660, to: 674},
+ {from: 660, to: 694},
+ {from: 660, to: 696},
+ {from: 661, to: 665},
+ {from: 661, to: 690},
+ {from: 661, to: 692},
+ {from: 661, to: 693},
+ {from: 661, to: 721},
+ {from: 661, to: 723},
+ {from: 662, to: 705},
+ {from: 663, to: 728},
+ {from: 664, to: 670},
+ {from: 664, to: 709},
+ {from: 665, to: 690},
+ {from: 665, to: 692},
+ {from: 665, to: 693},
+ {from: 665, to: 721},
+ {from: 665, to: 723},
+ {from: 667, to: 677},
+ {from: 667, to: 679},
+ {from: 667, to: 685},
+ {from: 667, to: 707},
+ {from: 668, to: 702},
+ {from: 668, to: 713},
+ {from: 669, to: 698},
+ {from: 670, to: 709},
+ {from: 671, to: 715},
+ {from: 671, to: 726},
+ {from: 672, to: 701},
+ {from: 673, to: 682},
+ {from: 673, to: 714},
+ {from: 674, to: 694},
+ {from: 674, to: 696},
+ {from: 675, to: 676},
+ {from: 675, to: 728},
+ {from: 676, to: 699},
+ {from: 676, to: 717},
+ {from: 676, to: 728},
+ {from: 677, to: 679},
+ {from: 677, to: 685},
+ {from: 677, to: 707},
+ {from: 678, to: 687},
+ {from: 678, to: 721},
+ {from: 679, to: 685},
+ {from: 679, to: 707},
+ {from: 680, to: 686},
+ {from: 681, to: 683},
+ {from: 682, to: 714},
+ {from: 684, to: 688},
+ {from: 684, to: 697},
+ {from: 684, to: 736},
+ {from: 685, to: 707},
+ {from: 687, to: 721},
+ {from: 688, to: 697},
+ {from: 688, to: 736},
+ {from: 689, to: 724},
+ {from: 689, to: 725},
+ {from: 689, to: 729},
+ {from: 689, to: 730},
+ {from: 689, to: 734},
+ {from: 689, to: 735},
+ {from: 690, to: 692},
+ {from: 690, to: 693},
+ {from: 690, to: 721},
+ {from: 690, to: 723},
+ {from: 691, to: 702},
+ {from: 691, to: 706},
+ {from: 692, to: 693},
+ {from: 692, to: 721},
+ {from: 692, to: 723},
+ {from: 693, to: 721},
+ {from: 693, to: 723},
+ {from: 694, to: 696},
+ {from: 695, to: 704},
+ {from: 695, to: 708},
+ {from: 695, to: 732},
+ {from: 695, to: 733},
+ {from: 697, to: 736},
+ {from: 699, to: 717},
+ {from: 700, to: 718},
+ {from: 702, to: 706},
+ {from: 703, to: 716},
+ {from: 704, to: 708},
+ {from: 704, to: 732},
+ {from: 704, to: 733},
+ {from: 707, to: 726},
+ {from: 708, to: 732},
+ {from: 708, to: 733},
+ {from: 712, to: 727},
+ {from: 715, to: 726},
+ {from: 719, to: 720},
+ {from: 721, to: 723},
+ {from: 724, to: 725},
+ {from: 724, to: 729},
+ {from: 724, to: 730},
+ {from: 724, to: 734},
+ {from: 724, to: 735},
+ {from: 725, to: 729},
+ {from: 725, to: 730},
+ {from: 725, to: 734},
+ {from: 725, to: 735},
+ {from: 729, to: 730},
+ {from: 729, to: 734},
+ {from: 729, to: 735},
+ {from: 730, to: 734},
+ {from: 730, to: 735},
+ {from: 732, to: 733},
+ {from: 734, to: 735}
+];
diff --git a/examples/network/datasources/WorldCup2014.json b/examples/network/datasources/WorldCup2014.json
new file mode 100644
index 0000000000..2f921e0ec4
--- /dev/null
+++ b/examples/network/datasources/WorldCup2014.json
@@ -0,0 +1 @@
+{"edges":[{"source":"131","target":"580","id":"4385","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"186","target":"368","id":"5487","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"651","target":"725","id":"10555","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"28","target":"83","id":"2090","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"570","target":"584","id":"10163","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"113","target":"337","id":"4011","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"89","target":"726","id":"3532","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"245","target":"643","id":"6493","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"314","target":"714","id":"7596","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"325","target":"496","id":"7735","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"52","target":"492","id":"2661","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"489","target":"548","id":"9605","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"72","target":"363","id":"3136","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"296","target":"716","id":"7337","attributes":{"Weight":"1.0"},"color":"rgb(148,164,148)","size":1.0},{"source":"60","target":"713","id":"2864","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"210","target":"217","id":"5899","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"246","target":"696","id":"6512","attributes":{"Weight":"1.0"},"color":"rgb(196,67,164)","size":1.0},{"source":"62","target":"375","id":"2912","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"377","target":"561","id":"8391","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"14","target":"190","id":"1777","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"16","target":"21","id":"1821","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"90","target":"375","id":"3544","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"80","target":"348","id":"3315","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"34","target":"229","id":"2247","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"4","target":"347","id":"1543","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"61","target":"350","id":"2879","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"483","target":"512","id":"9570","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"461","target":"463","id":"9374","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"449","target":"478","id":"9249","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"2","target":"99","id":"1489","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"535","target":"669","id":"9978","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"242","target":"502","id":"6439","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"196","target":"728","id":"5678","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"303","target":"616","id":"7445","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"316","target":"643","id":"7620","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"549","target":"700","id":"10058","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"135","target":"717","id":"4479","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"97","target":"655","id":"3703","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"724","target":"730","id":"10678","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"173","target":"418","id":"5237","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"439","target":"695","id":"9144","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"350","target":"534","id":"8081","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"377","target":"391","id":"8378","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"176","target":"492","id":"5293","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"76","target":"728","id":"3240","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"95","target":"448","id":"3653","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"66","target":"78","id":"2993","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"236","target":"552","id":"6351","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"139","target":"434","id":"4545","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"22","target":"24","id":"1958","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"186","target":"334","id":"5485","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"30","target":"324","id":"2154","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"202","target":"450","id":"5775","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"524","target":"688","id":"9891","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"665","target":"693","id":"10599","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"215","target":"723","id":"6005","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"28","target":"627","id":"2118","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"2","target":"31","id":"1487","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"177","target":"625","id":"5320","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"179","target":"677","id":"5365","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"182","target":"662","id":"5412","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"135","target":"567","id":"4473","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"128","target":"248","id":"4309","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"45","target":"123","id":"2495","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"141","target":"622","id":"4601","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"71","target":"714","id":"3128","attributes":{"Weight":"1.0"},"color":"rgb(132,99,229)","size":1.0},{"source":"155","target":"227","id":"4888","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"591","target":"693","id":"10293","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"44","target":"648","id":"2487","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"23","target":"568","id":"1989","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"6","target":"477","id":"1594","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"145","target":"454","id":"4690","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"184","target":"270","id":"5442","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"385","target":"442","id":"8501","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"139","target":"702","id":"4554","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"173","target":"605","id":"5246","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"428","target":"652","id":"9013","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"16","target":"732","id":"1841","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"23","target":"540","id":"1988","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"444","target":"514","id":"9211","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"37","target":"210","id":"2312","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"103","target":"446","id":"3816","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"316","target":"720","id":"7625","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"82","target":"374","id":"3349","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"481","target":"670","id":"9564","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"262","target":"483","id":"6778","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"112","target":"209","id":"3990","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"345","target":"682","id":"8023","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"201","target":"334","id":"5755","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"337","target":"488","id":"7916","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"29","target":"307","id":"2128","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"224","target":"717","id":"6165","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"399","target":"647","id":"8691","attributes":{"Weight":"1.0"},"color":"rgb(148,83,196)","size":1.0},{"source":"347","target":"670","id":"8045","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"627","target":"717","id":"10445","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"115","target":"587","id":"4060","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"186","target":"710","id":"5494","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"551","target":"609","id":"10065","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"252","target":"291","id":"6599","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"442","target":"678","id":"9193","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"274","target":"631","id":"6970","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"454","target":"475","id":"9295","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"216","target":"286","id":"6007","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"567","target":"586","id":"10144","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"383","target":"587","id":"8477","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"230","target":"362","id":"6253","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"382","target":"438","id":"8451","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"104","target":"357","id":"3833","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"79","target":"385","id":"3286","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"191","target":"463","id":"5576","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"527","target":"679","id":"9918","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"104","target":"317","id":"3830","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"343","target":"588","id":"8001","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"252","target":"447","id":"6603","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"38","target":"277","id":"2340","attributes":{"Weight":"1.0"},"color":"rgb(229,180,67)","size":1.0},{"source":"557","target":"696","id":"10100","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"87","target":"663","id":"3478","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"215","target":"339","id":"5989","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"571","target":"719","id":"10178","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"204","target":"302","id":"5807","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"79","target":"455","id":"3290","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"9","target":"102","id":"1662","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"529","target":"699","id":"9941","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"228","target":"324","id":"6220","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"290","target":"395","id":"7245","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"275","target":"304","id":"6975","attributes":{"Weight":"1.0"},"color":"rgb(67,148,148)","size":1.0},{"source":"5","target":"258","id":"1564","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"44","target":"82","id":"2459","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"323","target":"443","id":"7711","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"212","target":"608","id":"5949","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"644","target":"720","id":"10518","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"300","target":"669","id":"7399","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"105","target":"234","id":"3846","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"677","target":"679","id":"10622","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"164","target":"166","id":"5056","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"299","target":"624","id":"7382","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"64","target":"354","id":"2963","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"176","target":"427","id":"5290","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"238","target":"713","id":"6385","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"293","target":"708","id":"7290","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"567","target":"676","id":"10145","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"213","target":"242","id":"5956","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"163","target":"388","id":"5046","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"396","target":"606","id":"8648","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"176","target":"456","id":"5291","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"41","target":"137","id":"2396","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"368","target":"569","id":"8272","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"78","target":"570","id":"3272","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"5","target":"603","id":"1576","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"241","target":"504","id":"6420","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"107","target":"705","id":"3888","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"323","target":"717","id":"7719","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"79","target":"140","id":"3279","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"299","target":"653","id":"7383","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"516","target":"633","id":"9815","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"511","target":"716","id":"9796","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"427","target":"609","id":"8999","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"325","target":"659","id":"7743","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"345","target":"714","id":"8024","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"207","target":"362","id":"5863","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"44","target":"79","id":"2458","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"66","target":"306","id":"3000","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"44","target":"573","id":"2480","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"133","target":"673","id":"4431","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"162","target":"384","id":"5024","attributes":{"Weight":"1.0"},"color":"rgb(115,229,99)","size":1.0},{"source":"216","target":"652","id":"6026","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"114","target":"246","id":"4026","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"146","target":"626","id":"4717","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"477","target":"515","id":"9532","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"251","target":"255","id":"6582","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"226","target":"714","id":"6194","attributes":{"Weight":"1.0"},"color":"rgb(213,132,148)","size":1.0},{"source":"272","target":"437","id":"6939","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"342","target":"691","id":"7989","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"110","target":"397","id":"3946","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"241","target":"480","id":"6418","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"55","target":"444","id":"2735","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"564","target":"592","id":"10131","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"38","target":"424","id":"2343","attributes":{"Weight":"1.0"},"color":"rgb(148,213,148)","size":1.0},{"source":"238","target":"668","id":"6384","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"646","target":"730","id":"10527","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"431","target":"586","id":"9046","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"425","target":"675","id":"8979","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"345","target":"534","id":"8017","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"86","target":"180","id":"3434","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"167","target":"607","id":"5127","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"180","target":"286","id":"5373","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"448","target":"501","id":"9239","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"235","target":"710","id":"6341","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"71","target":"83","id":"3105","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"151","target":"676","id":"4826","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"34","target":"581","id":"2262","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"372","target":"426","id":"8308","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"276","target":"355","id":"6995","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"110","target":"231","id":"3937","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"133","target":"613","id":"4429","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"44","target":"231","id":"2466","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"60","target":"201","id":"2839","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"493","target":"605","id":"9649","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"160","target":"671","id":"4996","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"415","target":"612","id":"8851","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"251","target":"696","id":"6598","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"117","target":"530","id":"4107","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"432","target":"443","id":"9052","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"64","target":"239","id":"2957","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"232","target":"576","id":"6289","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"209","target":"483","id":"5896","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"565","target":"663","id":"10136","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"63","target":"632","id":"2938","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"145","target":"331","id":"4683","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"125","target":"478","id":"4260","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"231","target":"575","id":"6269","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"20","target":"513","id":"1927","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"142","target":"542","id":"4620","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"222","target":"710","id":"6129","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"640","target":"708","id":"10502","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"33","target":"124","id":"2212","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"86","target":"428","id":"3442","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"241","target":"271","id":"6414","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"368","target":"548","id":"8270","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"487","target":"645","id":"9594","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"126","target":"513","id":"4280","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"193","target":"491","id":"5606","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"381","target":"719","id":"8449","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"392","target":"399","id":"8596","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"351","target":"609","id":"8099","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"74","target":"428","id":"3178","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"207","target":"344","id":"5860","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"72","target":"342","id":"3135","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"291","target":"481","id":"7265","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"1","target":"605","id":"1482","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"295","target":"592","id":"7322","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"334","target":"552","id":"7878","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"374","target":"433","id":"8334","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"205","target":"519","id":"5828","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"16","target":"51","id":"1827","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"100","target":"672","id":"3760","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"305","target":"334","id":"7464","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"326","target":"341","id":"7747","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"410","target":"557","id":"8813","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"300","target":"698","id":"7400","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"92","target":"176","id":"3575","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"80","target":"668","id":"3323","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"315","target":"389","id":"7598","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"157","target":"299","id":"4926","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"211","target":"261","id":"5915","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"460","target":"667","id":"9368","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"103","target":"318","id":"3813","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"69","target":"396","id":"3066","attributes":{"Weight":"1.0"},"color":"rgb(132,83,229)","size":1.0},{"source":"339","target":"504","id":"7940","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"479","target":"686","id":"9548","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"145","target":"289","id":"4679","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"434","target":"576","id":"9089","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"635","target":"697","id":"10477","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"298","target":"459","id":"7357","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"114","target":"632","id":"4038","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"165","target":"359","id":"5085","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"214","target":"483","id":"5981","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"332","target":"652","id":"7853","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"244","target":"682","id":"6475","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"61","target":"577","id":"2890","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"130","target":"701","id":"4369","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"23","target":"24","id":"1978","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"498","target":"573","id":"9691","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"266","target":"723","id":"6845","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"382","target":"481","id":"8456","attributes":{"Weight":"1.0"},"color":"rgb(132,164,148)","size":1.0},{"source":"258","target":"430","id":"6701","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"148","target":"458","id":"4745","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"279","target":"366","id":"7038","attributes":{"Weight":"1.0"},"color":"rgb(148,67,213)","size":1.0},{"source":"79","target":"614","id":"3298","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"150","target":"155","id":"4778","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"205","target":"526","id":"5830","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"647","target":"730","id":"10536","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"122","target":"614","id":"4206","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"332","target":"645","id":"7852","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"210","target":"488","id":"5905","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"387","target":"520","id":"8538","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"341","target":"365","id":"7965","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"199","target":"670","id":"5729","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"152","target":"163","id":"4829","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"561","target":"658","id":"10114","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"348","target":"603","id":"8055","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"166","target":"168","id":"5096","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"606","target":"646","id":"10353","attributes":{"Weight":"1.0"},"color":"rgb(132,83,229)","size":1.0},{"source":"3","target":"711","id":"1531","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"118","target":"387","id":"4119","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"239","target":"262","id":"6387","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"283","target":"413","id":"7129","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"202","target":"486","id":"5778","attributes":{"Weight":"1.0"},"color":"rgb(148,213,148)","size":1.0},{"source":"136","target":"206","id":"4483","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"65","target":"347","id":"2982","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"233","target":"699","id":"6310","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"116","target":"415","id":"4079","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"270","target":"312","id":"6905","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"561","target":"647","id":"10113","attributes":{"Weight":"1.0"},"color":"rgb(148,83,196)","size":1.0},{"source":"538","target":"684","id":"9998","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"205","target":"655","id":"5836","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"490","target":"675","id":"9617","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"64","target":"223","id":"2955","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"18","target":"65","id":"1866","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"460","target":"654","id":"9367","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"103","target":"357","id":"3815","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"30","target":"499","id":"2160","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"230","target":"262","id":"6248","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"368","target":"720","id":"8276","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"395","target":"405","id":"8633","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"165","target":"226","id":"5081","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"377","target":"394","id":"8381","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"5","target":"116","id":"1556","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"160","target":"322","id":"4985","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"338","target":"507","id":"7929","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"50","target":"419","id":"2619","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"253","target":"356","id":"6617","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"79","target":"475","id":"3291","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"362","target":"483","id":"8199","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"86","target":"332","id":"3440","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"182","target":"626","id":"5410","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"139","target":"430","id":"4544","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"174","target":"292","id":"5251","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"196","target":"381","id":"5658","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"560","target":"731","id":"10112","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"515","target":"686","id":"9812","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"506","target":"588","id":"9754","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"12","target":"424","id":"1741","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"299","target":"669","id":"7384","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"460","target":"606","id":"9363","attributes":{"Weight":"1.0"},"color":"rgb(132,148,180)","size":1.0},{"source":"401","target":"545","id":"8710","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"390","target":"658","id":"8576","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"661","target":"690","id":"10588","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"515","target":"518","id":"9808","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"162","target":"431","id":"5025","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"71","target":"210","id":"3112","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"395","target":"658","id":"8641","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"50","target":"643","id":"2627","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"317","target":"509","id":"7631","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"47","target":"254","id":"2546","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"398","target":"638","id":"8673","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"578","target":"596","id":"10224","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"523","target":"565","id":"9877","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"518","target":"541","id":"9834","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"305","target":"353","id":"7465","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"115","target":"363","id":"4052","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"28","target":"419","id":"2108","attributes":{"Weight":"1.0"},"color":"rgb(67,180,229)","size":1.0},{"source":"7","target":"596","id":"1616","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"61","target":"327","id":"2876","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"313","target":"459","id":"7569","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"343","target":"378","id":"7994","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"532","target":"685","id":"9957","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"6","target":"77","id":"1581","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"550","target":"712","id":"10063","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"196","target":"667","id":"5677","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"204","target":"636","id":"5815","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"299","target":"703","id":"7386","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"294","target":"629","id":"7307","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"204","target":"516","id":"5810","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"471","target":"515","id":"9469","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"297","target":"715","id":"7351","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"351","target":"367","id":"8089","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"400","target":"423","id":"8697","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"79","target":"648","id":"3300","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"660","target":"696","id":"10586","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"466","target":"646","id":"9419","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"155","target":"359","id":"4893","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"96","target":"234","id":"3673","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"370","target":"701","id":"8290","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"296","target":"525","id":"7329","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"438","target":"466","id":"9126","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"85","target":"323","id":"3417","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"432","target":"514","id":"9056","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"44","target":"627","id":"2486","attributes":{"Weight":"1.0"},"color":"rgb(67,180,196)","size":1.0},{"source":"272","target":"347","id":"6936","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"138","target":"437","id":"4525","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"300","target":"432","id":"7388","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"4","target":"664","id":"1551","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"345","target":"507","id":"8016","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"170","target":"556","id":"5182","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"290","target":"330","id":"7238","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"31","target":"153","id":"2171","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"220","target":"520","id":"6086","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"46","target":"565","id":"2538","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"150","target":"154","id":"4777","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"216","target":"593","id":"6020","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"217","target":"625","id":"6038","attributes":{"Weight":"1.0"},"color":"rgb(67,180,180)","size":1.0},{"source":"310","target":"518","id":"7534","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"16","target":"23","id":"1823","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"82","target":"480","id":"3357","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"332","target":"703","id":"7854","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"448","target":"712","id":"9246","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"384","target":"679","id":"8496","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"218","target":"572","id":"6058","attributes":{"Weight":"1.0"},"color":"rgb(148,115,213)","size":1.0},{"source":"454","target":"623","id":"9303","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"328","target":"615","id":"7791","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"378","target":"388","id":"8394","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"27","target":"575","id":"2077","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"23","target":"174","id":"1983","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"205","target":"218","id":"5821","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"242","target":"365","id":"6435","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"57","target":"604","id":"2788","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"289","target":"529","id":"7227","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"177","target":"366","id":"5308","attributes":{"Weight":"1.0"},"color":"rgb(67,148,180)","size":1.0},{"source":"416","target":"675","id":"8868","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"99","target":"672","id":"3743","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"153","target":"457","id":"4854","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"54","target":"261","id":"2699","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"184","target":"637","id":"5452","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"107","target":"662","id":"3887","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"124","target":"361","id":"4241","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"632","target":"639","id":"10460","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"406","target":"544","id":"8766","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"14","target":"72","id":"1774","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"170","target":"423","id":"5180","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"252","target":"661","id":"6613","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"96","target":"99","id":"3664","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"328","target":"609","id":"7790","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"537","target":"691","id":"9991","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"162","target":"723","id":"5039","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"24","target":"439","id":"2007","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"559","target":"560","id":"10106","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"246","target":"639","id":"6509","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"367","target":"551","id":"8260","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"36","target":"495","id":"2299","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"45","target":"478","id":"2509","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"48","target":"641","id":"2574","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"218","target":"279","id":"6047","attributes":{"Weight":"1.0"},"color":"rgb(148,115,213)","size":1.0},{"source":"304","target":"554","id":"7457","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"138","target":"404","id":"4523","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"154","target":"572","id":"4876","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"354","target":"484","id":"8128","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"56","target":"612","id":"2759","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"144","target":"150","id":"4649","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"575","target":"576","id":"10202","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"492","target":"549","id":"9637","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"431","target":"436","id":"9040","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"93","target":"618","id":"3613","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"359","target":"486","id":"8175","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"39","target":"711","id":"2374","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"160","target":"638","id":"4993","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"401","target":"556","id":"8711","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"113","target":"533","id":"4015","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"586","target":"699","id":"10269","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"76","target":"288","id":"3216","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"289","target":"717","id":"7236","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"98","target":"329","id":"3709","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"129","target":"155","id":"4325","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"243","target":"568","id":"6451","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"374","target":"396","id":"8333","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"176","target":"536","id":"5294","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"238","target":"303","id":"6369","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"206","target":"550","id":"5847","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"473","target":"594","id":"9498","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"370","target":"554","id":"8287","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"328","target":"551","id":"7789","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"23","target":"704","id":"1994","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"23","target":"733","id":"1997","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"260","target":"339","id":"6733","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"459","target":"477","id":"9349","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"44","target":"678","id":"2488","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"575","target":"668","id":"10207","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"465","target":"646","id":"9407","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"290","target":"560","id":"7253","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"129","target":"352","id":"4335","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"374","target":"623","id":"8345","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"343","target":"712","id":"8003","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"96","target":"457","id":"3679","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"542","target":"669","id":"10020","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"10","target":"457","id":"1699","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"416","target":"622","id":"8866","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"48","target":"733","id":"2579","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"433","target":"629","id":"9081","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"130","target":"481","id":"4362","attributes":{"Weight":"1.0"},"color":"rgb(132,148,148)","size":1.0},{"source":"259","target":"553","id":"6721","attributes":{"Weight":"1.0"},"color":"rgb(115,148,164)","size":1.0},{"source":"422","target":"572","id":"8937","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"8","target":"318","id":"1637","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"286","target":"703","id":"7178","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"147","target":"157","id":"4721","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"60","target":"324","id":"2846","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"27","target":"308","id":"2067","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"210","target":"407","id":"5903","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"231","target":"583","id":"6271","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"304","target":"630","id":"7458","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"41","target":"380","id":"2403","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"24","target":"732","id":"2015","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"38","target":"531","id":"2349","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"385","target":"678","id":"8515","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"580","target":"593","id":"10241","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"303","target":"415","id":"7435","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"375","target":"577","id":"8359","attributes":{"Weight":"1.0"},"color":"rgb(83,229,115)","size":1.0},{"source":"455","target":"698","id":"9319","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"102","target":"235","id":"3788","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"163","target":"617","id":"5053","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"180","target":"188","id":"5370","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"320","target":"609","id":"7683","attributes":{"Weight":"1.0"},"color":"rgb(164,99,148)","size":1.0},{"source":"57","target":"87","id":"2768","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"68","target":"270","id":"3039","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"342","target":"702","id":"7990","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"261","target":"450","id":"6760","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"516","target":"697","id":"9822","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"261","target":"279","id":"6752","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"536","target":"700","id":"9984","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"237","target":"452","id":"6361","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"14","target":"115","id":"1776","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"44","target":"717","id":"2490","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"217","target":"627","id":"6040","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"52","target":"615","id":"2666","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"287","target":"631","id":"7192","attributes":{"Weight":"1.0"},"color":"rgb(67,196,229)","size":1.0},{"source":"593","target":"703","id":"10300","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"57","target":"409","id":"2774","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"712","target":"727","id":"10672","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"62","target":"406","id":"2913","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"22","target":"568","id":"1970","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"38","target":"359","id":"2342","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"288","target":"523","id":"7207","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"410","target":"545","id":"8811","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"134","target":"476","id":"4443","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"60","target":"222","id":"2840","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"234","target":"600","id":"6322","attributes":{"Weight":"1.0"},"color":"rgb(67,148,229)","size":1.0},{"source":"247","target":"584","id":"6524","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"346","target":"664","id":"8034","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"150","target":"373","id":"4787","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"318","target":"371","id":"7639","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"145","target":"586","id":"4697","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"94","target":"673","id":"3636","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"482","target":"653","id":"9567","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"392","target":"394","id":"8594","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"53","target":"633","id":"2683","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"354","target":"362","id":"8125","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"485","target":"671","id":"9582","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"113","target":"705","id":"4021","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"474","target":"657","id":"9508","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"76","target":"508","id":"3227","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"17","target":"49","id":"1844","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"260","target":"266","id":"6730","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"112","target":"230","id":"3993","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"624","target":"698","id":"10433","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"601","target":"703","id":"10331","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"181","target":"369","id":"5393","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"229","target":"318","id":"6237","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"541","target":"686","id":"10017","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"443","target":"567","id":"9199","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"359","target":"430","id":"8172","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"556","target":"557","id":"10088","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"340","target":"346","id":"7953","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"155","target":"591","id":"4899","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"247","target":"389","id":"6520","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"316","target":"371","id":"7608","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"27","target":"576","id":"2078","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"95","target":"617","id":"3660","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"110","target":"179","id":"3935","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"545","target":"696","id":"10041","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"432","target":"719","id":"9068","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"568","target":"704","id":"10151","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"68","target":"73","id":"3033","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"297","target":"485","id":"7342","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"304","target":"652","id":"7459","attributes":{"Weight":"1.0"},"color":"rgb(148,115,148)","size":1.0},{"source":"159","target":"671","id":"4976","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"67","target":"73","id":"3013","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"332","target":"528","id":"7845","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"104","target":"275","id":"3827","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"89","target":"127","id":"3513","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"12","target":"202","id":"1731","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"168","target":"430","id":"5137","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"505","target":"574","id":"9745","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"299","target":"455","id":"7375","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"74","target":"172","id":"3170","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"465","target":"724","id":"9412","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"10","target":"130","id":"1688","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"2","target":"130","id":"1493","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"479","target":"515","id":"9543","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"5","target":"308","id":"1566","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"656","target":"660","id":"10573","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"401","target":"660","id":"8715","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"377","target":"390","id":"8377","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"56","target":"667","id":"2762","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"678","target":"687","id":"10625","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"420","target":"705","id":"8913","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"625","target":"654","id":"10434","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"8","target":"177","id":"1634","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"100","target":"181","id":"3749","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"143","target":"698","id":"4648","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"144","target":"603","id":"4668","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"348","target":"702","id":"8059","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"497","target":"684","id":"9685","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"382","target":"651","id":"8463","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"122","target":"687","id":"4210","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"422","target":"693","id":"8941","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"15","target":"274","id":"1806","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"156","target":"375","id":"4913","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"44","target":"547","id":"2479","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"309","target":"369","id":"7517","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"152","target":"343","id":"4833","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"310","target":"470","id":"7529","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"379","target":"505","id":"8411","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"11","target":"272","id":"1713","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"641","target":"733","id":"10510","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"178","target":"367","id":"5332","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"425","target":"472","id":"8965","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"624","target":"653","id":"10431","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"90","target":"213","id":"3538","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"86","target":"716","id":"3454","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"8","target":"646","id":"1652","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"66","target":"389","id":"3003","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"639","target":"715","id":"10497","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"16","target":"293","id":"1832","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"49","target":"317","id":"2590","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"32","target":"656","id":"2202","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"288","target":"567","id":"7213","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"174","target":"732","id":"5261","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"37","target":"722","id":"2327","attributes":{"Weight":"1.0"},"color":"rgb(67,148,229)","size":1.0},{"source":"402","target":"545","id":"8721","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"105","target":"309","id":"3848","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"234","target":"630","id":"6324","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"296","target":"582","id":"7331","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"555","target":"642","id":"10084","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"5","target":"335","id":"1567","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"415","target":"616","id":"8852","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"333","target":"528","id":"7858","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"634","target":"711","id":"10472","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"279","target":"676","id":"7051","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"531","target":"634","id":"9948","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"148","target":"298","id":"4741","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"218","target":"519","id":"6055","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"280","target":"376","id":"7059","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"94","target":"507","id":"3630","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"55","target":"542","id":"2741","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"425","target":"676","id":"8980","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"193","target":"466","id":"5605","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"5","target":"238","id":"1562","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"251","target":"410","id":"6588","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"67","target":"736","id":"3032","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"102","target":"324","id":"3792","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"337","target":"627","id":"7920","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"236","target":"324","id":"6343","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"143","target":"332","id":"4635","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"493","target":"494","id":"9643","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"280","target":"289","id":"7056","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"10","target":"369","id":"1697","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"306","target":"467","id":"7477","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"163","target":"448","id":"5047","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"218","target":"585","id":"6060","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"360","target":"727","id":"8192","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"99","target":"366","id":"3736","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"27","target":"76","id":"2057","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"125","target":"483","id":"4263","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"676","target":"699","id":"10619","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"364","target":"602","id":"8221","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"485","target":"657","id":"9580","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"167","target":"191","id":"5117","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"89","target":"322","id":"3520","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"279","target":"436","id":"7042","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"134","target":"683","id":"4449","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"255","target":"402","id":"6651","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"206","target":"360","id":"5841","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"670","target":"709","id":"10609","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"425","target":"440","id":"8963","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"294","target":"589","id":"7304","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"239","target":"361","id":"6391","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"152","target":"378","id":"4835","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"335","target":"575","id":"7886","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"283","target":"393","id":"7122","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"625","target":"707","id":"10439","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"684","target":"688","id":"10632","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"471","target":"518","id":"9470","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"121","target":"486","id":"4186","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"330","target":"566","id":"7827","attributes":{"Weight":"1.0"},"color":"rgb(213,67,196)","size":1.0},{"source":"48","target":"158","id":"2565","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"503","target":"628","id":"9729","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"301","target":"444","id":"7404","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"31","target":"99","id":"2166","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"208","target":"471","id":"5876","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"379","target":"597","id":"8415","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"40","target":"570","id":"2389","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"300","target":"444","id":"7389","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"547","target":"676","id":"10049","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"425","target":"473","id":"8966","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"460","target":"625","id":"9365","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"195","target":"274","id":"5637","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"176","target":"615","id":"5298","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"588","target":"727","id":"10278","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"603","target":"713","id":"10344","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"50","target":"371","id":"2616","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"218","target":"260","id":"6044","attributes":{"Weight":"1.0"},"color":"rgb(115,196,148)","size":1.0},{"source":"667","target":"677","id":"10602","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"478","target":"482","id":"9539","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"470","target":"541","id":"9463","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"119","target":"360","id":"4138","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"109","target":"248","id":"3914","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"82","target":"337","id":"3348","attributes":{"Weight":"1.0"},"color":"rgb(67,180,196)","size":1.0},{"source":"148","target":"310","id":"4743","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"5","target":"415","id":"1569","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"181","target":"370","id":"5394","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"100","target":"457","id":"3757","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"252","target":"565","id":"6611","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"256","target":"357","id":"6670","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"73","target":"633","id":"3161","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"61","target":"345","id":"2878","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"85","target":"547","id":"3425","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"375","target":"721","id":"8364","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"373","target":"677","id":"8327","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"258","target":"348","id":"6698","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"501","target":"617","id":"9718","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"136","target":"501","id":"4491","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"316","target":"719","id":"7624","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"349","target":"397","id":"8064","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"418","target":"631","id":"8888","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"245","target":"397","id":"6484","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"14","target":"695","id":"1797","attributes":{"Weight":"1.0"},"color":"rgb(148,148,83)","size":1.0},{"source":"10","target":"309","id":"1694","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"118","target":"670","id":"4128","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"115","target":"537","id":"4058","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"538","target":"688","id":"9999","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"106","target":"370","id":"3866","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"53","target":"688","id":"2688","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"311","target":"408","id":"7541","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"158","target":"568","id":"4951","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"146","target":"182","id":"4704","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"266","target":"665","id":"6840","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"582","target":"631","id":"10251","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"264","target":"734","id":"6816","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"39","target":"634","id":"2373","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"122","target":"385","id":"4195","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"142","target":"469","id":"4616","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"263","target":"444","id":"6785","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"131","target":"528","id":"4383","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"88","target":"610","id":"3504","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"458","target":"477","id":"9338","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"700","target":"718","id":"10663","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"618","target":"716","id":"10409","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"77","target":"307","id":"3245","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"113","target":"420","id":"4013","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"167","target":"711","id":"5129","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"508","target":"562","id":"9770","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"4","target":"590","id":"1549","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"361","target":"445","id":"8194","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"338","target":"350","id":"7925","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"315","target":"598","id":"7603","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"82","target":"454","id":"3355","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"29","target":"680","id":"2142","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"51","target":"568","id":"2638","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"69","target":"438","id":"3067","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"435","target":"631","id":"9103","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"115","target":"706","id":"4065","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"132","target":"214","id":"4400","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"443","target":"571","id":"9200","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"119","target":"617","id":"4147","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"4","target":"199","id":"1538","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"335","target":"713","id":"7894","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"58","target":"416","id":"2801","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"240","target":"603","id":"6408","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"152","target":"248","id":"4831","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"345","target":"606","id":"8019","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"94","target":"417","id":"3628","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"496","target":"566","id":"9670","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"120","target":"499","id":"4164","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"14","target":"200","id":"1779","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"135","target":"279","id":"4455","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"12","target":"642","id":"1749","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"177","target":"572","id":"5317","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"332","target":"571","id":"7846","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"234","target":"366","id":"6316","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"111","target":"569","id":"3978","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"46","target":"422","id":"2529","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"78","target":"380","id":"3268","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"5","target":"232","id":"1561","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"454","target":"678","id":"9305","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"504","target":"693","id":"9741","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"337","target":"420","id":"7915","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"66","target":"599","id":"3010","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"150","target":"591","id":"4795","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"249","target":"452","id":"6549","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"558","target":"660","id":"10102","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"448","target":"617","id":"9245","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"124","target":"132","id":"4228","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"196","target":"369","id":"5657","attributes":{"Weight":"1.0"},"color":"rgb(148,67,229)","size":1.0},{"source":"202","target":"211","id":"5765","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"109","target":"563","id":"3924","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"27","target":"238","id":"2064","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"95","target":"588","id":"3659","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"129","target":"531","id":"4343","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"547","target":"586","id":"10047","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"427","target":"492","id":"8995","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"375","target":"455","id":"8353","attributes":{"Weight":"1.0"},"color":"rgb(116,148,148)","size":1.0},{"source":"3","target":"38","id":"1510","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"180","target":"216","id":"5371","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"224","target":"280","id":"6144","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"247","target":"306","id":"6517","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"182","target":"407","id":"5405","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"393","target":"413","id":"8613","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"524","target":"684","id":"9890","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"330","target":"414","id":"7823","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"190","target":"363","id":"5555","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"197","target":"551","id":"5693","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"221","target":"600","id":"6110","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"349","target":"720","id":"8076","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"328","target":"549","id":"7788","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"239","target":"445","id":"6394","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"470","target":"479","id":"9460","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"34","target":"275","id":"2250","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"150","target":"245","id":"4781","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"217","target":"321","id":"6031","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"528","target":"619","id":"9929","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"226","target":"461","id":"6187","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"185","target":"425","id":"5463","attributes":{"Weight":"1.0"},"color":"rgb(229,132,148)","size":1.0},{"source":"296","target":"619","id":"7334","attributes":{"Weight":"1.0"},"color":"rgb(148,164,148)","size":1.0},{"source":"53","target":"183","id":"2672","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"443","target":"589","id":"9202","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"26","target":"252","id":"2044","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"143","target":"624","id":"4644","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"72","target":"200","id":"3133","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"114","target":"160","id":"4024","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"274","target":"494","id":"6963","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"95","target":"630","id":"3661","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"485","target":"632","id":"9577","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"355","target":"510","id":"8133","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"382","target":"650","id":"8462","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"256","target":"355","id":"6669","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"397","target":"644","id":"8660","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"150","target":"164","id":"4779","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"2","target":"630","id":"1506","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"203","target":"577","id":"5798","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"382","target":"735","id":"8471","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"119","target":"388","id":"4140","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"509","target":"546","id":"9778","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"145","target":"567","id":"4695","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"141","target":"249","id":"4588","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"93","target":"571","id":"3608","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"217","target":"337","id":"6032","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"289","target":"732","id":"7237","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"63","target":"671","id":"2942","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"254","target":"401","id":"6635","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"34","target":"510","id":"2259","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"51","target":"439","id":"2636","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"187","target":"301","id":"5498","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"248","target":"360","id":"6530","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"546","target":"592","id":"10045","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"134","target":"544","id":"4447","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"42","target":"580","id":"2429","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"131","target":"188","id":"4371","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"432","target":"653","id":"9065","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"400","target":"557","id":"8700","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"167","target":"185","id":"5116","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"631","target":"734","id":"10458","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"55","target":"669","id":"2744","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"313","target":"479","id":"7574","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"617","target":"727","id":"10405","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"330","target":"413","id":"7822","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"212","target":"676","id":"5954","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"387","target":"396","id":"8534","attributes":{"Weight":"1.0"},"color":"rgb(132,148,213)","size":1.0},{"source":"147","target":"444","id":"4729","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"117","target":"265","id":"4098","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"48","target":"540","id":"2571","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"489","target":"643","id":"9609","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"338","target":"345","id":"7924","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"30","target":"710","id":"2164","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"528","target":"606","id":"9927","attributes":{"Weight":"1.0"},"color":"rgb(213,115,148)","size":1.0},{"source":"21","target":"24","id":"1934","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"142","target":"539","id":"4619","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"125","target":"291","id":"4252","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"153","target":"219","id":"4847","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"77","target":"148","id":"3242","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"261","target":"366","id":"6756","attributes":{"Weight":"1.0"},"color":"rgb(67,148,229)","size":1.0},{"source":"457","target":"672","id":"9332","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"122","target":"374","id":"4194","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"207","target":"361","id":"5862","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"87","target":"562","id":"3472","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"94","target":"396","id":"3627","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"13","target":"192","id":"1758","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"38","target":"711","id":"2354","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"2","target":"234","id":"1497","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"119","target":"727","id":"4149","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"134","target":"530","id":"4446","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"166","target":"240","id":"5100","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"552","target":"710","id":"10070","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"105","target":"130","id":"3842","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"66","target":"192","id":"2995","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"80","target":"116","id":"3304","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"289","target":"704","id":"7235","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"129","target":"711","id":"4348","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"58","target":"125","id":"2794","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"259","target":"537","id":"6720","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"18","target":"199","id":"1869","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"227","target":"371","id":"6202","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"9","target":"60","id":"1661","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"7","target":"480","id":"1612","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"576","target":"646","id":"10214","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"42","target":"652","id":"2434","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"72","target":"702","id":"3148","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"202","target":"462","id":"5777","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"411","target":"658","id":"8826","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"148","target":"468","id":"4747","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"401","target":"402","id":"8707","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"2","target":"100","id":"1490","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"216","target":"277","id":"6006","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"42","target":"618","id":"2432","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"521","target":"594","id":"9858","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"421","target":"663","id":"8928","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"141","target":"481","id":"4598","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"186","target":"324","id":"5484","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"108","target":"494","id":"3898","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"480","target":"577","id":"9553","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"131","target":"716","id":"4395","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"264","target":"646","id":"6806","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"409","target":"440","id":"8792","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"211","target":"462","id":"5923","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"127","target":"246","id":"4288","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"61","target":"325","id":"2875","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"454","target":"517","id":"9298","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"17","target":"103","id":"1845","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"480","target":"678","id":"9558","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"159","target":"553","id":"4970","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"393","target":"561","id":"8617","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"368","target":"595","id":"8273","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"44","target":"614","id":"2484","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"488","target":"561","id":"9596","attributes":{"Weight":"1.0"},"color":"rgb(148,99,196)","size":1.0},{"source":"189","target":"655","id":"5547","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"136","target":"388","id":"4489","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"195","target":"205","id":"5635","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"199","target":"347","id":"5720","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"395","target":"399","id":"8632","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"62","target":"513","id":"2916","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"578","target":"610","id":"10227","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"177","target":"522","id":"5314","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"420","target":"626","id":"8910","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"221","target":"366","id":"6099","attributes":{"Weight":"1.0"},"color":"rgb(67,148,229)","size":1.0},{"source":"138","target":"628","id":"4529","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"157","target":"521","id":"4936","attributes":{"Weight":"1.0"},"color":"rgb(180,67,229)","size":1.0},{"source":"201","target":"548","id":"5761","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"391","target":"414","id":"8587","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"332","target":"618","id":"7850","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"201","target":"429","id":"5758","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"58","target":"249","id":"2797","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"474","target":"726","id":"9511","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"690","target":"692","id":"10645","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"475","target":"480","id":"9512","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"434","target":"668","id":"9093","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"386","target":"415","id":"8518","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"128","target":"336","id":"4310","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"450","target":"462","id":"9258","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"496","target":"714","id":"9677","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"47","target":"255","id":"2547","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"83","target":"407","id":"3379","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"522","target":"679","id":"9872","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"149","target":"566","id":"4770","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"42","target":"131","id":"2414","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"224","target":"547","id":"6157","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"242","target":"513","id":"6440","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"529","target":"569","id":"9937","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"86","target":"99","id":"3432","attributes":{"Weight":"1.0"},"color":"rgb(148,115,148)","size":1.0},{"source":"2","target":"701","id":"1509","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"2","target":"153","id":"1494","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"596","target":"602","id":"10306","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"112","target":"214","id":"3991","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"102","target":"264","id":"3790","attributes":{"Weight":"1.0"},"color":"rgb(148,83,180)","size":1.0},{"source":"29","target":"298","id":"2127","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"101","target":"230","id":"3770","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"187","target":"535","id":"5504","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"83","target":"533","id":"3382","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"82","target":"498","id":"3358","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"241","target":"453","id":"6417","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"149","target":"659","id":"4773","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"166","target":"677","id":"5112","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"307","target":"515","id":"7493","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"393","target":"731","id":"8619","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"87","target":"288","id":"3458","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"267","target":"446","id":"6853","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"376","target":"676","id":"8374","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"307","target":"620","id":"7496","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"429","target":"643","id":"9025","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"331","target":"567","id":"7837","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"57","target":"381","id":"2773","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"134","target":"265","id":"4437","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"239","target":"484","id":"6396","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"596","target":"665","id":"10309","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"36","target":"570","id":"2300","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"248","target":"501","id":"6534","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"637","target":"684","id":"10484","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"324","target":"499","id":"7725","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"126","target":"375","id":"4276","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"171","target":"579","id":"5203","attributes":{"Weight":"1.0"},"color":"rgb(132,99,229)","size":1.0},{"source":"205","target":"435","id":"5825","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"60","target":"120","id":"2835","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"287","target":"734","id":"7195","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"319","target":"600","id":"7668","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"52","target":"329","id":"2653","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"176","target":"351","id":"5286","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"584","target":"598","id":"10260","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"493","target":"525","id":"9645","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"352","target":"461","id":"8106","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"76","target":"425","id":"3221","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"222","target":"334","id":"6120","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"242","target":"683","id":"6445","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"330","target":"391","id":"7813","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"156","target":"476","id":"4915","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"301","target":"542","id":"7410","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"269","target":"731","id":"6903","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"111","target":"245","id":"3965","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"364","target":"721","id":"8229","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"40","target":"284","id":"2382","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"308","target":"555","id":"7504","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"151","target":"233","id":"4808","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"473","target":"663","id":"9500","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"266","target":"271","id":"6830","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"501","target":"588","id":"9717","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"536","target":"549","id":"9980","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"462","target":"555","id":"9384","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"251","target":"558","id":"6593","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"396","target":"534","id":"8646","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"496","target":"534","id":"9669","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"221","target":"225","id":"6092","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"88","target":"177","id":"3483","attributes":{"Weight":"1.0"},"color":"rgb(115,229,99)","size":1.0},{"source":"31","target":"106","id":"2169","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"166","target":"185","id":"5097","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"138","target":"220","id":"4517","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"314","target":"350","id":"7584","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"565","target":"589","id":"10132","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"534","target":"606","id":"9967","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"187","target":"653","id":"5508","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"279","target":"280","id":"7034","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"134","target":"502","id":"4444","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"273","target":"306","id":"6948","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"281","target":"466","id":"7082","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"4","target":"272","id":"1540","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"464","target":"492","id":"9396","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"674","target":"694","id":"10615","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"56","target":"707","id":"2766","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"197","target":"232","id":"5679","attributes":{"Weight":"1.0"},"color":"rgb(83,148,180)","size":1.0},{"source":"36","target":"40","id":"2285","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"199","target":"503","id":"5724","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"289","target":"376","id":"7221","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"246","target":"553","id":"6505","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"190","target":"232","id":"5551","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"365","target":"502","id":"8235","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"140","target":"455","id":"4569","attributes":{"Weight":"1.0"},"color":"rgb(99,148,180)","size":1.0},{"source":"310","target":"620","id":"7536","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"504","target":"661","id":"9737","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"131","target":"332","id":"4376","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"556","target":"694","id":"10093","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"183","target":"538","id":"5427","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"356","target":"401","id":"8139","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"407","target":"533","id":"8771","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"458","target":"468","id":"9335","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"534","target":"566","id":"9966","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"10","target":"100","id":"1685","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"290","target":"394","id":"7244","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"17","target":"318","id":"1855","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"198","target":"736","id":"5714","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"182","target":"210","id":"5400","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"218","target":"493","id":"6053","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"385","target":"573","id":"8508","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"341","target":"530","id":"7971","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"473","target":"508","id":"9490","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"591","target":"629","id":"10290","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"404","target":"709","id":"8752","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"456","target":"615","id":"9327","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"394","target":"658","id":"8630","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"443","target":"623","id":"9203","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"4","target":"628","id":"1550","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"493","target":"722","id":"9653","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"331","target":"586","id":"7838","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"329","target":"700","id":"7809","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"87","target":"523","id":"3470","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"36","target":"41","id":"2286","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"83","target":"662","id":"3386","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"110","target":"316","id":"3941","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"381","target":"562","id":"8440","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"140","target":"179","id":"4559","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"511","target":"601","id":"9791","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"384","target":"408","id":"8484","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"106","target":"309","id":"3863","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"403","target":"505","id":"8731","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"267","target":"564","id":"6858","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"571","target":"580","id":"10167","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"378","target":"617","id":"8404","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"367","target":"700","id":"8263","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"80","target":"616","id":"3322","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"102","target":"334","id":"3793","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"27","target":"348","id":"2069","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"138","target":"199","id":"4516","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"33","target":"643","id":"2241","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"118","target":"520","id":"4123","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"168","target":"359","id":"5135","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"77","target":"470","id":"3251","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"520","target":"628","id":"9849","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"485","target":"621","id":"9576","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"202","target":"225","id":"5768","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"396","target":"682","id":"8653","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"3","target":"226","id":"1520","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"284","target":"380","id":"7139","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"613","target":"714","id":"10393","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"219","target":"672","id":"6076","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"333","target":"618","id":"7864","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"381","target":"604","id":"8445","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"339","target":"596","id":"7943","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"417","target":"613","id":"8874","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"215","target":"578","id":"5994","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"138","target":"503","id":"4526","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"75","target":"194","id":"3196","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"102","target":"186","id":"3784","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"26","target":"59","id":"2038","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"164","target":"629","id":"5069","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"298","target":"515","id":"7363","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"456","target":"549","id":"9324","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"397","target":"719","id":"8663","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"35","target":"584","id":"2281","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"203","target":"623","id":"5801","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"171","target":"338","id":"5194","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"62","target":"91","id":"2901","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"703","target":"716","id":"10665","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"543","target":"629","id":"10028","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"173","target":"585","id":"5245","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"93","target":"528","id":"3607","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"177","target":"667","id":"5322","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"304","target":"366","id":"7452","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"112","target":"124","id":"3986","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"151","target":"342","id":"4815","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"349","target":"629","id":"8072","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"208","target":"515","id":"5879","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"409","target":"629","id":"8806","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"455","target":"624","id":"9314","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"205","target":"296","id":"5823","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"11","target":"709","id":"1727","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"296","target":"722","id":"7338","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"230","target":"239","id":"6247","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"241","target":"690","id":"6427","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"294","target":"569","id":"7301","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"91","target":"156","id":"3557","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"325","target":"613","id":"7742","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"485","target":"715","id":"9583","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"13","target":"570","id":"1768","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"189","target":"484","id":"5543","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"56","target":"384","id":"2752","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"106","target":"457","id":"3867","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"227","target":"644","id":"6213","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"438","target":"729","id":"9136","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"68","target":"736","id":"3055","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"565","target":"728","id":"10137","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"506","target":"563","id":"9753","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"562","target":"646","id":"10122","attributes":{"Weight":"1.0"},"color":"rgb(148,83,229)","size":1.0},{"source":"317","target":"546","id":"7633","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"160","target":"485","id":"4988","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"21","target":"439","id":"1946","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"33","target":"262","id":"2223","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"146","target":"321","id":"4709","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"425","target":"589","id":"8974","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"30","target":"429","id":"2158","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"650","target":"725","id":"10548","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"393","target":"560","id":"8616","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"199","target":"340","id":"5718","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"294","target":"349","id":"7294","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"454","target":"611","id":"9301","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"278","target":"662","id":"7032","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"660","target":"694","id":"10585","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"112","target":"262","id":"3995","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"35","target":"380","id":"2276","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"99","target":"130","id":"3728","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"20","target":"681","id":"1930","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"24","target":"540","id":"2008","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"9","target":"235","id":"1668","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"8","target":"60","id":"1627","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"183","target":"707","id":"5437","attributes":{"Weight":"1.0"},"color":"rgb(99,229,99)","size":1.0},{"source":"573","target":"679","id":"10193","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"577","target":"721","id":"10223","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"152","target":"588","id":"4842","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"378","target":"563","id":"8402","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"82","target":"475","id":"3356","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"498","target":"577","id":"9692","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"125","target":"565","id":"4264","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"151","target":"436","id":"4818","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"277","target":"333","id":"7006","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"279","target":"331","id":"7037","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"242","target":"406","id":"6437","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"49","target":"658","id":"2601","attributes":{"Weight":"1.0"},"color":"rgb(148,148,115)","size":1.0},{"source":"115","target":"383","id":"4054","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"89","target":"398","id":"3521","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"195","target":"444","id":"5641","attributes":{"Weight":"1.0"},"color":"rgb(99,115,229)","size":1.0},{"source":"252","target":"675","id":"6614","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"44","target":"238","id":"2467","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"275","target":"546","id":"6986","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"82","target":"327","id":"3347","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"46","target":"58","id":"2517","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"69","target":"689","id":"3077","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"342","target":"547","id":"7982","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"71","target":"626","id":"3124","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"262","target":"484","id":"6779","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"46","target":"661","id":"2540","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"16","target":"695","id":"1838","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"299","target":"602","id":"7381","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"459","target":"515","id":"9351","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"228","target":"334","id":"6221","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"60","target":"228","id":"2841","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"429","target":"569","id":"9023","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"338","target":"566","id":"7931","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"33","target":"720","id":"2242","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"393","target":"414","id":"8614","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"141","target":"252","id":"4589","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"215","target":"602","id":"5996","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"75","target":"383","id":"3202","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"214","target":"354","id":"5977","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"77","target":"298","id":"3244","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"127","target":"638","id":"4298","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"100","target":"630","id":"3759","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"30","target":"489","id":"2159","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"325","target":"714","id":"7746","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"7","target":"241","id":"1605","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"114","target":"553","id":"4036","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"388","target":"727","id":"8554","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"440","target":"663","id":"9163","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"70","target":"202","id":"3084","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"521","target":"543","id":"9854","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"321","target":"533","id":"7689","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"147","target":"669","id":"4738","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"104","target":"546","id":"3837","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"349","target":"419","id":"8065","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"89","target":"632","id":"3526","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"688","target":"736","id":"10638","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"431","target":"547","id":"9044","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"372","target":"492","id":"8312","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"40","target":"389","id":"2386","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"118","target":"664","id":"4127","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"71","target":"407","id":"3119","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"123","target":"482","id":"4224","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"267","target":"317","id":"6849","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"546","target":"564","id":"10043","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"435","target":"493","id":"9095","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"356","target":"400","id":"8138","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"430","target":"634","id":"9035","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"134","target":"513","id":"4445","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"7","target":"578","id":"1615","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"310","target":"477","id":"7531","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"172","target":"625","id":"5224","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"22","target":"158","id":"1963","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"14","target":"194","id":"1778","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"375","target":"687","id":"8363","attributes":{"Weight":"1.0"},"color":"rgb(83,229,115)","size":1.0},{"source":"222","target":"228","id":"6115","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"213","target":"530","id":"5966","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"266","target":"364","id":"6832","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"127","target":"257","id":"4289","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"2","target":"672","id":"1508","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"391","target":"394","id":"8580","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"138","target":"520","id":"4527","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"204","target":"637","id":"5816","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"127","target":"726","id":"4304","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"497","target":"538","id":"9680","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"269","target":"559","id":"6899","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"88","target":"261","id":"3489","attributes":{"Weight":"1.0"},"color":"rgb(115,229,148)","size":1.0},{"source":"289","target":"547","id":"7230","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"107","target":"146","id":"3873","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"461","target":"531","id":"9377","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"325","target":"338","id":"7730","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"163","target":"588","id":"5052","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"137","target":"666","id":"4514","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"278","target":"626","id":"7030","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"257","target":"553","id":"6684","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"27","target":"679","id":"2084","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"264","target":"724","id":"6812","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"49","target":"357","id":"2593","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"94","target":"682","id":"3637","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"366","target":"572","id":"8246","attributes":{"Weight":"1.0"},"color":"rgb(148,67,213)","size":1.0},{"source":"107","target":"579","id":"3884","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"253","target":"556","id":"6624","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"141","target":"696","id":"4603","attributes":{"Weight":"1.0"},"color":"rgb(213,148,83)","size":1.0},{"source":"16","target":"24","id":"1824","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"215","target":"638","id":"5998","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"264","target":"729","id":"6814","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"336","target":"343","id":"7896","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"1","target":"218","id":"1470","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"212","target":"462","id":"5944","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"629","target":"644","id":"10450","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"38","target":"168","id":"2335","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"19","target":"449","id":"1903","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"170","target":"356","id":"5175","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"130","target":"534","id":"4364","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"365","target":"544","id":"8238","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"266","target":"578","id":"6835","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"441","target":"465","id":"9167","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"381","target":"409","id":"8428","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"3","target":"121","id":"1512","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"196","target":"652","id":"5675","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"98","target":"176","id":"3705","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"227","target":"720","id":"6216","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"94","target":"613","id":"3634","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"489","target":"552","id":"9606","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"66","target":"402","id":"3004","attributes":{"Weight":"1.0"},"color":"rgb(148,132,164)","size":1.0},{"source":"545","target":"656","id":"10037","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"100","target":"219","id":"3750","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"159","target":"246","id":"4962","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"8","target":"654","id":"1653","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"401","target":"558","id":"8713","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"241","target":"602","id":"6423","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"356","target":"674","id":"8149","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"125","target":"237","id":"4249","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"57","target":"440","id":"2777","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"60","target":"562","id":"2858","attributes":{"Weight":"1.0"},"color":"rgb(229,67,180)","size":1.0},{"source":"45","target":"59","id":"2493","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"328","target":"372","id":"7781","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"72","target":"706","id":"3149","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"74","target":"625","id":"3185","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"53","target":"270","id":"2676","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"173","target":"655","id":"5248","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"159","target":"639","id":"4974","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"54","target":"451","id":"2710","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"336","target":"501","id":"7903","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"103","target":"509","id":"3817","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"142","target":"624","id":"4621","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"277","target":"528","id":"7011","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"96","target":"366","id":"3676","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"187","target":"299","id":"5496","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"392","target":"393","id":"8593","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"521","target":"604","id":"9860","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"444","target":"624","id":"9215","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"137","target":"584","id":"4511","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"308","target":"348","id":"7500","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"319","target":"720","id":"7673","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"33","target":"361","id":"2229","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"121","target":"634","id":"4189","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"169","target":"318","id":"5155","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"133","target":"396","id":"4422","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"331","target":"490","id":"7834","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"86","target":"131","id":"3433","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"90","target":"544","id":"3550","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"172","target":"654","id":"5225","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"204","target":"635","id":"5814","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"107","target":"337","id":"3879","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"473","target":"523","id":"9492","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"132","target":"484","id":"4412","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"285","target":"382","id":"7148","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"94","target":"314","id":"3622","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"160","target":"553","id":"4989","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"203","target":"678","id":"5804","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"219","target":"554","id":"6074","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"226","target":"486","id":"6189","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"310","target":"479","id":"7532","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"104","target":"295","id":"3829","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"60","target":"334","id":"2847","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"69","target":"650","id":"3075","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"295","target":"446","id":"7316","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"241","target":"266","id":"6413","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"466","target":"647","id":"9420","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"640","target":"732","id":"10503","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"169","target":"355","id":"5157","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"175","target":"263","id":"5264","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"179","target":"238","id":"5348","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"263","target":"300","id":"6782","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"63","target":"89","id":"2921","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"265","target":"544","id":"6827","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"93","target":"579","id":"3609","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"478","target":"622","id":"9541","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"111","target":"368","id":"3970","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"350","target":"417","id":"8078","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"215","target":"266","id":"5987","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"247","target":"315","id":"6518","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"171","target":"350","id":"5196","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"367","target":"549","id":"8259","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"82","target":"203","id":"3346","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"49","target":"509","id":"2595","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"57","target":"523","id":"2782","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"32","target":"696","id":"2206","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"271","target":"453","id":"6920","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"253","target":"694","id":"6630","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"69","target":"647","id":"3074","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"3","target":"185","id":"1518","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"388","target":"712","id":"8553","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"190","target":"537","id":"5561","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"481","target":"482","id":"9560","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"146","target":"286","id":"4708","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"334","target":"710","id":"7880","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"143","target":"542","id":"4643","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"387","target":"633","id":"8541","attributes":{"Weight":"1.0"},"color":"rgb(99,229,132)","size":1.0},{"source":"17","target":"581","id":"1863","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"290","target":"392","id":"7242","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"180","target":"333","id":"5375","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"16","target":"158","id":"1828","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"99","target":"369","id":"3737","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"61","target":"714","id":"2898","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"384","target":"431","id":"8485","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"149","target":"325","id":"4761","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"378","target":"448","id":"8396","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"408","target":"612","id":"8781","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"128","target":"501","id":"4316","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"539","target":"653","id":"10004","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"149","target":"714","id":"4776","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"284","target":"389","id":"7140","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"427","target":"549","id":"8997","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"57","target":"521","id":"2781","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"461","target":"661","id":"9381","attributes":{"Weight":"1.0"},"color":"rgb(196,213,67)","size":1.0},{"source":"419","target":"462","id":"8895","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"261","target":"693","id":"6771","attributes":{"Weight":"1.0"},"color":"rgb(115,229,148)","size":1.0},{"source":"392","target":"559","id":"8602","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"694","target":"696","id":"10656","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"24","target":"158","id":"2002","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"526","target":"652","id":"9907","attributes":{"Weight":"1.0"},"color":"rgb(148,164,148)","size":1.0},{"source":"31","target":"369","id":"2178","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"578","target":"665","id":"10230","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"139","target":"583","id":"4549","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"146","target":"662","id":"4719","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"480","target":"687","id":"9559","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"12","target":"608","id":"1748","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"193","target":"646","id":"5607","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"63","target":"161","id":"2927","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"244","target":"325","id":"6460","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"30","target":"120","id":"2146","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"190","target":"342","id":"5554","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"448","target":"588","id":"9244","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"28","target":"643","id":"2119","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"315","target":"666","id":"7605","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"524","target":"736","id":"9893","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"102","target":"201","id":"3785","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"60","target":"353","id":"2848","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"122","target":"480","id":"4200","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"298","target":"310","id":"7354","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"39","target":"430","id":"2367","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"334","target":"548","id":"7877","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"428","target":"593","id":"9009","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"112","target":"239","id":"3994","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"250","target":"400","id":"6564","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"252","target":"483","id":"6610","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"381","target":"432","id":"8431","attributes":{"Weight":"1.0"},"color":"rgb(180,67,229)","size":1.0},{"source":"129","target":"486","id":"4342","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"149","target":"314","id":"4760","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"77","target":"458","id":"3248","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"243","target":"292","id":"6447","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"21","target":"74","id":"1938","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"364","target":"661","id":"8223","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"177","target":"527","id":"5315","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"199","target":"437","id":"5723","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"229","target":"592","id":"6246","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"301","target":"432","id":"7403","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"166","target":"191","id":"5098","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"84","target":"627","id":"3403","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"255","target":"400","id":"6649","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"284","target":"599","id":"7146","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"663","target":"728","id":"10594","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"167","target":"240","id":"5119","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"392","target":"658","id":"8605","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"70","target":"642","id":"3103","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"33","target":"419","id":"2232","attributes":{"Weight":"1.0"},"color":"rgb(148,180,148)","size":1.0},{"source":"119","target":"136","id":"4131","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"156","target":"513","id":"4917","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"495","target":"598","id":"9665","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"44","target":"577","id":"2481","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"261","target":"422","id":"6758","attributes":{"Weight":"1.0"},"color":"rgb(132,229,148)","size":1.0},{"source":"21","target":"158","id":"1939","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"15","target":"582","id":"1815","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"622","target":"676","id":"10424","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"383","target":"537","id":"8475","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"142","target":"514","id":"4617","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"632","target":"657","id":"10461","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"143","target":"147","id":"4626","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"265","target":"406","id":"6822","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"195","target":"585","id":"5648","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"274","target":"655","id":"6971","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"284","target":"570","id":"7143","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"386","target":"612","id":"8524","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"651","target":"734","id":"10558","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"113","target":"321","id":"4010","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"270","target":"736","id":"6917","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"253","target":"545","id":"6623","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"246","target":"621","id":"6506","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"95","target":"128","id":"3641","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"513","target":"544","id":"9798","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"118","target":"347","id":"4118","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"389","target":"598","id":"8559","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"107","target":"626","id":"3885","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"504","target":"690","id":"9739","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"373","target":"719","id":"8329","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"171","target":"325","id":"5193","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"429","target":"720","id":"9027","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"28","target":"429","id":"2110","attributes":{"Weight":"1.0"},"color":"rgb(148,99,180)","size":1.0},{"source":"37","target":"217","id":"2313","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"24","target":"174","id":"2003","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"54","target":"225","id":"2698","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"358","target":"642","id":"8168","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"381","target":"440","id":"8432","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"305","target":"429","id":"7467","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"247","target":"284","id":"6516","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"455","target":"721","id":"9320","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"298","target":"477","id":"7361","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"90","target":"549","id":"3551","attributes":{"Weight":"1.0"},"color":"rgb(100,148,148)","size":1.0},{"source":"28","target":"182","id":"2097","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"57","target":"271","id":"2771","attributes":{"Weight":"1.0"},"color":"rgb(196,148,148)","size":1.0},{"source":"67","target":"538","id":"3024","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"197","target":"427","id":"5687","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"245","target":"368","id":"6481","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"245","target":"569","id":"6489","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"494","target":"631","id":"9660","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"391","target":"395","id":"8581","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"425","target":"594","id":"8975","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"293","target":"704","id":"7289","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"120","target":"548","id":"4165","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"68","target":"198","id":"3036","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"27","target":"144","id":"2061","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"1","target":"274","id":"1471","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"621","target":"632","id":"10415","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"69","target":"382","id":"3064","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"341","target":"513","id":"7970","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"508","target":"728","id":"9776","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"408","target":"654","id":"8783","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"441","target":"651","id":"9173","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"438","target":"650","id":"9130","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"382","target":"465","id":"8454","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"318","target":"581","id":"7649","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"4","target":"670","id":"1552","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"204","target":"697","id":"5819","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"428","target":"716","id":"9016","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"577","target":"614","id":"10218","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"319","target":"487","id":"7663","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"179","target":"522","id":"5355","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"369","target":"526","id":"8279","attributes":{"Weight":"1.0"},"color":"rgb(67,115,229)","size":1.0},{"source":"128","target":"712","id":"4323","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"111","target":"150","id":"3960","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"575","target":"612","id":"10205","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"59","target":"141","id":"2817","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"494","target":"525","id":"9655","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"257","target":"398","id":"6680","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"478","target":"481","id":"9538","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"67","target":"633","id":"3025","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"322","target":"632","id":"7700","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"571","target":"644","id":"10174","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"366","target":"422","id":"8243","attributes":{"Weight":"1.0"},"color":"rgb(132,148,148)","size":1.0},{"source":"426","target":"492","id":"8985","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"107","target":"182","id":"3874","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"392","target":"413","id":"8600","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"642","target":"707","id":"10512","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"381","target":"565","id":"8441","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"331","target":"443","id":"7833","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"114","target":"161","id":"4025","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"522","target":"677","id":"9871","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"313","target":"620","id":"7578","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"281","target":"729","id":"7092","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"84","target":"579","id":"3401","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"70","target":"287","id":"3091","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"2","target":"309","id":"1499","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"491","target":"647","id":"9625","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"655","target":"722","id":"10572","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"268","target":"392","id":"6868","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"57","target":"508","id":"2780","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"142","target":"535","id":"4618","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"275","target":"317","id":"6976","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"10","target":"96","id":"1683","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"222","target":"353","id":"6121","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"222","target":"595","id":"6128","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"223","target":"239","id":"6131","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"518","target":"656","id":"9837","attributes":{"Weight":"1.0"},"color":"rgb(229,83,83)","size":1.0},{"source":"324","target":"368","id":"7722","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"91","target":"406","id":"3565","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"371","target":"576","id":"8298","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"126","target":"213","id":"4270","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"285","target":"725","id":"7160","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"37","target":"113","id":"2309","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"187","target":"300","id":"5497","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"115","target":"691","id":"4063","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"519","target":"655","id":"9846","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"20","target":"213","id":"1917","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"149","target":"673","id":"4774","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"237","target":"711","id":"6367","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"314","target":"417","id":"7586","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"368","target":"489","id":"8267","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"55","target":"299","id":"2730","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"21","target":"532","id":"1947","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"367","target":"427","id":"8254","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"149","target":"613","id":"4772","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"431","target":"443","id":"9041","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"246","target":"516","id":"6504","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"179","target":"685","id":"5367","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"172","target":"612","id":"5222","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"70","target":"225","id":"3089","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"409","target":"521","id":"8797","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"350","target":"507","id":"8080","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"151","target":"289","id":"4812","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"399","target":"560","id":"8689","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"196","target":"565","id":"5671","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"290","target":"689","id":"7256","attributes":{"Weight":"1.0"},"color":"rgb(148,83,196)","size":1.0},{"source":"396","target":"496","id":"8644","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"374","target":"573","id":"8341","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"94","target":"133","id":"3618","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"46","target":"125","id":"2521","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"5","target":"139","id":"1557","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"245","target":"294","id":"6477","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"481","target":"534","id":"9562","attributes":{"Weight":"1.0"},"color":"rgb(197,148,148)","size":1.0},{"source":"473","target":"562","id":"9495","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"28","target":"662","id":"2120","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"162","target":"301","id":"5021","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"440","target":"521","id":"9153","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"197","target":"254","id":"5680","attributes":{"Weight":"1.0"},"color":"rgb(164,67,164)","size":1.0},{"source":"469","target":"535","id":"9447","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"621","target":"639","id":"10417","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"496","target":"630","id":"9673","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"143","target":"469","id":"4639","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"551","target":"718","id":"10068","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"297","target":"322","id":"7339","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"378","target":"506","id":"8399","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"136","target":"617","id":"4496","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"108","target":"525","id":"3900","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"141","target":"447","id":"4594","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"489","target":"720","id":"9611","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"370","target":"672","id":"8289","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"16","target":"22","id":"1822","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"59","target":"711","id":"2832","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"60","target":"460","id":"2852","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"281","target":"725","id":"7091","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"282","target":"730","id":"7113","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"689","target":"729","id":"10641","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"206","target":"588","id":"5849","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"44","target":"442","id":"2473","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"56","target":"74","id":"2746","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"129","target":"463","id":"4341","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"228","target":"548","id":"6227","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"223","target":"484","id":"6140","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"535","target":"624","id":"9976","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"210","target":"626","id":"5908","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"165","target":"634","id":"5092","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"382","target":"534","id":"8459","attributes":{"Weight":"1.0"},"color":"rgb(132,83,229)","size":1.0},{"source":"642","target":"726","id":"10513","attributes":{"Weight":"1.0"},"color":"rgb(115,148,229)","size":1.0},{"source":"69","target":"441","id":"3068","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"324","target":"710","id":"7729","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"157","target":"432","id":"4929","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"142","target":"301","id":"4612","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"55","target":"455","id":"2736","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"51","target":"640","id":"2639","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"604","target":"663","id":"10346","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"602","target":"692","id":"10337","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"148","target":"459","id":"4746","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"76","target":"629","id":"3237","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"269","target":"377","id":"6886","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"40","target":"495","id":"2388","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"611","target":"678","id":"10379","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"154","target":"569","id":"4875","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"486","target":"618","id":"9587","attributes":{"Weight":"1.0"},"color":"rgb(229,180,67)","size":1.0},{"source":"491","target":"650","id":"9626","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"216","target":"571","id":"6017","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"510","target":"581","id":"9784","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"194","target":"691","id":"5632","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"121","target":"352","id":"4181","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"60","target":"305","id":"2844","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"39","target":"607","id":"2372","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"37","target":"83","id":"2306","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"202","target":"618","id":"5783","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"53","target":"302","id":"2677","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"79","target":"577","id":"3296","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"154","target":"294","id":"4865","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"55","target":"539","id":"2740","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"54","target":"432","id":"2707","attributes":{"Weight":"1.0"},"color":"rgb(99,148,229)","size":1.0},{"source":"411","target":"560","id":"8824","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"406","target":"683","id":"8768","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"399","target":"413","id":"8685","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"171","target":"566","id":"5202","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"176","target":"329","id":"5285","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"337","target":"662","id":"7922","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"145","target":"151","id":"4674","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"32","target":"556","id":"2199","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"7","target":"693","id":"1623","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"536","target":"551","id":"9981","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"38","target":"185","id":"2336","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"220","target":"503","id":"6085","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"621","target":"715","id":"10421","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"281","target":"735","id":"7095","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"191","target":"352","id":"5572","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"70","target":"451","id":"3097","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"391","target":"560","id":"8589","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"264","target":"285","id":"6799","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"616","target":"713","id":"10402","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"248","target":"336","id":"6528","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"22","target":"292","id":"1966","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"283","target":"411","id":"7127","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"190","target":"702","id":"5567","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"472","target":"473","id":"9476","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"127","target":"485","id":"4294","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"189","target":"262","id":"5534","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"232","target":"668","id":"6293","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"112","target":"320","id":"3996","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"36","target":"78","id":"2288","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"93","target":"703","id":"3616","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"126","target":"406","id":"4277","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"86","target":"277","id":"3437","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"278","target":"627","id":"7031","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"164","target":"719","id":"5074","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"135","target":"436","id":"4467","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"54","target":"450","id":"2709","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"48","target":"732","id":"2578","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"280","target":"436","id":"7061","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"339","target":"692","id":"7949","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"538","target":"635","id":"9995","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"145","target":"676","id":"4698","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"650","target":"729","id":"10549","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"633","target":"637","id":"10467","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"347","target":"590","id":"8042","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"133","target":"338","id":"4419","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"258","target":"702","id":"6711","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"124","target":"189","id":"4229","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"436","target":"567","id":"9111","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"15","target":"418","id":"1808","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"330","target":"411","id":"7820","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"251","target":"557","id":"6592","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"63","target":"553","id":"2936","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"306","target":"495","id":"7478","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"54","target":"221","id":"2697","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"95","target":"119","id":"3640","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"50","target":"489","id":"2621","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"391","target":"731","id":"8592","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"125","target":"622","id":"4265","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"389","target":"584","id":"8558","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"339","target":"661","id":"7946","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"121","target":"531","id":"4187","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"9","target":"324","id":"1671","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"173","target":"722","id":"5249","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"388","target":"501","id":"8547","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"302","target":"312","id":"7417","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"377","target":"393","id":"8380","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"163","target":"563","id":"5051","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"654","target":"668","id":"10566","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"527","target":"654","id":"9915","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"449","target":"675","id":"9254","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"212","target":"419","id":"5938","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"59","target":"249","id":"2819","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"298","target":"468","id":"7358","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"617","target":"680","id":"10403","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"429","target":"489","id":"9018","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"336","target":"617","id":"7908","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"224","target":"233","id":"6142","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"93","target":"619","id":"3614","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"431","target":"676","id":"9048","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"227","target":"342","id":"6200","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"279","target":"529","id":"7045","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"364","target":"453","id":"8217","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"265","target":"683","id":"6829","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"267","target":"510","id":"6856","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"529","target":"547","id":"9935","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"88","target":"366","id":"3495","attributes":{"Weight":"1.0"},"color":"rgb(115,148,148)","size":1.0},{"source":"525","target":"526","id":"9894","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"126","target":"326","id":"4273","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"286","target":"571","id":"7171","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"213","target":"683","id":"5970","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"303","target":"603","id":"7444","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"179","target":"612","id":"5360","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"37","target":"84","id":"2307","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"68","target":"637","id":"3050","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"25","target":"733","id":"2034","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"422","target":"481","id":"8935","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"123","target":"416","id":"4217","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"96","target":"153","id":"3669","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"14","target":"342","id":"1783","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"263","target":"542","id":"6791","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"354","target":"361","id":"8124","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"131","target":"644","id":"4392","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"125","target":"482","id":"4262","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"638","target":"723","id":"10493","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"97","target":"605","id":"3701","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"316","target":"349","id":"7607","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"356","target":"557","id":"8145","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"54","target":"212","id":"2695","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"442","target":"648","id":"9192","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"90","target":"156","id":"3537","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"46","target":"237","id":"2523","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"365","target":"681","id":"8239","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"661","target":"723","id":"10592","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"27","target":"616","id":"2081","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"62","target":"213","id":"2906","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"8","target":"408","id":"1641","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"207","target":"239","id":"5857","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"54","target":"555","id":"2713","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"58","target":"141","id":"2795","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"29","target":"458","id":"2131","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"183","target":"697","id":"5436","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"427","target":"551","id":"8998","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"92","target":"492","id":"3587","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"466","target":"730","id":"9427","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"329","target":"343","id":"7794","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"139","target":"576","id":"4548","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"105","target":"370","id":"3851","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"173","target":"205","id":"5233","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"643","target":"720","id":"10516","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"381","target":"728","id":"8450","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"253","target":"674","id":"6629","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"314","target":"345","id":"7583","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"327","target":"374","id":"7758","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"104","target":"318","id":"3831","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"42","target":"619","id":"2433","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"379","target":"403","id":"8409","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"78","target":"247","id":"3263","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"142","target":"175","id":"4607","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"76","target":"472","id":"3224","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"358","target":"450","id":"8161","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"341","target":"502","id":"7969","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"33","target":"445","id":"2234","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"387","target":"437","id":"8536","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"216","target":"623","id":"6024","attributes":{"Weight":"1.0"},"color":"rgb(148,196,115)","size":1.0},{"source":"226","target":"634","id":"6192","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"96","target":"672","id":"3682","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"90","target":"681","id":"3552","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"77","target":"541","id":"3257","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"154","target":"726","id":"4885","attributes":{"Weight":"1.0"},"color":"rgb(196,67,213)","size":1.0},{"source":"127","target":"322","id":"4291","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"90","target":"134","id":"3536","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"314","target":"534","id":"7589","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"228","target":"353","id":"6222","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"453","target":"602","id":"9285","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"397","target":"629","id":"8658","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"186","target":"353","id":"5486","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"144","target":"434","id":"4661","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"229","target":"581","id":"6245","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"614","target":"678","id":"10396","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"305","target":"499","id":"7469","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"124","target":"362","id":"4242","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"651","target":"724","id":"10554","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"172","target":"384","id":"5214","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"431","target":"699","id":"9049","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"96","target":"369","id":"3677","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"111","target":"529","id":"3977","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"166","target":"531","id":"5109","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"208","target":"680","id":"5883","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"443","target":"717","id":"9207","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"359","target":"373","id":"8170","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"160","target":"257","id":"4982","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"53","target":"637","id":"2686","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"369","target":"554","id":"8280","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"81","target":"310","id":"3329","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"387","target":"404","id":"8535","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"73","target":"635","id":"3162","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"43","target":"138","id":"2439","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"47","target":"400","id":"2550","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"191","target":"486","id":"5577","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"57","target":"615","id":"2789","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"104","target":"267","id":"3826","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"153","target":"309","id":"4850","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"95","target":"206","id":"3645","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"227","target":"591","id":"6209","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"68","target":"636","id":"3049","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"6","target":"307","id":"1586","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"139","target":"258","id":"4537","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"43","target":"404","id":"2447","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"489","target":"569","id":"9607","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"48","target":"640","id":"2573","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"291","target":"449","id":"7262","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"96","target":"630","id":"3681","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"428","target":"532","id":"9005","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"135","target":"419","id":"4464","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"87","target":"449","id":"3464","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"55","target":"469","id":"2737","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"25","target":"120","id":"2019","attributes":{"Weight":"1.0"},"color":"rgb(229,67,99)","size":1.0},{"source":"341","target":"681","id":"7973","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"275","target":"352","id":"6978","attributes":{"Weight":"1.0"},"color":"rgb(148,213,67)","size":1.0},{"source":"10","target":"99","id":"1684","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"371","target":"528","id":"8294","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"239","target":"344","id":"6389","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"85","target":"135","id":"3407","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"338","target":"673","id":"7935","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"192","target":"284","id":"5584","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"525","target":"655","id":"9901","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"8","target":"685","id":"1657","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"116","target":"616","id":"4089","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"39","target":"461","id":"2368","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"166","target":"685","id":"5113","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"288","target":"508","id":"7204","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"133","target":"171","id":"4415","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"295","target":"564","id":"7320","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"9","target":"228","id":"1667","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"430","target":"668","id":"9037","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"250","target":"482","id":"6569","attributes":{"Weight":"1.0"},"color":"rgb(213,148,83)","size":1.0},{"source":"77","target":"680","id":"3259","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"76","target":"562","id":"3231","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"252","target":"452","id":"6605","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"289","target":"431","id":"7223","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"356","target":"556","id":"8144","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"18","target":"138","id":"1868","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"178","target":"372","id":"5333","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"272","target":"404","id":"6938","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"391","target":"561","id":"8590","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"473","target":"521","id":"9491","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"301","target":"514","id":"7407","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"28","target":"489","id":"2112","attributes":{"Weight":"1.0"},"color":"rgb(148,99,180)","size":1.0},{"source":"52","target":"56","id":"2646","attributes":{"Weight":"1.0"},"color":"rgb(83,148,180)","size":1.0},{"source":"243","target":"695","id":"6454","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"599","target":"666","id":"10321","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"410","target":"696","id":"8819","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"135","target":"368","id":"4462","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"45","target":"565","id":"2513","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"206","target":"712","id":"5851","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"15","target":"494","id":"1811","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"179","target":"386","id":"5352","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"74","target":"704","id":"3191","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"54","target":"419","id":"2705","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"428","target":"601","id":"9010","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"121","target":"607","id":"4188","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"241","target":"364","id":"6416","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"5","target":"668","id":"1578","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"231","target":"258","id":"6260","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"286","target":"528","id":"7170","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"292","target":"704","id":"7279","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"169","target":"546","id":"5164","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"49","target":"581","id":"2599","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"176","target":"609","id":"5297","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"271","target":"690","id":"6929","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"211","target":"358","id":"5918","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"314","target":"325","id":"7581","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"317","target":"564","id":"7634","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"103","target":"229","id":"3806","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"423","target":"557","id":"8944","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"418","target":"519","id":"8882","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"35","target":"598","id":"2282","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"271","target":"610","id":"6925","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"221","target":"287","id":"6096","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"440","target":"508","id":"9152","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"74","target":"679","id":"3189","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"158","target":"174","id":"4945","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"45","target":"675","id":"2516","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"45","target":"622","id":"2514","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"76","target":"523","id":"3229","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"375","target":"406","id":"8350","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"68","target":"574","id":"3046","attributes":{"Weight":"1.0"},"color":"rgb(99,229,83)","size":1.0},{"source":"519","target":"585","id":"9843","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"562","target":"594","id":"10119","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"79","target":"316","id":"3282","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"76","target":"409","id":"3219","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"364","target":"692","id":"8227","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"444","target":"669","id":"9217","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"36","target":"380","id":"2296","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"64","target":"101","id":"2946","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"201","target":"324","id":"5754","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"121","target":"276","id":"4180","attributes":{"Weight":"1.0"},"color":"rgb(148,213,67)","size":1.0},{"source":"527","target":"707","id":"9920","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"182","target":"705","id":"5413","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"283","target":"394","id":"7123","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"28","target":"488","id":"2111","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"447","target":"675","id":"9237","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"24","target":"695","id":"2012","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"281","target":"491","id":"7083","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"511","target":"528","id":"9786","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"550","target":"617","id":"10062","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"562","target":"728","id":"10125","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"73","target":"637","id":"3164","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"274","target":"605","id":"6969","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"508","target":"565","id":"9771","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"79","target":"145","id":"3280","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"223","target":"362","id":"6137","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"311","target":"685","id":"7554","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"50","target":"227","id":"2609","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"556","target":"674","id":"10092","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"23","target":"48","id":"1980","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"446","target":"564","id":"9228","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"189","target":"354","id":"5538","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"391","target":"393","id":"8579","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"493","target":"655","id":"9652","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"174","target":"708","id":"5260","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"246","target":"726","id":"6514","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"337","target":"387","id":"7912","attributes":{"Weight":"1.0"},"color":"rgb(67,180,213)","size":1.0},{"source":"297","target":"553","id":"7343","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"571","target":"589","id":"10168","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"63","target":"638","id":"2939","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"304","target":"457","id":"7455","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"177","target":"677","id":"5323","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"286","target":"511","id":"7169","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"94","target":"338","id":"3624","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"357","target":"592","id":"8158","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"256","target":"581","id":"6676","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"633","target":"697","id":"10470","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"92","target":"328","id":"3578","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"4","target":"340","id":"1541","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"22","target":"708","id":"1975","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"612","target":"625","id":"10382","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"208","target":"307","id":"5869","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"42","target":"601","id":"2431","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"26","target":"45","id":"2035","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"453","target":"721","id":"9292","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"439","target":"733","id":"9149","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"432","target":"539","id":"9058","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"58","target":"277","id":"2799","attributes":{"Weight":"1.0"},"color":"rgb(213,196,67)","size":1.0},{"source":"175","target":"301","id":"5267","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"493","target":"582","id":"9647","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"336","target":"378","id":"7899","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"99","target":"234","id":"3732","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"46","target":"416","id":"2528","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"33","target":"112","id":"2211","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"633","target":"736","id":"10471","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"120","target":"305","id":"4157","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"47","target":"558","id":"2558","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"355","target":"546","id":"8134","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"146","target":"579","id":"4716","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"21","target":"568","id":"1949","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"304","target":"667","id":"7460","attributes":{"Weight":"1.0"},"color":"rgb(67,148,180)","size":1.0},{"source":"637","target":"688","id":"10485","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"395","target":"560","id":"8639","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"115","target":"505","id":"4057","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"8","target":"150","id":"1632","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"13","target":"284","id":"1761","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"193","target":"382","id":"5600","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"196","target":"526","id":"5668","attributes":{"Weight":"1.0"},"color":"rgb(148,115,229)","size":1.0},{"source":"503","target":"590","id":"9728","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"202","target":"319","id":"5771","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"23","target":"243","id":"1984","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"56","target":"311","id":"2751","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"33","target":"135","id":"2214","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"25","target":"708","id":"2032","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"178","target":"456","id":"5336","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"34","target":"355","id":"2255","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"567","target":"699","id":"10146","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"165","target":"285","id":"5083","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"45","target":"141","id":"2497","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"516","target":"688","id":"9820","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"532","target":"679","id":"9956","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"101","target":"354","id":"3775","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"357","target":"546","id":"8155","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"336","target":"588","id":"7907","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"323","target":"331","id":"7707","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"192","target":"584","id":"5592","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"319","target":"451","id":"7661","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"270","target":"497","id":"6906","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"59","target":"482","id":"2829","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"126","target":"156","id":"4269","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"143","target":"175","id":"4628","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"370","target":"457","id":"8286","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"219","target":"370","id":"6072","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"200","target":"587","id":"5742","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"343","target":"448","id":"7996","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"341","target":"683","id":"7974","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"172","target":"667","id":"5226","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"25","target":"568","id":"2027","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"435","target":"525","id":"9098","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"632","target":"715","id":"10463","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"155","target":"720","id":"4906","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"213","target":"341","id":"5959","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"260","target":"661","id":"6745","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"619","target":"716","id":"10412","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"151","target":"699","id":"4827","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"57","target":"473","id":"2779","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"231","target":"713","id":"6277","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"689","target":"735","id":"10644","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"352","target":"369","id":"8104","attributes":{"Weight":"1.0"},"color":"rgb(148,132,148)","size":1.0},{"source":"376","target":"431","id":"8365","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"102","target":"499","id":"3798","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"111","target":"373","id":"3972","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"80","target":"583","id":"3320","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"441","target":"730","id":"9178","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"37","target":"146","id":"2310","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"125","target":"449","id":"4257","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"206","target":"506","id":"5846","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"280","target":"631","id":"7071","attributes":{"Weight":"1.0"},"color":"rgb(148,115,213)","size":1.0},{"source":"682","target":"714","id":"10631","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"63","target":"114","id":"2923","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"49","target":"229","id":"2584","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"33","target":"354","id":"2228","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"42","target":"86","id":"2412","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"113","target":"217","id":"4008","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"474","target":"621","id":"9504","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"240","target":"491","id":"6405","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"291","target":"447","id":"7261","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"170","target":"402","id":"5178","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"258","target":"415","id":"6700","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"31","target":"672","id":"2183","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"71","target":"84","id":"3106","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"125","target":"252","id":"4251","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"293","target":"540","id":"7284","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"540","target":"640","id":"10008","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"121","target":"711","id":"4190","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"243","target":"540","id":"6450","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"228","target":"429","id":"6224","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"140","target":"145","id":"4556","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"294","target":"443","id":"7300","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"66","target":"284","id":"2999","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"150","target":"719","id":"4802","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"406","target":"681","id":"8767","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"317","target":"510","id":"7632","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"281","target":"724","id":"7090","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"421","target":"682","id":"8929","attributes":{"Weight":"1.0"},"color":"rgb(213,67,229)","size":1.0},{"source":"158","target":"292","id":"4947","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"259","target":"649","id":"6725","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"653","target":"669","id":"10563","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"535","target":"539","id":"9974","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"432","target":"644","id":"9064","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"692","target":"721","id":"10652","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"522","target":"625","id":"9868","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"375","target":"544","id":"8358","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"306","target":"584","id":"7480","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"528","target":"601","id":"9926","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"627","target":"662","id":"10443","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"173","target":"435","id":"5238","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"139","target":"440","id":"4546","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"559","target":"561","id":"10107","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"330","target":"394","id":"7816","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"207","target":"223","id":"5855","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"511","target":"571","id":"9788","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"558","target":"694","id":"10104","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"216","target":"432","id":"6013","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"15","target":"435","id":"1809","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"50","target":"294","id":"2611","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"224","target":"555","id":"6158","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"78","target":"192","id":"3262","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"5","target":"144","id":"1558","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"126","target":"681","id":"4283","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"270","target":"697","id":"6916","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"87","target":"565","id":"3473","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"256","target":"295","id":"6666","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"166","target":"352","id":"5101","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"201","target":"368","id":"5757","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"594","target":"604","id":"10302","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"148","target":"470","id":"4748","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"145","target":"323","id":"4681","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"256","target":"318","id":"6668","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"410","target":"694","id":"8818","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"216","target":"294","id":"6008","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"163","target":"360","id":"5044","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"332","target":"511","id":"7844","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"625","target":"685","id":"10438","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"311","target":"522","id":"7543","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"132","target":"230","id":"4402","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"151","target":"529","id":"4821","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"173","target":"519","id":"5241","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"554","target":"672","id":"10080","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"5","target":"713","id":"1579","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"16","target":"568","id":"1835","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"265","target":"530","id":"6826","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"613","target":"682","id":"10392","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"28","target":"569","id":"2115","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"2","target":"366","id":"1501","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"62","target":"502","id":"2915","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"19","target":"55","id":"1889","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"189","target":"239","id":"5533","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"164","target":"245","id":"5058","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"316","target":"577","id":"7617","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"225","target":"319","id":"6169","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"112","target":"354","id":"3998","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"614","target":"623","id":"10394","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"448","target":"727","id":"9247","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"126","target":"544","id":"4282","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"59","target":"481","id":"2828","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"162","target":"299","id":"5020","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"90","target":"406","id":"3545","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"398","target":"715","id":"8680","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"621","target":"706","id":"10420","attributes":{"Weight":"1.0"},"color":"rgb(115,148,164)","size":1.0},{"source":"337","target":"705","id":"7923","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"188","target":"703","id":"5526","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"277","target":"652","id":"7020","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"19","target":"141","id":"1894","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"338","target":"606","id":"7932","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"132","target":"362","id":"4409","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"587","target":"702","id":"10274","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"110","target":"547","id":"3947","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"97","target":"525","id":"3697","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"554","target":"630","id":"10079","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"432","target":"669","id":"9066","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"393","target":"559","id":"8615","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"82","target":"396","id":"3352","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"46","target":"59","id":"2518","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"43","target":"346","id":"2444","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"529","target":"643","id":"9939","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"385","target":"517","id":"8506","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"21","target":"292","id":"1943","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"568","target":"708","id":"10152","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"442","target":"721","id":"9195","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"1","target":"526","id":"1479","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"19","target":"478","id":"1905","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"345","target":"715","id":"8025","attributes":{"Weight":"1.0"},"color":"rgb(180,67,229)","size":1.0},{"source":"287","target":"608","id":"7191","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"293","target":"732","id":"7291","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"21","target":"640","id":"1950","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"492","target":"615","id":"9640","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"398","target":"621","id":"8671","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"27","target":"498","id":"2074","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"455","target":"669","id":"9316","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"342","target":"383","id":"7977","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"600","target":"642","id":"10324","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"504","target":"665","id":"9738","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"332","target":"601","id":"7849","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"58","target":"622","id":"2812","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"141","target":"675","id":"4602","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"134","target":"326","id":"4438","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"32","target":"558","id":"2201","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"290","target":"561","id":"7254","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"94","target":"566","id":"3632","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"93","target":"428","id":"3605","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"465","target":"735","id":"9417","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"528","target":"576","id":"9923","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"89","target":"485","id":"3523","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"10","target":"672","id":"1702","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"148","target":"208","id":"4740","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"237","target":"675","id":"6366","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"406","target":"530","id":"8765","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"71","target":"420","id":"3120","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"222","target":"235","id":"6116","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"282","target":"491","id":"7103","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"19","target":"26","id":"1886","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"140","target":"721","id":"4585","attributes":{"Weight":"1.0"},"color":"rgb(115,229,99)","size":1.0},{"source":"147","target":"698","id":"4739","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"61","target":"375","id":"2880","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"170","target":"401","id":"5177","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"74","target":"667","id":"3187","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"58","target":"237","id":"2796","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"143","target":"309","id":"4634","attributes":{"Weight":"1.0"},"color":"rgb(99,67,229)","size":1.0},{"source":"391","target":"411","id":"8584","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"14","target":"706","id":"1799","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"274","target":"418","id":"6960","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"173","target":"274","id":"5235","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"130","target":"503","id":"4363","attributes":{"Weight":"1.0"},"color":"rgb(67,148,213)","size":1.0},{"source":"26","target":"558","id":"2054","attributes":{"Weight":"1.0"},"color":"rgb(213,148,83)","size":1.0},{"source":"310","target":"459","id":"7527","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"614","target":"648","id":"10395","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"59","target":"452","id":"2826","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"142","target":"299","id":"4610","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"308","target":"713","id":"7513","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"13","target":"273","id":"1760","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"162","target":"504","id":"5027","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"308","target":"616","id":"7509","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"71","target":"533","id":"3122","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"8","target":"116","id":"1629","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"314","target":"566","id":"7590","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"170","target":"254","id":"5173","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"212","target":"221","id":"5932","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"665","target":"692","id":"10598","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"76","target":"303","id":"3217","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"37","target":"71","id":"2305","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"580","target":"618","id":"10243","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"118","target":"709","id":"4129","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"292","target":"732","id":"7281","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"251","target":"660","id":"6595","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"390","target":"561","id":"8575","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"611","target":"623","id":"10376","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"79","target":"611","id":"3297","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"156","target":"530","id":"4918","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"167","target":"430","id":"5122","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"4","target":"503","id":"1547","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"390","target":"394","id":"8565","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"308","target":"603","id":"7508","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"46","target":"482","id":"2536","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"529","target":"586","id":"9938","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"255","target":"558","id":"6657","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"66","target":"273","id":"2998","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"6","target":"458","id":"1589","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"83","target":"210","id":"3374","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"650","target":"735","id":"10552","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"109","target":"136","id":"3910","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"542","target":"624","id":"10018","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"445","target":"484","id":"9220","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"12","target":"645","id":"1750","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"492","target":"551","id":"9638","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"216","target":"619","id":"6023","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"646","target":"724","id":"10524","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"178","target":"700","id":"5344","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"596","target":"721","id":"10313","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"75","target":"342","id":"3199","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"160","target":"657","id":"4995","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"303","target":"335","id":"7432","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"302","target":"635","id":"7423","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"249","target":"483","id":"6554","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"57","target":"594","id":"2787","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"122","target":"577","id":"4204","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"151","target":"443","id":"4819","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"646","target":"735","id":"10529","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"382","target":"725","id":"8467","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"241","target":"693","id":"6429","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"432","target":"542","id":"9059","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"75","target":"379","id":"3201","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"321","target":"420","id":"7687","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"133","target":"417","id":"4423","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"218","target":"693","id":"6065","attributes":{"Weight":"1.0"},"color":"rgb(115,196,148)","size":1.0},{"source":"1","target":"97","id":"1465","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"546","target":"581","id":"10044","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"201","target":"552","id":"5762","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"97","target":"195","id":"3686","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"56","target":"677","id":"2763","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"138","target":"193","id":"4515","attributes":{"Weight":"1.0"},"color":"rgb(67,164,213)","size":1.0},{"source":"295","target":"510","id":"7318","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"428","target":"540","id":"9006","attributes":{"Weight":"1.0"},"color":"rgb(229,115,67)","size":1.0},{"source":"316","target":"397","id":"7611","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"485","target":"639","id":"9579","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"569","target":"719","id":"10161","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"330","target":"561","id":"7826","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"490","target":"676","id":"9618","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"584","target":"599","id":"10261","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"277","target":"571","id":"7013","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"443","target":"490","id":"9196","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"128","target":"513","id":"4318","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"137","target":"380","id":"4506","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"166","target":"167","id":"5095","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"172","target":"522","id":"5218","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"177","target":"311","id":"5307","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"404","target":"661","id":"8749","attributes":{"Weight":"1.0"},"color":"rgb(115,229,132)","size":1.0},{"source":"328","target":"700","id":"7792","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"14","target":"243","id":"1780","attributes":{"Weight":"1.0"},"color":"rgb(148,148,83)","size":1.0},{"source":"693","target":"723","id":"10655","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"404","target":"664","id":"8750","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"399","target":"411","id":"8683","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"169","target":"667","id":"5169","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"306","target":"666","id":"7483","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"240","target":"521","id":"6406","attributes":{"Weight":"1.0"},"color":"rgb(229,132,148)","size":1.0},{"source":"446","target":"510","id":"9226","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"470","target":"477","id":"9459","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"92","target":"426","id":"3583","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"231","target":"586","id":"6272","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"432","target":"589","id":"9061","attributes":{"Weight":"1.0"},"color":"rgb(180,67,229)","size":1.0},{"source":"116","target":"150","id":"4068","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"41","target":"66","id":"2394","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"656","target":"696","id":"10576","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"318","target":"510","id":"7643","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"642","target":"645","id":"10511","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"142","target":"432","id":"4613","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"374","target":"633","id":"8346","attributes":{"Weight":"1.0"},"color":"rgb(99,229,115)","size":1.0},{"source":"50","target":"135","id":"2604","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"102","target":"489","id":"3797","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"243","target":"704","id":"6455","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"623","target":"648","id":"10427","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"440","target":"594","id":"9160","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"102","target":"710","id":"3803","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"629","target":"643","id":"10449","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"180","target":"580","id":"5380","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"64","target":"125","id":"2949","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"200","target":"537","id":"5739","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"328","target":"367","id":"7780","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"175","target":"698","id":"5281","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"131","target":"333","id":"4377","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"172","target":"621","id":"5223","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"306","target":"599","id":"7482","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"264","target":"282","id":"6798","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"255","target":"410","id":"6652","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"571","target":"601","id":"10170","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"432","target":"444","id":"9053","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"366","target":"630","id":"8248","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"558","target":"674","id":"10103","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"428","target":"703","id":"9014","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"460","target":"612","id":"9364","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"72","target":"259","id":"3134","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"154","target":"707","id":"4882","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"224","target":"279","id":"6143","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"35","target":"36","id":"2264","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"169","target":"357","id":"5158","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"144","target":"562","id":"4664","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"35","target":"192","id":"2270","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"213","target":"681","id":"5969","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"199","target":"272","id":"5716","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"729","target":"734","id":"10686","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"409","target":"562","id":"8800","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"455","target":"577","id":"9313","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"376","target":"502","id":"8369","attributes":{"Weight":"1.0"},"color":"rgb(164,148,132)","size":1.0},{"source":"194","target":"259","id":"5619","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"540","target":"568","id":"10007","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"185","target":"531","id":"5470","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"311","target":"667","id":"7551","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"340","target":"437","id":"7957","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"284","target":"467","id":"7141","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"234","target":"672","id":"6326","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"120","target":"368","id":"4161","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"289","target":"436","id":"7224","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"232","target":"415","id":"6286","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"154","target":"155","id":"4859","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"13","target":"389","id":"1765","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"494","target":"526","id":"9656","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"141","target":"452","id":"4596","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"108","target":"195","id":"3890","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"443","target":"529","id":"9197","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"45","target":"661","id":"2515","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"195","target":"435","id":"5640","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"240","target":"461","id":"6402","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"45","target":"422","id":"2504","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"173","target":"494","id":"5240","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"457","target":"701","id":"9333","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"247","target":"598","id":"6525","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"547","target":"717","id":"10051","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"371","target":"569","id":"8296","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"328","target":"329","id":"7778","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"80","target":"603","id":"3321","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"172","target":"532","id":"5220","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"200","target":"649","id":"5745","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"555","target":"645","id":"10085","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"26","target":"675","id":"2056","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"53","target":"524","id":"2681","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"71","target":"705","id":"3127","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"3","target":"486","id":"1527","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"434","target":"713","id":"9094","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"639","target":"657","id":"10495","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"203","target":"454","id":"5791","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"95","target":"248","id":"3647","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"3","target":"39","id":"1511","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"49","target":"510","id":"2596","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"92","target":"615","id":"3592","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"419","target":"451","id":"8894","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"128","target":"388","id":"4314","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"187","target":"539","id":"5505","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"8","target":"667","id":"1654","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"92","target":"197","id":"3577","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"87","target":"473","id":"3466","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"189","target":"483","id":"5542","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"152","target":"617","id":"4843","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"154","target":"316","id":"4867","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"252","target":"481","id":"6608","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"507","target":"613","id":"9761","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"45","target":"46","id":"2491","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"120","target":"222","id":"4152","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"150","target":"644","id":"4799","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"312","target":"635","id":"7561","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"15","target":"631","id":"1818","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"275","target":"355","id":"6979","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"427","target":"718","id":"9002","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"38","target":"634","id":"2352","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"139","target":"575","id":"4547","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"375","target":"442","id":"8351","attributes":{"Weight":"1.0"},"color":"rgb(83,229,115)","size":1.0},{"source":"570","target":"599","id":"10165","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"327","target":"480","id":"7766","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"388","target":"563","id":"8550","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"240","target":"607","id":"6409","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"373","target":"397","id":"8320","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"351","target":"426","id":"8091","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"171","target":"200","id":"5190","attributes":{"Weight":"1.0"},"color":"rgb(132,148,164)","size":1.0},{"source":"348","target":"575","id":"8052","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"50","target":"591","id":"2625","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"276","target":"295","id":"6992","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"214","target":"230","id":"5972","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"630","target":"701","id":"10455","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"204","target":"524","id":"5811","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"246","target":"257","id":"6497","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"505","target":"649","id":"9748","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"17","target":"267","id":"1850","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"2","target":"639","id":"1507","attributes":{"Weight":"1.0"},"color":"rgb(115,67,229)","size":1.0},{"source":"555","target":"600","id":"10082","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"116","target":"231","id":"4069","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"498","target":"678","id":"9698","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"108","target":"418","id":"3895","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"221","target":"487","id":"6106","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"218","target":"366","id":"6049","attributes":{"Weight":"1.0"},"color":"rgb(67,115,229)","size":1.0},{"source":"398","target":"657","id":"8676","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"523","target":"594","id":"9879","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"275","target":"564","id":"6987","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"318","target":"646","id":"7652","attributes":{"Weight":"1.0"},"color":"rgb(67,164,148)","size":1.0},{"source":"462","target":"600","id":"9385","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"18","target":"387","id":"1876","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"38","target":"226","id":"2338","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"180","target":"593","id":"5381","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"555","target":"608","id":"10083","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"127","target":"657","id":"4300","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"196","target":"562","id":"5670","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"505","target":"537","id":"9744","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"415","target":"576","id":"8848","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"486","target":"607","id":"9586","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"91","target":"613","id":"3571","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"42","target":"703","id":"2435","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"264","target":"438","id":"6801","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"87","target":"212","id":"3457","attributes":{"Weight":"1.0"},"color":"rgb(148,148,229)","size":1.0},{"source":"279","target":"323","id":"7036","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"268","target":"283","id":"6862","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"218","target":"274","id":"6046","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"117","target":"126","id":"4093","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"231","target":"576","id":"6270","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"409","target":"565","id":"8801","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"101","target":"262","id":"3772","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"278","target":"488","id":"7027","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"725","target":"730","id":"10682","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"233","target":"567","id":"6307","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"269","target":"399","id":"6893","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"436","target":"547","id":"9110","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"157","target":"603","id":"4940","attributes":{"Weight":"1.0"},"color":"rgb(99,148,180)","size":1.0},{"source":"518","target":"686","id":"9839","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"158","target":"704","id":"4955","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"160","target":"614","id":"4990","attributes":{"Weight":"1.0"},"color":"rgb(115,148,196)","size":1.0},{"source":"52","target":"178","id":"2650","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"436","target":"529","id":"9109","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"429","target":"548","id":"9021","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"433","target":"623","id":"9080","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"51","target":"540","id":"2637","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"21","target":"243","id":"1941","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"43","target":"340","id":"2443","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"543","target":"562","id":"10022","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"69","target":"387","id":"3065","attributes":{"Weight":"1.0"},"color":"rgb(67,164,213)","size":1.0},{"source":"4","target":"404","id":"1545","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"198","target":"688","id":"5712","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"430","target":"711","id":"9039","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"72","target":"574","id":"3143","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"280","target":"608","id":"7070","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"251","target":"253","id":"6580","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"37","target":"579","id":"2322","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"272","target":"503","id":"6940","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"258","target":"583","id":"6706","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"277","target":"618","id":"7017","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"98","target":"492","id":"3717","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"124","target":"223","id":"4233","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"258","target":"440","id":"6703","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"266","target":"690","id":"6841","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"108","target":"519","id":"3899","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"202","target":"261","id":"5769","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"85","target":"431","id":"3420","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"347","target":"709","id":"8046","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"497","target":"516","id":"9678","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"423","target":"656","id":"8946","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"183","target":"302","id":"5419","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"86","target":"580","id":"3446","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"426","target":"456","id":"8983","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"221","target":"591","id":"6109","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"679","target":"685","id":"10627","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"363","target":"537","id":"8208","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"295","target":"509","id":"7317","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"596","target":"692","id":"10311","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"71","target":"662","id":"3126","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"368","target":"710","id":"8275","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"527","target":"685","id":"9919","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"228","target":"710","id":"6230","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"115","target":"702","id":"4064","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"99","target":"309","id":"3735","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"459","target":"680","id":"9355","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"175","target":"653","id":"5279","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"366","target":"457","id":"8244","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"359","target":"397","id":"8171","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"102","target":"697","id":"3802","attributes":{"Weight":"1.0"},"color":"rgb(180,148,99)","size":1.0},{"source":"234","target":"287","id":"6313","attributes":{"Weight":"1.0"},"color":"rgb(67,148,229)","size":1.0},{"source":"130","target":"370","id":"4358","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"480","target":"497","id":"9549","attributes":{"Weight":"1.0"},"color":"rgb(99,229,115)","size":1.0},{"source":"288","target":"473","id":"7203","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"352","target":"526","id":"8109","attributes":{"Weight":"1.0"},"color":"rgb(148,180,148)","size":1.0},{"source":"145","target":"375","id":"4684","attributes":{"Weight":"1.0"},"color":"rgb(164,148,132)","size":1.0},{"source":"424","target":"636","id":"8960","attributes":{"Weight":"1.0"},"color":"rgb(99,229,148)","size":1.0},{"source":"133","target":"606","id":"4428","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"49","target":"295","id":"2589","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"318","target":"606","id":"7651","attributes":{"Weight":"1.0"},"color":"rgb(132,148,148)","size":1.0},{"source":"160","target":"632","id":"4992","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"175","target":"455","id":"5271","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"265","target":"502","id":"6824","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"64","target":"512","id":"2972","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"101","target":"209","id":"3767","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"275","target":"318","id":"6977","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"340","target":"404","id":"7956","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"160","target":"726","id":"4998","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"578","target":"601","id":"10225","attributes":{"Weight":"1.0"},"color":"rgb(196,196,67)","size":1.0},{"source":"23","target":"293","id":"1986","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"71","target":"488","id":"3121","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"287","target":"469","id":"7187","attributes":{"Weight":"1.0"},"color":"rgb(99,148,229)","size":1.0},{"source":"601","target":"716","id":"10332","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"119","target":"128","id":"4130","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"126","target":"476","id":"4278","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"364","target":"504","id":"8218","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"142","target":"455","id":"4615","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"516","target":"736","id":"9823","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"425","target":"562","id":"8972","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"424","target":"645","id":"8962","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"543","target":"663","id":"10029","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"578","target":"602","id":"10226","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"656","target":"674","id":"10574","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"411","target":"561","id":"8825","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"243","target":"641","id":"6453","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"458","target":"686","id":"9345","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"257","target":"723","id":"6693","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"474","target":"553","id":"9503","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"62","target":"341","id":"2910","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"171","target":"345","id":"5195","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"464","target":"549","id":"9398","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"202","target":"645","id":"5785","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"498","target":"614","id":"9694","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"297","target":"663","id":"7349","attributes":{"Weight":"1.0"},"color":"rgb(196,67,229)","size":1.0},{"source":"255","target":"674","id":"6660","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"507","target":"715","id":"9766","attributes":{"Weight":"1.0"},"color":"rgb(180,67,229)","size":1.0},{"source":"327","target":"573","id":"7769","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"128","target":"206","id":"4308","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"203","target":"614","id":"5800","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"351","target":"549","id":"8097","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"319","target":"642","id":"7670","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"282","target":"466","id":"7102","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"280","target":"699","id":"7073","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"145","target":"224","id":"4675","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"240","target":"531","id":"6407","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"169","target":"446","id":"5160","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"124","target":"271","id":"4237","attributes":{"Weight":"1.0"},"color":"rgb(196,180,67)","size":1.0},{"source":"64","target":"661","id":"2974","attributes":{"Weight":"1.0"},"color":"rgb(196,180,67)","size":1.0},{"source":"8","target":"371","id":"1638","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"159","target":"322","id":"4966","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"100","target":"369","id":"3755","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"444","target":"535","id":"9212","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"118","target":"138","id":"4112","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"675","target":"676","id":"10617","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"352","target":"531","id":"8110","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"276","target":"564","id":"7001","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"307","target":"468","id":"7488","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"119","target":"336","id":"4136","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"192","target":"247","id":"5582","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"230","target":"483","id":"6255","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"230","target":"512","id":"6257","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"280","target":"734","id":"7075","attributes":{"Weight":"1.0"},"color":"rgb(148,83,213)","size":1.0},{"source":"474","target":"632","id":"9505","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"553","target":"671","id":"10076","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"386","target":"460","id":"8519","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"606","target":"682","id":"10356","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"574","target":"718","id":"10201","attributes":{"Weight":"1.0"},"color":"rgb(83,148,164)","size":1.0},{"source":"108","target":"655","id":"3906","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"223","target":"344","id":"6134","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"125","target":"141","id":"4248","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"405","target":"411","id":"8753","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"339","target":"610","id":"7945","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"389","target":"599","id":"8560","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"661","target":"721","id":"10591","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"77","target":"620","id":"3258","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"141","target":"237","id":"4586","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"175","target":"535","id":"5275","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"443","target":"586","id":"9201","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"30","target":"552","id":"2162","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"135","target":"429","id":"4465","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"496","target":"659","id":"9674","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"130","target":"382","id":"4359","attributes":{"Weight":"1.0"},"color":"rgb(67,83,229)","size":1.0},{"source":"7","target":"504","id":"1614","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"500","target":"537","id":"9706","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"327","target":"687","id":"7776","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"307","target":"541","id":"7495","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"327","target":"375","id":"7759","attributes":{"Weight":"1.0"},"color":"rgb(83,229,115)","size":1.0},{"source":"211","target":"486","id":"5924","attributes":{"Weight":"1.0"},"color":"rgb(148,213,148)","size":1.0},{"source":"523","target":"543","id":"9875","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"76","target":"440","id":"3223","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"342","target":"574","id":"7983","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"237","target":"252","id":"6355","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"249","target":"622","id":"6556","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"478","target":"675","id":"9542","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"119","target":"248","id":"4135","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"111","target":"591","id":"3980","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"249","target":"461","id":"6550","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"310","target":"458","id":"7526","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"194","target":"403","id":"5624","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"136","target":"448","id":"4490","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"215","target":"260","id":"5986","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"401","target":"656","id":"8714","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"98","target":"551","id":"3720","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"604","target":"621","id":"10345","attributes":{"Weight":"1.0"},"color":"rgb(196,67,229)","size":1.0},{"source":"37","target":"337","id":"2316","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"180","target":"528","id":"5378","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"361","target":"483","id":"8195","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"110","target":"349","id":"3943","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"162","target":"339","id":"5022","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"231","target":"308","id":"6262","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"89","target":"715","id":"3531","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"338","target":"714","id":"7937","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"185","target":"461","id":"5466","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"433","target":"687","id":"9085","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"217","target":"705","id":"6042","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"224","target":"676","id":"6162","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"533","target":"627","id":"9963","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"12","target":"600","id":"1747","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"418","target":"722","id":"8890","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"288","target":"381","id":"7197","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"15","target":"519","id":"1812","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"475","target":"678","id":"9523","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"74","target":"527","id":"3181","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"143","target":"535","id":"4641","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"98","target":"456","id":"3715","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"41","target":"192","id":"2397","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"394","target":"559","id":"8627","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"158","target":"439","id":"4949","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"268","target":"390","id":"6866","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"331","target":"436","id":"7832","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"238","target":"308","id":"6370","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"27","target":"116","id":"2059","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"161","target":"322","id":"5002","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"364","target":"693","id":"8228","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"498","target":"679","id":"9699","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"344","target":"484","id":"8010","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"517","target":"648","id":"9831","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"134","target":"375","id":"4441","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"142","target":"157","id":"4606","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"596","target":"693","id":"10312","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"188","target":"428","id":"5516","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"382","target":"647","id":"8461","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"4","target":"65","id":"1535","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"340","target":"387","id":"7955","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"52","target":"464","id":"2660","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"78","target":"389","id":"3269","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"573","target":"687","id":"10194","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"124","target":"615","id":"4247","attributes":{"Weight":"1.0"},"color":"rgb(164,99,148)","size":1.0},{"source":"11","target":"65","id":"1707","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"612","target":"679","id":"10386","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"112","target":"189","id":"3988","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"166","target":"359","id":"5102","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"572","target":"644","id":"10182","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"429","target":"529","id":"9020","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"193","target":"734","id":"5616","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"280","target":"547","id":"7066","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"19","target":"59","id":"1891","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"57","target":"124","id":"2769","attributes":{"Weight":"1.0"},"color":"rgb(229,99,148)","size":1.0},{"source":"533","target":"626","id":"9962","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"64","target":"124","id":"2948","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"451","target":"487","id":"9268","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"72","target":"194","id":"3132","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"185","target":"191","id":"5457","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"289","target":"699","id":"7234","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"371","target":"606","id":"8300","attributes":{"Weight":"1.0"},"color":"rgb(213,67,213)","size":1.0},{"source":"113","target":"674","id":"4020","attributes":{"Weight":"1.0"},"color":"rgb(148,99,164)","size":1.0},{"source":"31","target":"130","id":"2170","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"82","target":"385","id":"3350","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"203","target":"611","id":"5799","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"612","target":"667","id":"10384","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"55","target":"653","id":"2743","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"250","target":"410","id":"6567","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"20","target":"502","id":"1926","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"249","target":"449","id":"6548","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"528","target":"571","id":"9922","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"179","target":"408","id":"5353","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"30","target":"305","id":"2153","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"111","target":"227","id":"3964","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"36","target":"273","id":"2292","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"208","target":"620","id":"5882","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"173","target":"525","id":"5242","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"510","target":"564","id":"9783","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"149","target":"417","id":"4766","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"175","target":"669","id":"5280","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"344","target":"445","id":"8008","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"99","target":"701","id":"3744","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"129","target":"373","id":"4337","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"342","target":"627","id":"7987","attributes":{"Weight":"1.0"},"color":"rgb(67,180,164)","size":1.0},{"source":"198","target":"633","id":"5706","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"291","target":"422","id":"7260","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"292","target":"695","id":"7278","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"292","target":"439","id":"7273","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"502","target":"681","id":"9724","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"436","target":"717","id":"9116","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"97","target":"437","id":"3693","attributes":{"Weight":"1.0"},"color":"rgb(67,196,213)","size":1.0},{"source":"177","target":"384","id":"5309","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"213","target":"365","id":"5960","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"704","target":"733","id":"10668","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"473","target":"604","id":"9499","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"90","target":"326","id":"3541","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"14","target":"379","id":"1785","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"56","target":"177","id":"2749","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"188","target":"593","id":"5521","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"433","target":"678","id":"9083","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"131","target":"623","id":"4391","attributes":{"Weight":"1.0"},"color":"rgb(148,196,115)","size":1.0},{"source":"88","target":"279","id":"3492","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"182","target":"627","id":"5411","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"224","target":"490","id":"6155","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"345","target":"417","id":"8014","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"76","target":"543","id":"3230","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"8","target":"384","id":"1639","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"51","target":"641","id":"2640","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"6","target":"298","id":"1585","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"44","target":"586","id":"2482","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"229","target":"256","id":"6231","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"2","target":"105","id":"1491","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"688","target":"697","id":"10637","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"349","target":"569","id":"8069","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"130","target":"291","id":"4353","attributes":{"Weight":"1.0"},"color":"rgb(132,148,148)","size":1.0},{"source":"39","target":"240","id":"2364","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"192","target":"380","id":"5587","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"194","target":"342","id":"5620","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"73","target":"184","id":"3151","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"664","target":"709","id":"10596","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"193","target":"689","id":"5611","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"296","target":"519","id":"7328","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"124","target":"354","id":"4240","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"66","target":"467","id":"3005","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"301","target":"384","id":"7401","attributes":{"Weight":"1.0"},"color":"rgb(99,148,180)","size":1.0},{"source":"110","target":"164","id":"3934","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"42","target":"528","id":"2427","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"63","target":"639","id":"2940","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"56","target":"625","id":"2760","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"601","target":"619","id":"10328","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"84","target":"113","id":"3389","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"523","target":"562","id":"9876","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"294","target":"397","id":"7298","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"323","target":"676","id":"7717","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"176","target":"718","id":"5300","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"28","target":"113","id":"2094","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"146","target":"210","id":"4705","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"252","target":"416","id":"6601","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"184","target":"736","id":"5456","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"612","target":"681","id":"10387","attributes":{"Weight":"1.0"},"color":"rgb(83,229,99)","size":1.0},{"source":"392","target":"411","id":"8598","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"336","target":"356","id":"7897","attributes":{"Weight":"1.0"},"color":"rgb(229,148,83)","size":1.0},{"source":"137","target":"598","id":"4512","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"172","target":"604","id":"5221","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"250","target":"423","id":"6568","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"381","target":"594","id":"8444","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"498","target":"629","id":"9696","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"394","target":"731","id":"8631","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"7","target":"271","id":"1608","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"266","target":"693","id":"6843","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"201","target":"710","id":"5764","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"391","target":"399","id":"8582","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"179","target":"231","id":"5347","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"325","target":"539","id":"7739","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"11","target":"220","id":"1711","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"459","target":"620","id":"9354","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"42","target":"93","id":"2413","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"198","target":"524","id":"5704","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"350","target":"659","id":"8085","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"316","target":"442","id":"7612","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"50","target":"429","id":"2620","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"409","target":"573","id":"8802","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"430","target":"702","id":"9038","attributes":{"Weight":"1.0"},"color":"rgb(148,213,83)","size":1.0},{"source":"21","target":"733","id":"1956","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"385","target":"614","id":"8511","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"211","target":"608","id":"5928","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"44","target":"122","id":"2461","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"435","target":"494","id":"9096","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"724","target":"734","id":"10679","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"283","target":"392","id":"7121","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"383","target":"649","id":"8479","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"185","target":"352","id":"5461","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"177","target":"532","id":"5316","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"384","target":"667","id":"8494","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"291","target":"478","id":"7264","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"377","target":"731","id":"8393","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"115","target":"379","id":"4053","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"490","target":"699","id":"9619","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"455","target":"687","id":"9318","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"46","target":"141","id":"2522","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"586","target":"627","id":"10267","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"409","target":"433","id":"8791","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"403","target":"649","id":"8736","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"317","target":"357","id":"7629","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"65","target":"346","id":"2981","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"46","target":"291","id":"2526","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"272","target":"340","id":"6934","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"550","target":"588","id":"10061","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"150","target":"720","id":"4803","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"184","target":"636","id":"5451","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"84","target":"407","id":"3397","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"71","target":"579","id":"3123","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"405","target":"731","id":"8761","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"349","target":"644","id":"8074","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"281","target":"614","id":"7084","attributes":{"Weight":"1.0"},"color":"rgb(67,164,196)","size":1.0},{"source":"116","target":"528","id":"4082","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"575","target":"583","id":"10203","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"251","target":"694","id":"6597","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"248","target":"712","id":"6540","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"421","target":"728","id":"8930","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"60","target":"646","id":"2862","attributes":{"Weight":"1.0"},"color":"rgb(148,83,180)","size":1.0},{"source":"258","target":"654","id":"6709","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"319","target":"429","id":"7659","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"260","target":"271","id":"6731","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"86","target":"286","id":"3438","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"329","target":"367","id":"7796","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"454","target":"480","id":"9296","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"210","target":"337","id":"5902","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"590","target":"709","id":"10289","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"229","target":"267","id":"6232","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"419","target":"642","id":"8903","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"382","target":"491","id":"8457","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"289","target":"323","id":"7219","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"120","target":"708","id":"4168","attributes":{"Weight":"1.0"},"color":"rgb(229,67,99)","size":1.0},{"source":"459","target":"471","id":"9348","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"183","target":"224","id":"5417","attributes":{"Weight":"1.0"},"color":"rgb(180,148,132)","size":1.0},{"source":"536","target":"718","id":"9985","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"280","target":"490","id":"7064","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"28","target":"420","id":"2109","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"284","target":"315","id":"7138","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"343","target":"388","id":"7995","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"335","target":"415","id":"7882","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"70","target":"645","id":"3104","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"689","target":"724","id":"10639","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"424","target":"642","id":"8961","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"195","target":"218","id":"5636","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"83","target":"420","id":"3380","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"140","target":"460","id":"4570","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"528","target":"593","id":"9925","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"623","target":"719","id":"10430","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"115","target":"194","id":"4048","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"330","target":"560","id":"7825","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"305","target":"324","id":"7463","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"524","target":"636","id":"9888","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"150","target":"371","id":"4786","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"68","target":"312","id":"3041","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"526","target":"582","id":"9903","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"82","target":"517","id":"3359","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"339","target":"693","id":"7950","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"183","target":"726","id":"5438","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"518","target":"620","id":"9836","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"217","target":"533","id":"6036","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"199","target":"664","id":"5728","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"337","target":"533","id":"7917","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"416","target":"447","id":"8857","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"378","target":"399","id":"8395","attributes":{"Weight":"1.0"},"color":"rgb(229,148,115)","size":1.0},{"source":"158","target":"641","id":"4953","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"417","target":"534","id":"8871","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"19","target":"447","id":"1902","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"577","target":"678","id":"10221","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"197","target":"456","id":"5688","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"294","target":"644","id":"7309","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"583","target":"603","id":"10254","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"572","target":"693","id":"10183","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"506","target":"727","id":"9757","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"148","target":"307","id":"4742","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"528","target":"646","id":"9930","attributes":{"Weight":"1.0"},"color":"rgb(148,132,148)","size":1.0},{"source":"61","target":"145","id":"2869","attributes":{"Weight":"1.0"},"color":"rgb(213,67,213)","size":1.0},{"source":"52","target":"718","id":"2668","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"159","target":"632","id":"4972","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"433","target":"543","id":"9075","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"356","target":"423","id":"8142","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"206","target":"448","id":"5844","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"170","target":"545","id":"5181","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"295","target":"357","id":"7315","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"229","target":"564","id":"6244","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"128","target":"360","id":"4312","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"129","target":"240","id":"4334","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"88","target":"422","id":"3496","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"159","target":"621","id":"4971","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"31","target":"100","id":"2167","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"76","target":"594","id":"3235","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"600","target":"608","id":"10322","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"97","target":"296","id":"3690","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"121","target":"191","id":"4177","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"566","target":"613","id":"10139","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"296","target":"494","id":"7327","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"12","target":"450","id":"1742","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"27","target":"139","id":"2060","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"432","target":"455","id":"9054","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"399","target":"731","id":"8693","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"396","target":"566","id":"8647","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"537","target":"649","id":"9990","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"147","target":"539","id":"4734","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"266","target":"692","id":"6842","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"470","target":"471","id":"9458","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"421","target":"473","id":"8917","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"288","target":"409","id":"7198","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"472","target":"508","id":"9477","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"428","target":"619","id":"9012","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"53","target":"736","id":"2690","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"288","target":"728","id":"7218","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"45","target":"237","id":"2498","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"15","target":"108","id":"1801","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"49","target":"169","id":"2582","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"441","target":"734","id":"9179","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"236","target":"305","id":"6342","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"100","target":"130","id":"3747","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"144","target":"668","id":"4672","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"335","target":"726","id":"7895","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"318","target":"509","id":"7642","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"607","target":"711","id":"10360","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"639","target":"671","id":"10496","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"605","target":"631","id":"10349","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"91","target":"242","id":"3559","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"315","target":"467","id":"7599","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"108","target":"218","id":"3892","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"140","target":"678","id":"4580","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"144","target":"303","id":"4654","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"82","target":"633","id":"3365","attributes":{"Weight":"1.0"},"color":"rgb(99,229,115)","size":1.0},{"source":"255","target":"660","id":"6659","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"167","target":"226","id":"5118","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"96","target":"701","id":"3683","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"169","target":"352","id":"5156","attributes":{"Weight":"1.0"},"color":"rgb(148,213,67)","size":1.0},{"source":"517","target":"573","id":"9825","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"339","target":"453","id":"7939","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"60","target":"429","id":"2851","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"594","target":"728","id":"10304","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"75","target":"537","id":"3206","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"27","target":"573","id":"2076","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"169","target":"581","id":"5166","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"225","target":"462","id":"6175","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"311","target":"654","id":"7550","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"254","target":"674","id":"6645","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"586","target":"676","id":"10268","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"160","target":"297","id":"4984","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"508","target":"604","id":"9774","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"261","target":"642","id":"6769","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"587","target":"649","id":"10272","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"235","target":"353","id":"6333","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"248","target":"343","id":"6529","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"401","target":"694","id":"8717","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"568","target":"733","id":"10155","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"188","target":"652","id":"5525","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"637","target":"736","id":"10487","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"289","target":"540","id":"7229","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"102","target":"222","id":"3786","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"61","target":"94","id":"2866","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"435","target":"582","id":"9100","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"282","target":"650","id":"7106","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"44","target":"475","id":"2475","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"347","target":"628","id":"8043","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"20","target":"375","id":"1923","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"677","target":"707","id":"10624","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"404","target":"565","id":"8746","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"7","target":"690","id":"1621","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"430","target":"440","id":"9028","attributes":{"Weight":"1.0"},"color":"rgb(229,132,148)","size":1.0},{"source":"225","target":"358","id":"6170","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"77","target":"208","id":"3243","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"465","target":"689","id":"9411","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"17","target":"564","id":"1862","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"124","target":"445","id":"4243","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"523","target":"649","id":"9881","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"326","target":"513","id":"7753","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"205","target":"631","id":"5835","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"59","target":"478","id":"2827","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"284","target":"495","id":"7142","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"259","target":"500","id":"6718","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"123","target":"141","id":"4212","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"274","target":"296","id":"6959","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"107","target":"488","id":"3882","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"145","target":"699","id":"4701","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"602","target":"610","id":"10333","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"269","target":"405","id":"6894","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"213","target":"476","id":"5963","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"257","target":"474","id":"6682","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"14","target":"259","id":"1781","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"64","target":"262","id":"2960","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"114","target":"297","id":"4028","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"191","target":"634","id":"5580","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"674","target":"696","id":"10616","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"286","target":"601","id":"7174","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"423","target":"558","id":"8945","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"436","target":"676","id":"9113","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"654","target":"707","id":"10571","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"61","target":"140","id":"2868","attributes":{"Weight":"1.0"},"color":"rgb(132,148,180)","size":1.0},{"source":"328","target":"718","id":"7793","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"144","target":"583","id":"4667","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"279","target":"289","id":"7035","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"357","target":"446","id":"8152","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"197","target":"328","id":"5681","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"247","target":"380","id":"6519","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"269","target":"393","id":"6890","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"453","target":"610","id":"9286","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"498","target":"517","id":"9689","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"290","target":"731","id":"7257","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"32","target":"410","id":"2196","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"291","target":"534","id":"7268","attributes":{"Weight":"1.0"},"color":"rgb(197,148,148)","size":1.0},{"source":"110","target":"572","id":"3949","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"83","target":"107","id":"3370","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"62","target":"134","id":"2904","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"7","target":"723","id":"1625","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"171","target":"606","id":"5205","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"458","target":"471","id":"9337","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"562","target":"606","id":"10121","attributes":{"Weight":"1.0"},"color":"rgb(213,67,229)","size":1.0},{"source":"161","target":"671","id":"5012","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"336","target":"550","id":"7905","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"266","target":"602","id":"6837","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"80","target":"144","id":"3306","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"569","target":"629","id":"10158","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"371","target":"719","id":"8306","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"353","target":"429","id":"8117","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"129","target":"677","id":"4346","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"159","target":"398","id":"4967","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"48","target":"174","id":"2566","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"190","target":"383","id":"5557","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"252","target":"461","id":"6606","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"396","target":"613","id":"8649","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"57","target":"472","id":"2778","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"87","target":"421","id":"3461","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"186","target":"595","id":"5493","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"479","target":"541","id":"9545","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"409","target":"472","id":"8793","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"335","target":"348","id":"7881","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"308","target":"583","id":"7507","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"321","target":"488","id":"7688","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"297","target":"398","id":"7340","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"635","target":"636","id":"10473","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"19","target":"45","id":"1887","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"245","target":"719","id":"6495","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"264","target":"465","id":"6803","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"216","target":"428","id":"6012","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"112","target":"344","id":"3997","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"153","target":"672","id":"4857","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"172","target":"177","id":"5211","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"184","target":"497","id":"5445","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"483","target":"661","id":"9572","attributes":{"Weight":"1.0"},"color":"rgb(196,180,67)","size":1.0},{"source":"143","target":"455","id":"4638","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"627","target":"705","id":"10444","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"275","target":"526","id":"6985","attributes":{"Weight":"1.0"},"color":"rgb(67,196,148)","size":1.0},{"source":"672","target":"701","id":"10612","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"218","target":"591","id":"6061","attributes":{"Weight":"1.0"},"color":"rgb(148,115,213)","size":1.0},{"source":"111","target":"164","id":"3963","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"543","target":"604","id":"10027","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"337","target":"626","id":"7919","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"18","target":"220","id":"1870","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"57","target":"76","id":"2767","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"26","target":"416","id":"2046","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"108","target":"631","id":"3905","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"169","target":"592","id":"5167","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"295","target":"581","id":"7321","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"85","target":"490","id":"3423","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"275","target":"592","id":"6989","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"89","target":"297","id":"3519","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"157","target":"300","id":"4927","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"496","target":"613","id":"9672","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"51","target":"158","id":"2631","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"30","target":"368","id":"2157","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"227","target":"397","id":"6204","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"73","target":"736","id":"3168","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"276","target":"357","id":"6996","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"582","target":"585","id":"10249","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"242","target":"574","id":"6443","attributes":{"Weight":"1.0"},"color":"rgb(83,229,83)","size":1.0},{"source":"269","target":"283","id":"6883","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"29","target":"515","id":"2138","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"42","target":"277","id":"2420","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"286","target":"326","id":"7165","attributes":{"Weight":"1.0"},"color":"rgb(164,196,67)","size":1.0},{"source":"582","target":"722","id":"10253","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"19","target":"58","id":"1890","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"51","target":"733","id":"2645","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"95","target":"109","id":"3639","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"188","target":"619","id":"5524","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"93","target":"332","id":"3603","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"215","target":"241","id":"5984","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"111","target":"644","id":"3983","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"275","target":"652","id":"6990","attributes":{"Weight":"1.0"},"color":"rgb(148,196,67)","size":1.0},{"source":"35","target":"306","id":"2274","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"508","target":"663","id":"9775","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"144","target":"575","id":"4665","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"298","target":"458","id":"7356","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"85","target":"676","id":"3428","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"108","target":"585","id":"3903","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"134","target":"681","id":"4448","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"165","target":"461","id":"5087","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"654","target":"667","id":"10565","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"425","target":"449","id":"8964","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"404","target":"416","id":"8740","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"444","target":"455","id":"9209","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"128","target":"550","id":"4319","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"126","target":"502","id":"4279","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"283","target":"658","id":"7135","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"661","target":"692","id":"10589","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"96","target":"130","id":"3668","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"131","target":"443","id":"4381","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"659","target":"714","id":"10583","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"73","target":"688","id":"3166","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"6","target":"81","id":"1582","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"5","target":"157","id":"1559","attributes":{"Weight":"1.0"},"color":"rgb(99,148,180)","size":1.0},{"source":"253","target":"402","id":"6620","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"44","target":"151","id":"2462","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"229","target":"546","id":"6243","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"610","target":"693","id":"10372","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"725","target":"735","id":"10684","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"51","target":"292","id":"2634","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"155","target":"349","id":"4892","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"650","target":"734","id":"10551","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"121","target":"185","id":"4176","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"56","target":"386","id":"2753","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"168","target":"352","id":"5134","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"61","target":"534","id":"2888","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"189","target":"512","id":"5544","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"199","target":"387","id":"5721","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"419","target":"555","id":"8899","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"318","target":"592","id":"7650","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"10","target":"106","id":"1687","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"282","target":"465","id":"7101","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"23","target":"695","id":"1992","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"133","target":"534","id":"4426","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"45","target":"447","id":"2505","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"155","target":"316","id":"4891","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"254","target":"557","id":"6641","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"441","target":"724","id":"9175","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"252","target":"449","id":"6604","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"67","target":"312","id":"3020","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"16","target":"708","id":"1840","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"144","target":"616","id":"4670","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"219","target":"457","id":"6073","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"439","target":"732","id":"9148","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"72","target":"691","id":"3147","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"352","target":"607","id":"8111","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"224","target":"529","id":"6156","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"216","target":"716","id":"6028","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"159","target":"485","id":"4969","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"175","target":"539","id":"5276","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"68","target":"635","id":"3048","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"174","target":"733","id":"5262","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"568","target":"709","id":"10153","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"345","target":"659","id":"8021","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"54","target":"216","id":"2696","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"6","target":"148","id":"1583","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"188","target":"528","id":"5518","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"9","target":"201","id":"1665","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"282","target":"735","id":"7115","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"10","target":"105","id":"1686","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"212","target":"449","id":"5941","attributes":{"Weight":"1.0"},"color":"rgb(132,229,148)","size":1.0},{"source":"169","target":"564","id":"5165","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"162","target":"721","id":"5038","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"259","target":"587","id":"6723","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"192","target":"495","id":"5590","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"296","target":"631","id":"7335","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"296","target":"526","id":"7330","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"574","target":"587","id":"10195","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"385","target":"475","id":"8503","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"640","target":"695","id":"10500","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"202","target":"642","id":"5784","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"452","target":"503","id":"9277","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"387","target":"709","id":"8544","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"66","target":"380","id":"3002","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"171","target":"673","id":"5208","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"488","target":"626","id":"9598","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"121","target":"463","id":"4185","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"22","target":"439","id":"1968","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"608","target":"631","id":"10361","attributes":{"Weight":"1.0"},"color":"rgb(67,196,229)","size":1.0},{"source":"59","target":"252","id":"2820","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"517","target":"577","id":"9826","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"323","target":"567","id":"7715","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"106","target":"369","id":"3865","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"470","target":"680","id":"9465","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"170","target":"251","id":"5171","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"224","target":"726","id":"6166","attributes":{"Weight":"1.0"},"color":"rgb(196,67,213)","size":1.0},{"source":"375","target":"683","id":"8362","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"5","target":"303","id":"1565","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"240","target":"486","id":"6404","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"94","target":"345","id":"3625","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"225","target":"600","id":"6178","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"279","target":"693","id":"7052","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"307","target":"686","id":"7498","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"342","target":"717","id":"7992","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"176","target":"328","id":"5284","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"82","target":"678","id":"3367","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"494","target":"585","id":"9658","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"98","target":"351","id":"3710","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"68","target":"302","id":"3040","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"460","target":"713","id":"9373","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"28","target":"278","id":"2101","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"57","target":"288","id":"2772","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"162","target":"690","id":"5034","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"94","target":"244","id":"3621","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"266","target":"339","id":"6831","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"283","target":"559","id":"7131","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"120","target":"595","id":"4167","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"187","target":"669","id":"5509","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"293","target":"641","id":"7287","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"439","target":"568","id":"9141","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"52","target":"176","id":"2649","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"579","target":"626","id":"10237","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"235","target":"429","id":"6335","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"398","target":"654","id":"8675","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"397","target":"569","id":"8655","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"65","target":"503","id":"2986","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"148","target":"541","id":"4754","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"264","target":"730","id":"6815","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"551","target":"615","id":"10066","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"128","target":"152","id":"4306","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"33","target":"344","id":"2226","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"273","target":"315","id":"6949","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"212","target":"358","id":"5937","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"386","target":"685","id":"8532","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"577","target":"648","id":"10220","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"164","target":"591","id":"5068","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"253","target":"254","id":"6615","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"444","target":"542","id":"9214","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"116","target":"576","id":"4085","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"297","target":"638","id":"7346","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"76","target":"589","id":"3234","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"118","target":"346","id":"4117","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"18","target":"670","id":"1884","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"172","target":"527","id":"5219","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"26","target":"125","id":"2040","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"129","target":"359","id":"4336","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"18","target":"404","id":"1877","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"268","target":"413","id":"6876","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"270","target":"633","id":"6910","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"226","target":"607","id":"6191","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"314","target":"659","id":"7593","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"310","target":"680","id":"7537","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"528","target":"580","id":"9924","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"651","target":"735","id":"10559","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"42","target":"202","id":"2417","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"363","target":"379","id":"8202","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"113","target":"662","id":"4019","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"261","target":"462","id":"6762","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"266","target":"596","id":"6836","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"201","target":"222","id":"5749","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"506","target":"712","id":"9756","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"163","target":"378","id":"5045","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"31","target":"96","id":"2165","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"19","target":"622","id":"1908","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"276","target":"509","id":"6998","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"2","target":"322","id":"1500","attributes":{"Weight":"1.0"},"color":"rgb(115,67,229)","size":1.0},{"source":"360","target":"448","id":"8184","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"216","target":"644","id":"6025","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"502","target":"530","id":"9722","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"158","target":"640","id":"4952","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"209","target":"512","id":"5898","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"167","target":"359","id":"5121","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"170","target":"253","id":"5172","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"212","target":"319","id":"5936","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"517","target":"614","id":"9828","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"344","target":"354","id":"8005","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"224","target":"567","id":"6159","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"251","target":"336","id":"6583","attributes":{"Weight":"1.0"},"color":"rgb(229,148,83)","size":1.0},{"source":"625","target":"679","id":"10437","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"197","target":"329","id":"5682","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"132","target":"189","id":"4397","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"78","target":"306","id":"3266","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"351","target":"615","id":"8100","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"165","target":"430","id":"5086","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"202","target":"287","id":"5770","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"2","target":"370","id":"1503","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"464","target":"615","id":"9402","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"168","target":"226","id":"5132","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"143","target":"645","id":"4645","attributes":{"Weight":"1.0"},"color":"rgb(99,148,229)","size":1.0},{"source":"165","target":"711","id":"5093","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"24","target":"243","id":"2004","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"121","target":"240","id":"4179","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"374","target":"687","id":"8349","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"114","target":"322","id":"4029","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"169","target":"510","id":"5162","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"191","target":"359","id":"5573","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"342","target":"649","id":"7988","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"311","target":"527","id":"7545","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"59","target":"416","id":"2822","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"222","target":"236","id":"6117","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"390","target":"731","id":"8577","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"40","target":"41","id":"2375","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"693","target":"721","id":"10654","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"81","target":"148","id":"3325","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"202","target":"424","id":"5774","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"312","target":"736","id":"7567","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"28","target":"135","id":"2095","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"122","target":"442","id":"4197","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"352","target":"667","id":"8114","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"228","target":"499","id":"6226","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"90","target":"341","id":"3542","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"329","target":"372","id":"7797","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"371","target":"572","id":"8297","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"464","target":"536","id":"9397","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"381","target":"508","id":"8436","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"116","target":"303","id":"4073","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"421","target":"562","id":"8922","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"303","target":"498","id":"7438","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"280","target":"443","id":"7062","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"151","target":"490","id":"4820","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"421","target":"440","id":"8915","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"286","target":"580","id":"7172","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"264","target":"647","id":"6807","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"440","target":"523","id":"9154","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"303","target":"434","id":"7437","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"229","target":"446","id":"6240","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"43","target":"590","id":"2453","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"117","target":"156","id":"4095","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"217","target":"488","id":"6035","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"234","target":"554","id":"6321","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"186","target":"552","id":"5492","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"106","target":"153","id":"3858","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"95","target":"712","id":"3662","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"553","target":"715","id":"10077","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"19","target":"452","id":"1904","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"45","target":"481","id":"2510","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"133","target":"314","id":"4417","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"489","target":"595","id":"9608","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"466","target":"729","id":"9426","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"95","target":"343","id":"3649","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"86","target":"93","id":"3431","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"38","target":"537","id":"2350","attributes":{"Weight":"1.0"},"color":"rgb(148,213,83)","size":1.0},{"source":"464","target":"552","id":"9400","attributes":{"Weight":"1.0"},"color":"rgb(164,67,180)","size":1.0},{"source":"1","target":"722","id":"1485","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"208","target":"518","id":"5880","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"91","target":"341","id":"3562","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"157","target":"469","id":"4933","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"411","target":"412","id":"8820","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"377","target":"559","id":"8389","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"263","target":"432","id":"6784","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"253","target":"410","id":"6621","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"608","target":"734","id":"10364","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"326","target":"530","id":"7754","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"116","target":"713","id":"4092","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"211","target":"600","id":"5927","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"201","target":"236","id":"5752","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"121","target":"166","id":"4173","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"232","target":"583","id":"6290","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"85","target":"279","id":"3414","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"4","target":"387","id":"1544","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"186","target":"201","id":"5478","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"102","target":"552","id":"3800","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"228","target":"368","id":"6223","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"64","target":"344","id":"2962","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"222","target":"499","id":"6125","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"312","target":"538","id":"7559","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"135","target":"289","id":"4457","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"399","target":"658","id":"8692","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"210","target":"533","id":"5906","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"103","target":"317","id":"3812","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"52","target":"551","id":"2664","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"501","target":"506","id":"9714","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"315","target":"584","id":"7602","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"375","target":"476","id":"8354","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"195","target":"631","id":"5650","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"94","target":"659","id":"3635","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"251","target":"423","id":"6589","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"205","target":"722","id":"5837","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"647","target":"735","id":"10538","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"19","target":"125","id":"1893","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"575","target":"616","id":"10206","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"41","target":"315","id":"2402","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"118","target":"595","id":"4125","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"148","target":"518","id":"4753","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"650","target":"689","id":"10546","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"355","target":"564","id":"8135","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"11","target":"664","id":"1725","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"17","target":"510","id":"1860","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"8","target":"679","id":"1656","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"570","target":"666","id":"10166","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"301","target":"669","id":"7414","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"199","target":"404","id":"5722","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"42","target":"188","id":"2416","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"19","target":"123","id":"1892","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"289","target":"443","id":"7225","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"490","target":"547","id":"9613","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"110","target":"245","id":"3939","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"373","target":"569","id":"8321","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"277","target":"593","id":"7015","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"163","target":"248","id":"5041","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"227","target":"373","id":"6203","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"47","target":"556","id":"2556","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"206","target":"563","id":"5848","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"301","target":"455","id":"7405","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"193","target":"441","id":"5603","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"235","target":"305","id":"6330","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"120","target":"201","id":"4151","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"116","target":"562","id":"4083","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"444","target":"653","id":"9216","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"46","target":"252","id":"2525","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"329","target":"536","id":"7803","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"267","target":"592","id":"6860","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"104","target":"581","id":"3839","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"162","target":"266","id":"5018","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"465","target":"491","id":"9406","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"91","target":"326","id":"3561","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"268","target":"330","id":"6864","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"285","target":"441","id":"7150","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"86","target":"333","id":"3441","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"282","target":"647","id":"7105","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"431","target":"602","id":"9047","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"667","target":"679","id":"10603","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"85","target":"233","id":"3413","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"330","target":"395","id":"7817","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"30","target":"595","id":"2163","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"249","target":"447","id":"6547","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"145","target":"721","id":"4703","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"467","target":"666","id":"9435","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"160","target":"474","id":"4987","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"463","target":"531","id":"9392","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"440","target":"583","id":"9158","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"122","target":"433","id":"4196","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"28","target":"111","id":"2093","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"200","target":"403","id":"5736","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"407","target":"579","id":"8772","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"689","target":"734","id":"10643","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"131","target":"652","id":"4393","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"62","target":"156","id":"2905","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"255","target":"423","id":"6653","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"25","target":"292","id":"2023","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"362","target":"445","id":"8198","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"499","target":"548","id":"9701","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"150","target":"397","id":"4788","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"209","target":"320","id":"5890","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"277","target":"428","id":"7008","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"212","target":"450","id":"5942","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"8","target":"140","id":"1630","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"145","target":"717","id":"4702","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"241","target":"339","id":"6415","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"529","target":"676","id":"9940","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"391","target":"413","id":"8586","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"17","target":"357","id":"1857","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"336","target":"563","id":"7906","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"376","target":"586","id":"8373","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"75","target":"259","id":"3198","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"6","target":"686","id":"1601","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"333","target":"593","id":"7862","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"212","target":"261","id":"5934","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"603","target":"668","id":"10343","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"68","target":"497","id":"3042","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"45","target":"452","id":"2507","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"325","target":"345","id":"7731","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"110","target":"373","id":"3945","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"331","target":"717","id":"7841","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"280","target":"676","id":"7072","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"53","target":"73","id":"2671","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"326","target":"375","id":"7749","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"245","target":"572","id":"6490","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"489","target":"529","id":"9604","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"505","target":"691","id":"9749","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"386","target":"707","id":"8533","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"715","target":"726","id":"10673","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"400","target":"660","id":"8703","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"63","target":"322","id":"2932","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"516","target":"538","id":"9814","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"383","target":"597","id":"8478","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"166","target":"461","id":"5106","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"319","target":"529","id":"7665","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"1","target":"631","id":"1483","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"514","target":"669","id":"9806","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"649","target":"691","id":"10542","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"395","target":"561","id":"8640","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"156","target":"213","id":"4907","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"61","target":"673","id":"2894","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"384","target":"703","id":"8498","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"585","target":"655","id":"10265","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"187","target":"514","id":"5503","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"339","target":"723","id":"7952","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"281","target":"650","id":"7087","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"91","target":"530","id":"3569","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"3","target":"165","id":"1514","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"574","target":"691","id":"10198","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"526","target":"585","id":"9904","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"290","target":"391","id":"7241","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"400","target":"402","id":"8695","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"272","target":"346","id":"6935","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"346","target":"628","id":"8033","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"540","target":"708","id":"10012","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"519","target":"582","id":"9842","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"565","target":"604","id":"10134","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"405","target":"560","id":"8758","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"179","target":"679","id":"5366","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"107","target":"113","id":"3872","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"181","target":"672","id":"5398","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"223","target":"262","id":"6132","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"79","target":"687","id":"3302","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"218","target":"494","id":"6054","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"227","target":"643","id":"6212","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"476","target":"513","id":"9526","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"422","target":"591","id":"8938","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"248","target":"388","id":"6532","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"416","target":"461","id":"8860","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"458","target":"518","id":"9341","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"28","target":"368","id":"2106","attributes":{"Weight":"1.0"},"color":"rgb(148,99,180)","size":1.0},{"source":"88","target":"215","id":"3484","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"545","target":"674","id":"10039","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"270","target":"636","id":"6912","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"458","target":"470","id":"9336","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"328","target":"456","id":"7784","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"583","target":"668","id":"10257","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"17","target":"34","id":"1843","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"177","target":"279","id":"5306","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"77","target":"477","id":"3253","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"68","target":"688","id":"3052","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"225","target":"555","id":"6177","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"9","target":"710","id":"1681","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"279","target":"443","id":"7043","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"332","target":"333","id":"7842","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"209","target":"230","id":"5887","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"74","target":"289","id":"3173","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"5","target":"80","id":"1555","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"246","target":"638","id":"6508","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"170","target":"558","id":"5184","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"264","target":"491","id":"6805","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"451","target":"608","id":"9271","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"29","target":"477","id":"2136","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"197","target":"718","id":"5697","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"296","target":"655","id":"7336","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"426","target":"609","id":"8989","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"39","target":"168","id":"2360","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"151","target":"238","id":"4809","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"535","target":"542","id":"9975","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"571","target":"619","id":"10172","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"353","target":"499","id":"8119","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"95","target":"550","id":"3657","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"159","target":"638","id":"4973","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"68","target":"524","id":"3044","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"24","target":"641","id":"2011","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"561","target":"731","id":"10115","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"98","target":"197","id":"3707","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"602","target":"723","id":"10341","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"118","target":"199","id":"4113","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"148","target":"313","id":"4744","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"211","target":"451","id":"5922","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"154","target":"591","id":"4877","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"181","target":"309","id":"5391","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"569","target":"643","id":"10159","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"500","target":"574","id":"9707","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"72","target":"403","id":"3139","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"221","target":"555","id":"6107","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"130","target":"452","id":"4360","attributes":{"Weight":"1.0"},"color":"rgb(132,148,148)","size":1.0},{"source":"65","target":"670","id":"2991","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"190","target":"197","id":"5549","attributes":{"Weight":"1.0"},"color":"rgb(83,148,164)","size":1.0},{"source":"526","target":"631","id":"9906","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"186","target":"222","id":"5479","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"255","target":"556","id":"6655","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"117","target":"544","id":"4108","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"81","target":"459","id":"3332","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"9","target":"222","id":"1666","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"67","target":"524","id":"3023","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"54","target":"589","id":"2715","attributes":{"Weight":"1.0"},"color":"rgb(148,148,229)","size":1.0},{"source":"24","target":"704","id":"2013","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"86","target":"662","id":"3452","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"364","target":"690","id":"8226","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"724","target":"735","id":"10680","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"638","target":"715","id":"10492","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"122","target":"498","id":"4201","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"390","target":"393","id":"8564","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"104","target":"446","id":"3834","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"460","target":"522","id":"9357","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"440","target":"543","id":"9155","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"244","target":"417","id":"6465","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"60","target":"595","id":"2860","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"409","target":"589","id":"8803","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"579","target":"627","id":"10238","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"388","target":"617","id":"8552","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"301","target":"653","id":"7413","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"181","target":"366","id":"5392","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"154","target":"373","id":"4871","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"578","target":"690","id":"10231","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"17","target":"104","id":"1846","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"348","target":"440","id":"8051","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"624","target":"669","id":"10432","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"116","target":"460","id":"4081","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"193","target":"650","id":"5609","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"320","target":"361","id":"7676","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"204","target":"538","id":"5812","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"251","target":"656","id":"6594","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"652","target":"716","id":"10562","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"469","target":"608","id":"9451","attributes":{"Weight":"1.0"},"color":"rgb(99,148,229)","size":1.0},{"source":"43","target":"533","id":"2452","attributes":{"Weight":"1.0"},"color":"rgb(67,180,213)","size":1.0},{"source":"545","target":"557","id":"10035","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"445","target":"638","id":"9222","attributes":{"Weight":"1.0"},"color":"rgb(196,99,148)","size":1.0},{"source":"523","target":"682","id":"9883","attributes":{"Weight":"1.0"},"color":"rgb(213,67,229)","size":1.0},{"source":"277","target":"619","id":"7018","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"623","target":"687","id":"10429","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"347","target":"503","id":"8040","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"31","target":"219","id":"2173","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"175","target":"444","id":"5270","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"353","target":"552","id":"8121","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"189","target":"207","id":"5528","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"321","target":"627","id":"7692","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"60","target":"144","id":"2836","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"177","target":"261","id":"5305","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"188","target":"618","id":"5523","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"157","target":"444","id":"4931","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"105","target":"672","id":"3855","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"268","target":"395","id":"6871","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"56","target":"408","id":"2754","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"173","target":"526","id":"5243","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"258","target":"398","id":"6699","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"282","target":"683","id":"7108","attributes":{"Weight":"1.0"},"color":"rgb(83,164,148)","size":1.0},{"source":"493","target":"631","id":"9651","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"408","target":"532","id":"8780","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"73","target":"538","id":"3160","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"113","target":"407","id":"4012","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"75","target":"363","id":"3200","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"503","target":"709","id":"9732","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"168","target":"410","id":"5136","attributes":{"Weight":"1.0"},"color":"rgb(229,132,83)","size":1.0},{"source":"435","target":"655","id":"9104","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"156","target":"406","id":"4914","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"470","target":"518","id":"9462","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"384","target":"532","id":"8489","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"343","target":"563","id":"8000","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"64","target":"404","id":"2966","attributes":{"Weight":"1.0"},"color":"rgb(148,180,132)","size":1.0},{"source":"137","target":"570","id":"4510","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"47","target":"250","id":"2543","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"250","target":"556","id":"6571","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"60","target":"489","id":"2853","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"453","target":"504","id":"9282","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"641","target":"709","id":"10508","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"410","target":"558","id":"8814","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"433","target":"498","id":"9073","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"596","target":"661","id":"10308","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"429","target":"552","id":"9022","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"504","target":"578","id":"9733","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"193","target":"408","id":"5601","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"433","target":"517","id":"9074","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"256","target":"267","id":"6663","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"152","target":"388","id":"4836","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"309","target":"370","id":"7518","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"331","target":"699","id":"7840","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"183","target":"636","id":"5431","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"224","target":"642","id":"6161","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"13","target":"247","id":"1759","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"643","target":"719","id":"10515","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"364","target":"596","id":"8220","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"298","target":"471","id":"7360","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"465","target":"650","id":"9409","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"441","target":"646","id":"9170","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"399","target":"414","id":"8686","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"288","target":"527","id":"7209","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"375","target":"513","id":"8356","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"100","target":"554","id":"3758","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"212","target":"622","id":"5950","attributes":{"Weight":"1.0"},"color":"rgb(132,229,148)","size":1.0},{"source":"22","target":"120","id":"1962","attributes":{"Weight":"1.0"},"color":"rgb(229,67,99)","size":1.0},{"source":"649","target":"682","id":"10541","attributes":{"Weight":"1.0"},"color":"rgb(132,148,164)","size":1.0},{"source":"190","target":"691","id":"5566","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"257","target":"638","id":"6687","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"324","target":"548","id":"7726","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"273","target":"598","id":"6956","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"525","target":"527","id":"9895","attributes":{"Weight":"1.0"},"color":"rgb(67,196,180)","size":1.0},{"source":"609","target":"700","id":"10366","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"250","target":"402","id":"6566","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"66","target":"584","id":"3008","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"534","target":"659","id":"9969","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"233","target":"547","id":"6306","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"447","target":"452","id":"9232","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"66","target":"315","id":"3001","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"60","target":"576","id":"2859","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"220","target":"664","id":"6089","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"376","target":"547","id":"8371","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"231","target":"627","id":"6275","attributes":{"Weight":"1.0"},"color":"rgb(67,180,180)","size":1.0},{"source":"263","target":"455","id":"6786","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"144","target":"232","id":"4651","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"453","target":"596","id":"9284","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"60","target":"235","id":"2842","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"219","target":"304","id":"6068","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"61","target":"79","id":"2865","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"334","target":"499","id":"7876","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"324","target":"353","id":"7721","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"420","target":"579","id":"8909","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"106","target":"701","id":"3871","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"59","target":"449","id":"2825","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"285","target":"491","id":"7153","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"133","target":"682","id":"4432","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"49","target":"546","id":"2597","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"730","target":"734","id":"10688","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"277","target":"580","id":"7014","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"282","target":"441","id":"7100","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"76","target":"196","id":"3215","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"52","target":"427","id":"2658","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"105","target":"106","id":"3841","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"88","target":"266","id":"3490","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"269","target":"392","id":"6889","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"629","target":"719","id":"10452","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"86","target":"593","id":"3447","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"2","target":"554","id":"1505","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"650","target":"724","id":"10547","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"46","target":"481","id":"2535","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"223","target":"361","id":"6136","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"539","target":"542","id":"10002","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"203","target":"517","id":"5795","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"237","target":"622","id":"6365","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"499","target":"595","id":"9703","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"184","target":"697","id":"5455","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"27","target":"409","id":"2070","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"469","target":"600","id":"9450","attributes":{"Weight":"1.0"},"color":"rgb(99,148,229)","size":1.0},{"source":"245","target":"644","id":"6494","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"188","target":"216","id":"5511","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"143","target":"669","id":"4647","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"476","target":"530","id":"9527","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"498","target":"648","id":"9697","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"260","target":"693","id":"6749","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"566","target":"673","id":"10141","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"426","target":"464","id":"8984","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"44","target":"623","id":"2485","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"379","target":"574","id":"8413","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"200","target":"500","id":"5737","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"316","target":"591","id":"7618","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"246","target":"671","id":"6511","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"138","target":"347","id":"4521","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"254","target":"556","id":"6640","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"30","target":"102","id":"2145","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"13","target":"306","id":"1762","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"259","target":"574","id":"6722","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"154","target":"245","id":"4864","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"261","target":"572","id":"6765","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"632","target":"726","id":"10464","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"265","target":"326","id":"6818","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"527","target":"532","id":"9911","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"267","target":"355","id":"6851","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"203","target":"480","id":"5793","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"215","target":"257","id":"5985","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"416","target":"483","id":"8864","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"75","target":"200","id":"3197","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"12","target":"54","id":"1729","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"372","target":"609","id":"8316","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"152","target":"501","id":"4838","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"196","target":"425","id":"5661","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"13","target":"137","id":"1757","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"256","target":"509","id":"6672","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"234","target":"608","id":"6323","attributes":{"Weight":"1.0"},"color":"rgb(67,148,229)","size":1.0},{"source":"421","target":"649","id":"8927","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"33","target":"368","id":"2231","attributes":{"Weight":"1.0"},"color":"rgb(229,99,99)","size":1.0},{"source":"398","target":"485","id":"8668","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"296","target":"418","id":"7323","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"301","target":"535","id":"7408","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"609","target":"615","id":"10365","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"573","target":"648","id":"10191","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"235","target":"324","id":"6331","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"136","target":"152","id":"4481","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"154","target":"644","id":"4881","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"161","target":"474","id":"5004","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"68","target":"184","id":"3035","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"264","target":"725","id":"6813","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"99","target":"300","id":"3733","attributes":{"Weight":"1.0"},"color":"rgb(99,67,229)","size":1.0},{"source":"235","target":"334","id":"6332","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"461","target":"607","id":"9379","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"515","target":"680","id":"9811","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"468","target":"620","id":"9443","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"485","target":"663","id":"9581","attributes":{"Weight":"1.0"},"color":"rgb(196,67,229)","size":1.0},{"source":"553","target":"657","id":"10075","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"474","target":"485","id":"9502","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"185","target":"676","id":"5475","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"164","target":"359","id":"5062","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"288","target":"421","id":"7199","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"73","target":"516","id":"3158","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"106","target":"234","id":"3861","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"291","target":"675","id":"7271","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"53","target":"635","id":"2684","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"191","target":"607","id":"5579","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"410","target":"674","id":"8817","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"397","target":"720","id":"8664","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"90","target":"242","id":"3539","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"88","target":"578","id":"3500","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"98","target":"464","id":"3716","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"162","target":"665","id":"5033","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"178","target":"426","id":"5334","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"13","target":"78","id":"1756","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"25","target":"293","id":"2024","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"350","target":"613","id":"8084","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"250","target":"660","id":"6576","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"131","target":"216","id":"4372","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"11","target":"340","id":"1714","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"455","target":"514","id":"9309","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"172","target":"707","id":"5231","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"214","target":"344","id":"5976","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"236","target":"595","id":"6352","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"299","target":"542","id":"7380","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"67","target":"497","id":"3021","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"311","target":"707","id":"7555","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"157","target":"301","id":"4928","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"67","target":"302","id":"3019","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"262","target":"362","id":"6776","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"53","target":"198","id":"2674","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"161","target":"715","id":"5013","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"6","target":"470","id":"1592","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"580","target":"703","id":"10246","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"422","target":"622","id":"8939","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"91","target":"544","id":"3570","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"50","target":"572","id":"2624","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"66","target":"253","id":"2997","attributes":{"Weight":"1.0"},"color":"rgb(148,132,164)","size":1.0},{"source":"192","target":"599","id":"5594","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"62","target":"265","id":"2908","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"138","target":"664","id":"4530","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"350","target":"566","id":"8082","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"179","target":"667","id":"5364","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"93","target":"652","id":"3615","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"52","target":"367","id":"2655","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"70","target":"212","id":"3086","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"454","target":"498","id":"9297","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"725","target":"734","id":"10683","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"69","target":"491","id":"3071","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"390","target":"395","id":"8566","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"423","target":"660","id":"8947","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"15","target":"722","id":"1820","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"497","target":"524","id":"9679","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"420","target":"627","id":"8911","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"5","target":"583","id":"1575","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"223","target":"445","id":"6138","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"322","target":"671","id":"7704","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"22","target":"641","id":"1972","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"347","target":"520","id":"8041","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"98","target":"700","id":"3723","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"143","target":"263","id":"4630","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"607","target":"634","id":"10359","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"430","target":"607","id":"9034","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"85","target":"224","id":"3412","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"262","target":"445","id":"6777","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"379","target":"587","id":"8414","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"459","target":"686","id":"9356","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"24","target":"51","id":"2000","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"379","target":"500","id":"8410","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"452","target":"675","id":"9281","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"30","target":"228","id":"2150","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"120","target":"236","id":"4155","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"72","target":"115","id":"3130","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"175","target":"187","id":"5263","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"144","target":"460","id":"4662","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"220","target":"437","id":"6084","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"283","target":"399","id":"7125","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"408","target":"685","id":"8787","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"44","target":"203","id":"2464","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"186","target":"305","id":"5483","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"178","target":"329","id":"5330","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"120","target":"710","id":"4169","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"175","target":"299","id":"5265","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"154","target":"349","id":"4869","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"95","target":"727","id":"3663","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"139","target":"398","id":"4542","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"193","target":"264","id":"5596","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"195","target":"296","id":"5638","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"367","target":"536","id":"8258","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"207","target":"484","id":"5866","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"311","target":"612","id":"7548","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"91","target":"126","id":"3555","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"233","target":"280","id":"6296","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"22","target":"25","id":"1959","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"443","target":"644","id":"9204","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"421","target":"604","id":"8926","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"353","target":"710","id":"8123","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"101","target":"362","id":"3777","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"33","target":"239","id":"2221","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"215","target":"271","id":"5988","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"562","target":"565","id":"10116","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"60","target":"186","id":"2838","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"379","target":"691","id":"8417","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"238","target":"616","id":"6382","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"491","target":"521","id":"9622","attributes":{"Weight":"1.0"},"color":"rgb(148,83,229)","size":1.0},{"source":"332","target":"428","id":"7843","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"372","target":"718","id":"8319","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"50","target":"349","id":"2614","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"707","target":"726","id":"10669","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"650","target":"651","id":"10545","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"236","target":"353","id":"6345","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"119","target":"588","id":"4146","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"35","target":"137","id":"2269","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"330","target":"377","id":"7811","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"187","target":"455","id":"5501","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"256","target":"317","id":"6667","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"123","target":"622","id":"4226","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"231","target":"547","id":"6268","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"635","target":"688","id":"10476","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"130","target":"366","id":"4356","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"172","target":"386","id":"5215","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"300","target":"662","id":"7398","attributes":{"Weight":"1.0"},"color":"rgb(99,99,229)","size":1.0},{"source":"96","target":"554","id":"3680","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"343","target":"360","id":"7993","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"415","target":"668","id":"8853","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"286","target":"333","id":"7167","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"115","target":"403","id":"4055","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"462","target":"487","id":"9383","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"280","target":"287","id":"7055","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"38","target":"240","id":"2339","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"162","target":"692","id":"5035","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"319","target":"555","id":"7666","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"565","target":"594","id":"10133","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"28","target":"337","id":"2104","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"608","target":"642","id":"10362","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"64","target":"416","id":"2967","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"1","target":"582","id":"1480","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"172","target":"311","id":"5213","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"227","target":"629","id":"6211","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"384","target":"527","id":"8488","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"63","target":"160","id":"2926","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"109","target":"152","id":"3911","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"283","target":"731","id":"7136","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"388","target":"506","id":"8548","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"597","target":"649","id":"10315","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"584","target":"666","id":"10262","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"140","target":"311","id":"4560","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"80","target":"139","id":"3305","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"107","target":"420","id":"3881","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"102","target":"236","id":"3789","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"135","target":"145","id":"4450","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"160","target":"161","id":"4980","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"219","target":"369","id":"6071","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"42","target":"286","id":"2421","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"203","target":"498","id":"5794","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"472","target":"604","id":"9485","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"251","target":"400","id":"6585","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"381","target":"543","id":"8439","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"350","target":"496","id":"8079","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"189","target":"445","id":"5541","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"195","target":"655","id":"5651","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"381","target":"421","id":"8429","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"371","target":"646","id":"8304","attributes":{"Weight":"1.0"},"color":"rgb(148,83,213)","size":1.0},{"source":"319","target":"368","id":"7656","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"268","target":"405","id":"6873","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"162","target":"661","id":"5032","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"297","target":"639","id":"7347","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"580","target":"652","id":"10245","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"92","target":"98","id":"3574","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"250","target":"696","id":"6579","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"76","target":"498","id":"3226","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"533","target":"662","id":"9964","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"438","target":"689","id":"9133","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"365","target":"476","id":"8234","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"264","target":"650","id":"6808","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"378","target":"488","id":"8397","attributes":{"Weight":"1.0"},"color":"rgb(148,180,148)","size":1.0},{"source":"253","target":"558","id":"6626","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"452","target":"482","id":"9276","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"47","target":"251","id":"2544","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"155","target":"685","id":"4904","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"320","target":"354","id":"7675","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"346","target":"520","id":"8031","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"19","target":"46","id":"1888","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"515","target":"541","id":"9809","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"333","target":"652","id":"7866","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"102","target":"368","id":"3795","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"215","target":"610","id":"5997","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"109","target":"448","id":"3920","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"104","target":"355","id":"3832","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"44","target":"611","id":"2483","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"54","target":"424","id":"2706","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"97","target":"218","id":"3688","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"109","target":"163","id":"3912","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"85","target":"187","id":"3411","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"497","target":"688","id":"9686","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"121","target":"165","id":"4172","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"122","target":"611","id":"4205","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"35","target":"247","id":"2271","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"619","target":"703","id":"10411","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"25","target":"158","id":"2020","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"432","target":"698","id":"9067","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"332","target":"619","id":"7851","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"64","target":"483","id":"2970","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"397","target":"572","id":"8656","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"18","target":"272","id":"1871","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"10","target":"366","id":"1696","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"44","target":"517","id":"2478","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"88","target":"721","id":"3510","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"308","target":"576","id":"7506","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"570","target":"598","id":"10164","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"320","target":"445","id":"7679","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"200","target":"593","id":"5743","attributes":{"Weight":"1.0"},"color":"rgb(148,196,83)","size":1.0},{"source":"55","target":"157","id":"2726","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"54","target":"131","id":"2692","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"154","target":"555","id":"4874","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"155","target":"397","id":"4896","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"271","target":"692","id":"6930","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"334","target":"429","id":"7873","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"22","target":"48","id":"1960","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"275","target":"295","id":"6974","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"241","target":"596","id":"6422","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"136","target":"550","id":"4493","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"128","target":"163","id":"4307","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"280","target":"586","id":"7068","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"93","target":"580","id":"3610","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"111","target":"719","id":"3984","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"372","target":"536","id":"8313","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"360","target":"550","id":"8187","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"45","target":"404","id":"2502","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"43","target":"520","id":"2451","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"125","target":"422","id":"4255","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"84","target":"217","id":"3393","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"475","target":"623","id":"9520","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"553","target":"621","id":"10071","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"130","target":"457","id":"4361","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"1","target":"195","id":"1468","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"400","target":"656","id":"8702","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"371","target":"591","id":"8299","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"69","target":"193","id":"3057","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"294","target":"572","id":"7303","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"579","target":"593","id":"10236","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"69","target":"730","id":"3081","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"111","target":"572","id":"3979","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"72","target":"383","id":"3138","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"28","target":"533","id":"2114","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"41","target":"78","id":"2395","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"159","target":"302","id":"4965","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"430","target":"486","id":"9031","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"308","target":"434","id":"7502","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"27","target":"583","id":"2079","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"395","target":"413","id":"8636","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"721","target":"723","id":"10675","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"128","target":"378","id":"4313","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"251","target":"402","id":"6587","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"274","target":"585","id":"6968","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"597","target":"691","id":"10316","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"11","target":"347","id":"1716","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"352","target":"486","id":"8108","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"386","target":"575","id":"8523","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"5","target":"616","id":"1577","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"50","target":"629","id":"2626","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"215","target":"453","id":"5992","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"131","target":"286","id":"4374","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"238","target":"258","id":"6368","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"67","target":"636","id":"3027","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"2","target":"181","id":"1495","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"128","target":"448","id":"4315","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"281","target":"465","id":"7081","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"424","target":"537","id":"8956","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"185","target":"226","id":"5459","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"231","target":"238","id":"6259","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"243","target":"733","id":"6458","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"575","target":"603","id":"10204","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"143","target":"444","id":"4637","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"496","target":"606","id":"9671","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"5","target":"491","id":"1571","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"109","target":"588","id":"3925","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"365","target":"375","id":"8231","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"342","target":"587","id":"7985","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"272","target":"664","id":"6944","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"140","target":"707","id":"4584","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"195","target":"494","id":"5643","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"91","target":"375","id":"3564","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"612","target":"616","id":"10381","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"673","target":"714","id":"10614","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"473","target":"565","id":"9496","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"374","target":"678","id":"8348","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"243","target":"640","id":"6452","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"218","target":"526","id":"6057","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"203","target":"385","id":"5788","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"349","target":"489","id":"8067","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"477","target":"620","id":"9535","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"329","target":"351","id":"7795","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"109","target":"343","id":"3916","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"65","target":"138","id":"2976","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"250","target":"255","id":"6562","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"259","target":"379","id":"6715","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"288","target":"522","id":"7206","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"134","target":"406","id":"4442","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"169","target":"652","id":"5168","attributes":{"Weight":"1.0"},"color":"rgb(148,196,67)","size":1.0},{"source":"373","target":"572","id":"8322","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"85","target":"717","id":"3430","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"180","target":"332","id":"5374","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"163","target":"712","id":"5054","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"333","target":"619","id":"7865","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"324","target":"595","id":"7728","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"43","target":"709","id":"2457","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"238","target":"576","id":"6378","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"85","target":"331","id":"3418","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"225","target":"645","id":"6181","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"342","target":"706","id":"7991","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"84","target":"705","id":"3405","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"185","target":"240","id":"5460","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"400","target":"696","id":"8706","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"343","target":"727","id":"8004","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"131","target":"601","id":"4388","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"15","target":"655","id":"1819","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"154","target":"642","id":"4879","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"230","target":"445","id":"6254","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"559","target":"658","id":"10108","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"467","target":"584","id":"9432","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"97","target":"722","id":"3704","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"9","target":"120","id":"1663","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"288","target":"604","id":"7216","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"536","target":"609","id":"9982","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"114","target":"127","id":"4022","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"14","target":"363","id":"1784","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"169","target":"509","id":"5161","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"209","target":"262","id":"5889","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"294","target":"371","id":"7295","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"303","target":"573","id":"7440","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"573","target":"611","id":"10187","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"288","target":"565","id":"7212","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"576","target":"603","id":"10211","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"261","target":"419","id":"6757","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"359","target":"607","id":"8177","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"273","target":"284","id":"6947","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"75","target":"649","id":"3210","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"418","target":"585","id":"8886","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"46","target":"452","id":"2532","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"37","target":"321","id":"2315","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"268","target":"559","id":"6878","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"144","target":"713","id":"4673","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"470","target":"620","id":"9464","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"261","target":"319","id":"6754","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"265","target":"513","id":"6825","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"209","target":"362","id":"5894","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"137","target":"204","id":"4500","attributes":{"Weight":"1.0"},"color":"rgb(99,213,148)","size":1.0},{"source":"77","target":"81","id":"3241","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"327","target":"385","id":"7760","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"10","target":"554","id":"1700","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"37","target":"627","id":"2324","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"125","target":"461","id":"4259","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"123","target":"291","id":"4216","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"7","target":"602","id":"1617","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"9","target":"552","id":"1679","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"111","target":"154","id":"3961","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"244","target":"338","id":"6461","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"506","target":"550","id":"9752","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"296","target":"585","id":"7332","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"227","target":"231","id":"6195","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"292","target":"568","id":"7275","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"534","target":"613","id":"9968","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"15","target":"605","id":"1817","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"115","target":"200","id":"4049","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"128","target":"343","id":"4311","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"69","target":"337","id":"3062","attributes":{"Weight":"1.0"},"color":"rgb(67,116,229)","size":1.0},{"source":"222","target":"548","id":"6126","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"324","target":"429","id":"7723","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"198","target":"636","id":"5708","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"236","target":"334","id":"6344","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"432","target":"571","id":"9060","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"28","target":"84","id":"2091","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"418","target":"435","id":"8879","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"305","target":"710","id":"7473","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"132","target":"207","id":"4398","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"300","target":"455","id":"7390","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"177","target":"591","id":"5318","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"85","target":"145","id":"3408","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"1","target":"15","id":"1464","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"168","target":"531","id":"5141","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"549","target":"609","id":"10056","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"203","target":"327","id":"5786","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"345","target":"566","id":"8018","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"339","target":"690","id":"7948","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"281","target":"382","id":"7078","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"65","target":"437","id":"2985","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"589","target":"623","id":"10281","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"383","target":"691","id":"8480","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"440","target":"589","id":"9159","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"43","target":"503","id":"2450","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"333","target":"571","id":"7859","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"341","target":"406","id":"7967","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"375","target":"530","id":"8357","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"47","target":"660","id":"2560","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"76","target":"381","id":"3218","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"150","target":"606","id":"4796","attributes":{"Weight":"1.0"},"color":"rgb(213,67,213)","size":1.0},{"source":"108","target":"296","id":"3894","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"55","target":"432","id":"2734","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"258","target":"668","id":"6710","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"434","target":"583","id":"9090","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"38","target":"486","id":"2347","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"371","target":"643","id":"8302","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"27","target":"434","id":"2073","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"183","target":"308","id":"5420","attributes":{"Weight":"1.0"},"color":"rgb(99,229,99)","size":1.0},{"source":"336","target":"360","id":"7898","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"286","target":"619","id":"7176","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"573","target":"577","id":"10186","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"131","target":"381","id":"4378","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"43","target":"387","id":"2446","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"313","target":"471","id":"7572","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"124","target":"484","id":"4245","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"98","target":"178","id":"3706","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"185","target":"449","id":"5465","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"415","target":"713","id":"8855","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"40","target":"306","id":"2383","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"435","target":"585","id":"9101","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"92","target":"372","id":"3582","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"473","target":"589","id":"9497","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"135","target":"699","id":"4478","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"244","target":"350","id":"6463","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"87","target":"381","id":"3459","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"143","target":"299","id":"4631","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"84","target":"626","id":"3402","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"249","target":"482","id":"6553","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"519","target":"631","id":"9845","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"484","target":"701","id":"9574","attributes":{"Weight":"1.0"},"color":"rgb(148,99,148)","size":1.0},{"source":"437","target":"664","id":"9121","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"408","target":"679","id":"8786","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"171","target":"613","id":"5206","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"180","target":"716","id":"5387","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"396","target":"633","id":"8650","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"312","target":"688","id":"7565","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"323","target":"431","id":"7709","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"329","target":"492","id":"7802","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"436","target":"586","id":"9112","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"270","target":"524","id":"6908","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"129","target":"226","id":"4333","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"33","target":"529","id":"2239","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"424","target":"600","id":"8958","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"150","target":"646","id":"4800","attributes":{"Weight":"1.0"},"color":"rgb(148,83,213)","size":1.0},{"source":"409","target":"425","id":"8790","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"62","target":"90","id":"2900","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"230","target":"354","id":"6251","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"547","target":"627","id":"10048","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"273","target":"389","id":"6951","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"89","target":"639","id":"3528","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"285","target":"466","id":"7152","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"398","target":"474","id":"8667","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"25","target":"732","id":"2033","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"657","target":"726","id":"10579","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"319","target":"450","id":"7660","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"146","target":"326","id":"4710","attributes":{"Weight":"1.0"},"color":"rgb(83,180,148)","size":1.0},{"source":"44","target":"385","id":"2471","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"161","target":"257","id":"5000","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"137","target":"389","id":"4507","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"186","target":"548","id":"5491","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"385","target":"454","id":"8502","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"82","target":"611","id":"3362","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"455","target":"539","id":"9311","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"372","target":"615","id":"8317","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"92","target":"329","id":"3579","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"265","target":"476","id":"6823","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"316","target":"454","id":"7613","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"121","target":"226","id":"4178","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"176","target":"178","id":"5282","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"647","target":"729","id":"10535","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"402","target":"694","id":"8728","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"329","target":"426","id":"7798","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"227","target":"294","id":"6198","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"164","target":"644","id":"5071","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"287","target":"450","id":"7184","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"113","target":"146","id":"4005","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"164","target":"373","id":"5064","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"401","target":"410","id":"8708","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"363","target":"383","id":"8203","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"90","target":"502","id":"3547","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"33","target":"101","id":"2209","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"409","target":"523","id":"8798","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"21","target":"732","id":"1955","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"215","target":"445","id":"5991","attributes":{"Weight":"1.0"},"color":"rgb(196,180,67)","size":1.0},{"source":"521","target":"523","id":"9853","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"438","target":"441","id":"9124","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"125","target":"416","id":"4254","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"591","target":"720","id":"10295","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"485","target":"638","id":"9578","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"251","target":"545","id":"6590","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"330","target":"390","id":"7812","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"177","target":"685","id":"5325","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"516","target":"636","id":"9817","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"225","target":"642","id":"6180","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"288","target":"562","id":"7211","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"379","target":"383","id":"8408","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"520","target":"670","id":"9851","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"439","target":"540","id":"9140","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"196","target":"523","id":"5667","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"539","target":"698","id":"10006","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"628","target":"709","id":"10448","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"210","target":"662","id":"5910","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"104","target":"510","id":"3836","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"137","target":"192","id":"4499","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"19","target":"370","id":"1899","attributes":{"Weight":"1.0"},"color":"rgb(132,148,148)","size":1.0},{"source":"212","target":"424","id":"5939","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"275","target":"509","id":"6983","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"500","target":"597","id":"9709","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"331","target":"676","id":"7839","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"94","target":"606","id":"3633","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"271","target":"723","id":"6933","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"667","target":"685","id":"10604","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"95","target":"336","id":"3648","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"201","target":"489","id":"5759","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"260","target":"572","id":"6739","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"116","target":"434","id":"4080","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"381","target":"644","id":"8447","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"442","target":"623","id":"9191","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"84","target":"662","id":"3404","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"52","target":"609","id":"2665","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"424","target":"451","id":"8952","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"35","target":"78","id":"2268","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"279","target":"591","id":"7050","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"303","target":"583","id":"7443","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"318","target":"357","id":"7638","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"16","target":"540","id":"1834","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"355","target":"592","id":"8137","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"110","target":"238","id":"3938","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"95","target":"152","id":"3643","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"274","target":"519","id":"6964","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"522","target":"685","id":"9873","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"136","target":"727","id":"4498","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"93","target":"333","id":"3604","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"611","target":"648","id":"10377","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"88","target":"572","id":"3499","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"460","target":"528","id":"9359","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"433","target":"442","id":"9069","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"54","target":"487","id":"2712","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"21","target":"540","id":"1948","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"142","target":"444","id":"4614","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"254","target":"423","id":"6638","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"649","target":"702","id":"10543","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"79","target":"721","id":"3303","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"529","target":"720","id":"9943","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"227","target":"238","id":"6196","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"510","target":"546","id":"9782","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"491","target":"730","id":"9632","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"88","target":"661","id":"3505","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"35","target":"66","id":"2267","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"403","target":"587","id":"8734","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"181","target":"304","id":"5390","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"147","target":"469","id":"4731","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"294","target":"432","id":"7299","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"303","target":"308","id":"7431","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"103","target":"169","id":"3805","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"159","target":"160","id":"4959","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"167","target":"634","id":"5128","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"233","target":"289","id":"6297","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"621","target":"726","id":"10422","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"40","target":"192","id":"2379","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"252","target":"622","id":"6612","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"255","target":"557","id":"6656","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"393","target":"395","id":"8608","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"127","target":"474","id":"4293","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"335","target":"583","id":"7888","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"142","target":"143","id":"4604","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"119","target":"343","id":"4137","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"184","target":"684","id":"5453","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"493","target":"624","id":"9650","attributes":{"Weight":"1.0"},"color":"rgb(99,115,229)","size":1.0},{"source":"433","target":"454","id":"9070","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"219","target":"366","id":"6070","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"545","target":"722","id":"10042","attributes":{"Weight":"1.0"},"color":"rgb(148,115,164)","size":1.0},{"source":"320","target":"484","id":"7681","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"401","target":"674","id":"8716","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"64","target":"230","id":"2956","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"138","target":"709","id":"4532","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"211","target":"645","id":"5931","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"133","target":"507","id":"4425","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"418","target":"655","id":"8889","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"351","target":"536","id":"8096","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"340","target":"520","id":"7959","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"231","target":"348","id":"6265","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"577","target":"623","id":"10219","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"403","target":"574","id":"8733","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"20","target":"134","id":"1915","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"472","target":"649","id":"9486","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"311","target":"567","id":"7547","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"40","target":"599","id":"2392","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"203","target":"656","id":"5803","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"453","target":"665","id":"9288","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"340","target":"664","id":"7962","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"534","target":"673","id":"9971","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"220","target":"346","id":"6080","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"326","target":"365","id":"7748","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"418","target":"493","id":"8880","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"203","target":"573","id":"5797","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"524","target":"633","id":"9886","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"95","target":"378","id":"3651","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"465","target":"725","id":"9413","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"355","target":"581","id":"8136","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"164","target":"227","id":"5057","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"374","target":"648","id":"8347","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"121","target":"168","id":"4175","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"24","target":"120","id":"2001","attributes":{"Weight":"1.0"},"color":"rgb(229,67,99)","size":1.0},{"source":"606","target":"713","id":"10357","attributes":{"Weight":"1.0"},"color":"rgb(132,148,180)","size":1.0},{"source":"340","target":"628","id":"7961","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"606","target":"613","id":"10352","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"305","target":"368","id":"7466","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"648","target":"687","id":"10540","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"343","target":"506","id":"7998","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"207","target":"483","id":"5865","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"190","target":"505","id":"5560","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"150","target":"643","id":"4798","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"48","target":"292","id":"2568","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"483","target":"565","id":"9571","attributes":{"Weight":"1.0"},"color":"rgb(229,99,148)","size":1.0},{"source":"122","target":"327","id":"4193","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"647","target":"651","id":"10531","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"496","target":"507","id":"9668","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"43","target":"118","id":"2438","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"112","target":"132","id":"3987","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"279","target":"431","id":"7041","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"114","target":"523","id":"4035","attributes":{"Weight":"1.0"},"color":"rgb(196,67,229)","size":1.0},{"source":"461","target":"711","id":"9382","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"183","target":"524","id":"5426","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"278","target":"321","id":"7023","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"647","target":"689","id":"10532","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"547","target":"699","id":"10050","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"366","target":"701","id":"8251","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"215","target":"692","id":"6002","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"11","target":"437","id":"1719","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"186","target":"228","id":"5480","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"32","target":"47","id":"2185","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"411","target":"731","id":"8827","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"17","target":"295","id":"1853","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"588","target":"617","id":"10276","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"91","target":"134","id":"3556","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"9","target":"305","id":"1670","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"565","target":"661","id":"10135","attributes":{"Weight":"1.0"},"color":"rgb(196,148,148)","size":1.0},{"source":"44","target":"227","id":"2465","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"57","target":"421","id":"2775","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"566","target":"714","id":"10143","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"522","target":"707","id":"9874","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"4","target":"220","id":"1539","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"233","target":"586","id":"6308","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"212","target":"425","id":"5940","attributes":{"Weight":"1.0"},"color":"rgb(148,148,229)","size":1.0},{"source":"440","target":"654","id":"9162","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"612","target":"654","id":"10383","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"426","target":"615","id":"8990","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"371","target":"373","id":"8291","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"37","target":"488","id":"2319","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"279","target":"490","id":"7044","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"155","target":"719","id":"4905","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"63","target":"697","id":"2943","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"260","target":"578","id":"6740","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"115","target":"649","id":"4062","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"227","target":"245","id":"6197","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"124","target":"483","id":"4244","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"431","target":"529","id":"9043","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"137","target":"247","id":"4501","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"7","target":"266","id":"1607","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"301","target":"539","id":"7409","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"98","target":"615","id":"3722","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"494","target":"655","id":"9661","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"140","target":"177","id":"4558","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"90","target":"513","id":"3548","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"216","target":"332","id":"6009","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"258","target":"603","id":"6707","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"392","target":"731","id":"8606","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"518","target":"680","id":"9838","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"127","target":"297","id":"4290","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"39","target":"185","id":"2361","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"299","target":"431","id":"7372","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"262","target":"361","id":"6775","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"100","target":"366","id":"3754","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"57","target":"425","id":"2776","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"244","target":"673","id":"6474","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"227","target":"717","id":"6214","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"313","target":"458","id":"7568","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"141","target":"449","id":"4595","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"84","target":"146","id":"3390","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"209","target":"223","id":"5886","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"394","target":"405","id":"8622","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"390","target":"559","id":"8573","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"6","target":"471","id":"1593","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"321","target":"340","id":"7685","attributes":{"Weight":"1.0"},"color":"rgb(67,180,213)","size":1.0},{"source":"208","target":"298","id":"5868","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"97","target":"494","id":"3695","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"204","target":"312","id":"5808","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"204","target":"633","id":"5813","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"609","target":"718","id":"10367","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"708","target":"732","id":"10670","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"181","target":"554","id":"5396","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"46","target":"478","id":"2534","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"441","target":"689","id":"9174","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"335","target":"668","id":"7892","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"188","target":"333","id":"5515","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"408","target":"527","id":"8779","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"64","target":"214","id":"2954","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"597","target":"706","id":"10318","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"91","target":"513","id":"3568","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"83","target":"217","id":"3375","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"196","target":"663","id":"5676","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"499","target":"710","id":"9704","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"562","target":"663","id":"10123","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"509","target":"581","id":"9780","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"302","target":"714","id":"7429","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"380","target":"666","id":"8427","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"271","target":"578","id":"6922","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"600","target":"631","id":"10323","attributes":{"Weight":"1.0"},"color":"rgb(67,196,229)","size":1.0},{"source":"414","target":"560","id":"8842","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"73","target":"684","id":"3165","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"165","target":"167","id":"5077","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"100","target":"106","id":"3746","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"344","target":"361","id":"8006","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"239","target":"362","id":"6392","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"46","target":"64","id":"2519","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"88","target":"260","id":"3488","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"78","target":"284","id":"3265","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"50","target":"529","id":"2622","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"238","target":"575","id":"6377","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"521","target":"728","id":"9862","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"509","target":"510","id":"9777","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"12","target":"70","id":"1730","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"224","target":"289","id":"6145","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"557","target":"656","id":"10096","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"33","target":"223","id":"2219","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"354","target":"445","id":"8126","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"16","target":"48","id":"1826","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"532","target":"612","id":"9951","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"235","target":"236","id":"6329","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"38","target":"607","id":"2351","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"152","target":"727","id":"4845","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"236","target":"548","id":"6350","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"476","target":"683","id":"9530","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"304","target":"672","id":"7461","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"322","target":"485","id":"7697","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"180","target":"618","id":"5383","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"213","target":"544","id":"5967","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"354","target":"512","id":"8129","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"33","target":"512","id":"2238","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"208","target":"310","id":"5870","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"266","target":"721","id":"6844","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"111","target":"629","id":"3981","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"555","target":"726","id":"10087","attributes":{"Weight":"1.0"},"color":"rgb(115,148,229)","size":1.0},{"source":"120","target":"334","id":"4159","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"61","target":"338","id":"2877","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"93","target":"593","id":"3611","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"213","target":"375","id":"5961","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"150","target":"528","id":"4790","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"409","target":"421","id":"8789","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"416","target":"478","id":"8861","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"356","target":"656","id":"8147","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"338","target":"659","id":"7934","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"115","target":"597","id":"4061","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"413","target":"658","id":"8839","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"238","target":"603","id":"6381","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"406","target":"502","id":"8763","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"404","target":"670","id":"8751","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"397","target":"643","id":"8659","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"299","target":"469","id":"7376","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"190","target":"403","id":"5558","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"414","target":"559","id":"8841","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"27","target":"629","id":"2082","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"42","target":"211","id":"2418","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"539","target":"624","id":"10003","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"30","target":"548","id":"2161","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"103","target":"256","id":"3807","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"91","target":"117","id":"3554","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"52","target":"98","id":"2648","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"36","target":"598","id":"2302","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"356","target":"558","id":"8146","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"338","target":"396","id":"7926","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"453","target":"692","id":"9290","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"155","target":"294","id":"4890","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"398","target":"553","id":"8669","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"222","target":"305","id":"6118","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"649","target":"706","id":"10544","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"640","target":"641","id":"10499","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"11","target":"590","id":"1723","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"24","target":"293","id":"2006","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"44","target":"687","id":"2489","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"178","target":"615","id":"5343","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"434","target":"491","id":"9086","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"641","target":"708","id":"10507","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"620","target":"686","id":"10414","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"385","target":"480","id":"8504","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"30","target":"222","id":"2149","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"75","target":"115","id":"3194","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"226","target":"359","id":"6185","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"227","target":"627","id":"6210","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"181","target":"701","id":"5399","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"93","target":"277","id":"3601","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"441","target":"729","id":"9177","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"410","target":"556","id":"8812","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"351","target":"492","id":"8095","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"398","target":"430","id":"8665","attributes":{"Weight":"1.0"},"color":"rgb(196,132,148)","size":1.0},{"source":"88","target":"596","id":"3502","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"49","target":"198","id":"2583","attributes":{"Weight":"1.0"},"color":"rgb(99,229,67)","size":1.0},{"source":"430","target":"531","id":"9032","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"419","target":"643","id":"8904","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"328","target":"492","id":"7786","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"111","target":"371","id":"3971","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"229","target":"509","id":"6241","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"469","target":"698","id":"9456","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"135","target":"376","id":"4463","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"70","target":"462","id":"3098","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"272","target":"709","id":"6946","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"434","target":"575","id":"9088","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"261","target":"287","id":"6753","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"224","target":"331","id":"6148","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"123","target":"422","id":"4218","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"176","target":"372","id":"5288","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"134","target":"213","id":"4435","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"5","target":"521","id":"1572","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"402","target":"556","id":"8722","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"416","target":"422","id":"8856","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"182","target":"278","id":"5402","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"346","target":"503","id":"8030","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"113","target":"210","id":"4007","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"300","target":"624","id":"7396","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"623","target":"678","id":"10428","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"394","target":"413","id":"8625","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"114","target":"639","id":"4040","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"326","target":"681","id":"7756","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"172","target":"677","id":"5227","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"13","target":"380","id":"1764","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"246","target":"715","id":"6513","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"151","target":"280","id":"4811","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"360","target":"712","id":"8191","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"197","target":"351","id":"5683","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"88","target":"504","id":"3498","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"68","target":"516","id":"3043","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"275","target":"510","id":"6984","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"151","target":"279","id":"4810","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"146","target":"278","id":"4707","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"79","target":"433","id":"3287","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"145","target":"327","id":"4682","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"170","target":"557","id":"5183","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"21","target":"428","id":"1945","attributes":{"Weight":"1.0"},"color":"rgb(229,115,67)","size":1.0},{"source":"63","target":"398","id":"2933","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"203","target":"648","id":"5802","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"24","target":"640","id":"2010","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"46","target":"447","id":"2530","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"19","target":"675","id":"1909","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"475","target":"577","id":"9517","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"106","target":"554","id":"3868","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"298","target":"686","id":"7368","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"118","target":"503","id":"4122","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"232","target":"254","id":"6280","attributes":{"Weight":"1.0"},"color":"rgb(148,148,116)","size":1.0},{"source":"470","target":"515","id":"9461","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"231","target":"303","id":"6261","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"438","target":"651","id":"9131","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"155","target":"166","id":"4887","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"469","target":"631","id":"9453","attributes":{"Weight":"1.0"},"color":"rgb(99,115,229)","size":1.0},{"source":"394","target":"395","id":"8620","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"462","target":"726","id":"9390","attributes":{"Weight":"1.0"},"color":"rgb(115,148,229)","size":1.0},{"source":"344","target":"362","id":"8007","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"192","target":"306","id":"5585","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"566","target":"606","id":"10138","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"299","target":"300","id":"7369","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"461","target":"565","id":"9378","attributes":{"Weight":"1.0"},"color":"rgb(229,132,148)","size":1.0},{"source":"27","target":"668","id":"2083","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"33","target":"483","id":"2235","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"275","target":"276","id":"6973","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"307","target":"310","id":"7484","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"461","target":"483","id":"9375","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"287","target":"555","id":"7189","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"300","target":"535","id":"7393","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"238","target":"586","id":"6380","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"307","target":"470","id":"7489","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"135","target":"323","id":"4459","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"89","target":"657","id":"3529","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"342","target":"586","id":"7984","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"367","target":"718","id":"8264","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"107","target":"533","id":"3883","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"110","target":"644","id":"3955","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"39","target":"166","id":"2358","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"119","target":"206","id":"4134","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"342","target":"379","id":"7976","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"187","target":"624","id":"5507","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"384","target":"460","id":"8486","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"22","target":"695","id":"1973","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"216","target":"580","id":"6018","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"151","target":"224","id":"4805","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"445","target":"512","id":"9221","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"28","target":"529","id":"2113","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"20","target":"156","id":"1916","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"145","target":"529","id":"4693","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"92","target":"609","id":"3591","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"46","target":"483","id":"2537","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"424","target":"517","id":"8955","attributes":{"Weight":"1.0"},"color":"rgb(67,229,196)","size":1.0},{"source":"9","target":"499","id":"1677","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"271","target":"596","id":"6923","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"477","target":"479","id":"9531","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"130","target":"672","id":"4368","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"212","target":"451","id":"5943","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"315","target":"495","id":"7600","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"170","target":"410","id":"5179","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"629","target":"720","id":"10453","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"268","target":"269","id":"6861","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"558","target":"656","id":"10101","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"26","target":"249","id":"2043","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"269","target":"412","id":"6896","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"35","target":"666","id":"2284","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"1","target":"205","id":"1469","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"303","target":"576","id":"7442","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"69","target":"264","id":"3058","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"284","target":"598","id":"7145","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"145","target":"443","id":"4689","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"37","target":"533","id":"2320","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"175","target":"300","id":"5266","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"245","target":"720","id":"6496","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"203","target":"687","id":"5805","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"253","target":"423","id":"6622","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"381","target":"425","id":"8430","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"114","target":"671","id":"4043","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"221","target":"608","id":"6111","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"316","target":"721","id":"7626","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"127","target":"398","id":"4292","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"243","target":"708","id":"6456","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"44","target":"327","id":"2468","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"199","target":"590","id":"5726","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"601","target":"655","id":"10330","attributes":{"Weight":"1.0"},"color":"rgb(148,164,148)","size":1.0},{"source":"127","target":"553","id":"4295","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"277","target":"537","id":"7012","attributes":{"Weight":"1.0"},"color":"rgb(148,196,83)","size":1.0},{"source":"13","target":"666","id":"1772","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"297","target":"657","id":"7348","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"197","target":"464","id":"5689","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"50","target":"373","id":"2617","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"488","target":"627","id":"9599","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"583","target":"654","id":"10256","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"99","target":"105","id":"3726","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"61","target":"316","id":"2874","attributes":{"Weight":"1.0"},"color":"rgb(213,67,213)","size":1.0},{"source":"47","target":"402","id":"2552","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"502","target":"513","id":"9721","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"71","target":"321","id":"3117","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"571","target":"716","id":"10177","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"590","target":"628","id":"10286","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"36","target":"192","id":"2290","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"60","target":"102","id":"2833","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"297","target":"474","id":"7341","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"131","target":"719","id":"4396","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"322","target":"621","id":"7699","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"409","target":"663","id":"8807","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"678","target":"721","id":"10626","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"3","target":"461","id":"1525","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"198","target":"497","id":"5702","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"123","target":"558","id":"4225","attributes":{"Weight":"1.0"},"color":"rgb(213,148,83)","size":1.0},{"source":"62","target":"530","id":"2917","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"140","target":"527","id":"4572","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"162","target":"602","id":"5030","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"473","target":"543","id":"9494","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"170","target":"250","id":"5170","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"419","target":"429","id":"8892","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"702","target":"706","id":"10664","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"454","target":"721","id":"9307","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"142","target":"660","id":"4623","attributes":{"Weight":"1.0"},"color":"rgb(180,67,164)","size":1.0},{"source":"467","target":"598","id":"9433","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"117","target":"213","id":"4096","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"218","target":"418","id":"6050","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"20","target":"341","id":"1921","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"363","target":"505","id":"8207","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"214","target":"262","id":"5974","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"114","target":"715","id":"4045","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"158","target":"733","id":"4958","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"417","target":"566","id":"8872","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"451","target":"600","id":"9270","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"38","target":"191","id":"2337","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"576","target":"668","id":"10215","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"137","target":"467","id":"4508","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"136","target":"163","id":"4482","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"646","target":"713","id":"10523","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"149","target":"345","id":"4763","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"524","target":"538","id":"9885","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"690","target":"723","id":"10648","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"151","target":"376","id":"4816","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"116","target":"668","id":"4091","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"110","target":"586","id":"3950","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"80","target":"434","id":"3317","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"234","target":"280","id":"6312","attributes":{"Weight":"1.0"},"color":"rgb(148,67,213)","size":1.0},{"source":"168","target":"191","id":"5131","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"20","target":"683","id":"1931","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"500","target":"706","id":"9713","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"130","target":"219","id":"4351","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"194","target":"505","id":"5626","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"17","target":"446","id":"1858","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"178","target":"197","id":"5328","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"261","target":"555","id":"6764","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"406","target":"476","id":"8762","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"47","target":"170","id":"2542","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"611","target":"656","id":"10378","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"196","target":"589","id":"5672","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"454","target":"648","id":"9304","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"67","target":"198","id":"3016","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"34","target":"592","id":"2263","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"224","target":"335","id":"6149","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"40","target":"315","id":"2384","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"528","target":"562","id":"9921","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"196","target":"543","id":"5669","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"101","target":"483","id":"3780","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"52","target":"700","id":"2667","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"157","target":"624","id":"4941","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"151","target":"179","id":"4804","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"228","target":"552","id":"6228","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"535","target":"653","id":"9977","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"20","target":"476","id":"1925","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"155","target":"245","id":"4889","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"494","target":"605","id":"9659","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"516","target":"524","id":"9813","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"501","target":"727","id":"9720","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"433","target":"648","id":"9082","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"365","target":"390","id":"8232","attributes":{"Weight":"1.0"},"color":"rgb(164,148,115)","size":1.0},{"source":"404","target":"503","id":"8744","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"4","target":"138","id":"1537","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"636","target":"697","id":"10482","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"503","target":"670","id":"9731","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"356","target":"696","id":"8151","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"615","target":"700","id":"10398","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"168","target":"607","id":"5143","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"320","target":"344","id":"7674","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"638","target":"671","id":"10490","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"40","target":"137","id":"2378","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"384","target":"677","id":"8495","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"295","target":"317","id":"7312","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"179","target":"311","id":"5349","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"245","target":"489","id":"6487","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"135","target":"547","id":"4472","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"78","target":"273","id":"3264","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"147","target":"514","id":"4732","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"384","target":"522","id":"8487","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"29","target":"208","id":"2126","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"60","target":"606","id":"2861","attributes":{"Weight":"1.0"},"color":"rgb(213,67,180)","size":1.0},{"source":"233","target":"376","id":"6300","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"635","target":"736","id":"10478","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"54","target":"381","id":"2704","attributes":{"Weight":"1.0"},"color":"rgb(148,148,229)","size":1.0},{"source":"171","target":"714","id":"5210","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"5","target":"575","id":"1573","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"112","target":"512","id":"4004","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"182","target":"420","id":"5406","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"69","target":"282","id":"3060","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"37","target":"545","id":"2321","attributes":{"Weight":"1.0"},"color":"rgb(148,99,164)","size":1.0},{"source":"363","target":"574","id":"8209","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"175","target":"624","id":"5278","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"40","target":"380","id":"2385","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"25","target":"439","id":"2025","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"39","target":"352","id":"2365","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"386","target":"532","id":"8522","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"449","target":"490","id":"9252","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"157","target":"187","id":"4923","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"78","target":"137","id":"3261","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"724","target":"729","id":"10677","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"211","target":"555","id":"5926","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"148","target":"477","id":"4750","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"253","target":"557","id":"6625","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"9","target":"429","id":"1675","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"252","target":"478","id":"6607","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"611","target":"687","id":"10380","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"421","target":"565","id":"8923","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"511","target":"593","id":"9790","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"279","target":"717","id":"7054","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"32","target":"250","id":"2187","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"93","target":"131","id":"3595","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"360","target":"563","id":"8188","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"404","target":"483","id":"8743","attributes":{"Weight":"1.0"},"color":"rgb(148,180,132)","size":1.0},{"source":"344","target":"483","id":"8009","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"13","target":"35","id":"1751","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"367","target":"609","id":"8261","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"442","target":"687","id":"9194","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"35","target":"599","id":"2283","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"557","target":"558","id":"10095","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"471","target":"686","id":"9475","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"156","target":"502","id":"4916","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"486","target":"531","id":"9585","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"68","target":"718","id":"3054","attributes":{"Weight":"1.0"},"color":"rgb(116,148,148)","size":1.0},{"source":"273","target":"467","id":"6952","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"269","target":"560","id":"6900","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"256","target":"446","id":"6671","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"631","target":"655","id":"10456","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"433","target":"611","id":"9078","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"226","target":"463","id":"6188","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"224","target":"699","id":"6163","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"135","target":"224","id":"4452","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"508","target":"521","id":"9767","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"197","target":"536","id":"5691","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"11","target":"346","id":"1715","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"259","target":"702","id":"6727","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"116","target":"371","id":"4078","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"220","target":"404","id":"6083","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"540","target":"732","id":"10013","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"174","target":"695","id":"5258","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"253","target":"400","id":"6618","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"316","target":"644","id":"7621","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"116","target":"308","id":"4074","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"71","target":"278","id":"3115","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"7","target":"453","id":"1611","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"352","target":"634","id":"8112","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"194","target":"649","id":"5631","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"376","target":"443","id":"8367","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"285","target":"734","id":"7163","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"290","target":"411","id":"7248","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"416","target":"449","id":"8858","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"374","target":"442","id":"8335","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"593","target":"619","id":"10298","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"257","target":"632","id":"6686","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"399","target":"488","id":"8687","attributes":{"Weight":"1.0"},"color":"rgb(148,99,196)","size":1.0},{"source":"409","target":"473","id":"8794","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"57","target":"562","id":"2784","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"50","target":"644","id":"2628","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"376","target":"567","id":"8372","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"208","target":"458","id":"5872","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"532","target":"540","id":"9950","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"389","target":"570","id":"8557","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"381","target":"521","id":"8437","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"183","target":"555","id":"5428","attributes":{"Weight":"1.0"},"color":"rgb(99,229,148)","size":1.0},{"source":"270","target":"688","id":"6915","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"381","target":"473","id":"8435","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"353","target":"368","id":"8116","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"38","target":"430","id":"2344","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"270","target":"538","id":"6909","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"452","target":"534","id":"9278","attributes":{"Weight":"1.0"},"color":"rgb(197,148,148)","size":1.0},{"source":"84","target":"107","id":"3388","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"258","target":"335","id":"6697","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"458","target":"620","id":"9343","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"270","target":"637","id":"6913","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"91","target":"502","id":"3567","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"13","target":"66","id":"1755","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"54","target":"608","id":"2717","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"361","target":"484","id":"8196","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"342","target":"500","id":"7979","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"73","target":"524","id":"3159","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"31","target":"370","id":"2179","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"593","target":"601","id":"10296","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"394","target":"414","id":"8626","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"171","target":"417","id":"5198","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"371","target":"562","id":"8295","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"48","target":"708","id":"2577","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"460","target":"677","id":"9369","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"661","target":"665","id":"10587","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"448","target":"506","id":"9240","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"133","target":"244","id":"4416","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"23","target":"158","id":"1982","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"81","target":"479","id":"3338","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"218","target":"435","id":"6052","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"65","target":"520","id":"2987","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"367","target":"426","id":"8253","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"123","target":"481","id":"4223","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"390","target":"399","id":"8567","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"428","target":"571","id":"9007","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"507","target":"714","id":"9765","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"267","target":"275","id":"6846","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"725","target":"729","id":"10681","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"261","target":"600","id":"6767","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"466","target":"735","id":"9429","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"336","target":"388","id":"7900","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"174","target":"568","id":"5255","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"522","target":"612","id":"9867","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"294","target":"643","id":"7308","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"612","target":"707","id":"10389","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"576","target":"606","id":"10212","attributes":{"Weight":"1.0"},"color":"rgb(132,148,180)","size":1.0},{"source":"75","target":"574","id":"3207","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"417","target":"659","id":"8875","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"276","target":"546","id":"7000","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"135","target":"280","id":"4456","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"391","target":"405","id":"8583","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"124","target":"320","id":"4238","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"12","target":"462","id":"1744","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"507","target":"534","id":"9758","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"104","target":"229","id":"3824","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"170","target":"255","id":"5174","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"526","target":"667","id":"9909","attributes":{"Weight":"1.0"},"color":"rgb(67,196,180)","size":1.0},{"source":"117","target":"375","id":"4102","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"371","target":"713","id":"8305","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"279","target":"567","id":"7047","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"525","target":"722","id":"9902","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"257","target":"445","id":"6681","attributes":{"Weight":"1.0"},"color":"rgb(196,99,148)","size":1.0},{"source":"71","target":"226","id":"3114","attributes":{"Weight":"1.0"},"color":"rgb(148,164,148)","size":1.0},{"source":"452","target":"481","id":"9275","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"242","target":"341","id":"6434","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"286","target":"593","id":"7173","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"247","target":"599","id":"6526","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"241","target":"610","id":"6424","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"100","target":"701","id":"3761","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"425","target":"565","id":"8973","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"61","target":"455","id":"2885","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"143","target":"187","id":"4629","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"221","target":"419","id":"6100","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"34","target":"546","id":"2260","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"259","target":"706","id":"6728","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"289","target":"532","id":"7228","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"6","target":"680","id":"1600","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"349","target":"643","id":"8073","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"93","target":"180","id":"3597","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"326","target":"544","id":"7755","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"295","target":"355","id":"7314","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"128","target":"588","id":"4321","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"626","target":"662","id":"10441","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"207","target":"230","id":"5856","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"17","target":"317","id":"1854","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"287","target":"451","id":"7185","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"610","target":"690","id":"10370","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"335","target":"616","id":"7890","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"275","target":"357","id":"6980","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"566","target":"659","id":"10140","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"330","target":"399","id":"7818","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"120","target":"429","id":"4162","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"564","target":"581","id":"10130","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"98","target":"372","id":"3712","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"442","target":"577","id":"9188","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"154","target":"719","id":"4883","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"71","target":"627","id":"3125","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"16","target":"174","id":"1829","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"87","target":"675","id":"3479","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"54","target":"70","id":"2691","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"505","target":"702","id":"9750","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"241","target":"578","id":"6421","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"422","target":"447","id":"8931","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"326","target":"683","id":"7757","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"54","target":"645","id":"2721","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"157","target":"240","id":"4924","attributes":{"Weight":"1.0"},"color":"rgb(180,132,148)","size":1.0},{"source":"239","target":"391","id":"6393","attributes":{"Weight":"1.0"},"color":"rgb(229,99,115)","size":1.0},{"source":"162","target":"364","id":"5023","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"213","target":"635","id":"5968","attributes":{"Weight":"1.0"},"color":"rgb(116,229,67)","size":1.0},{"source":"248","target":"448","id":"6533","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"425","target":"728","id":"8981","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"277","target":"332","id":"7005","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"103","target":"275","id":"3809","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"378","target":"588","id":"8403","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"425","target":"543","id":"8971","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"179","target":"654","id":"5363","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"101","target":"207","id":"3766","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"349","target":"591","id":"8071","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"64","target":"249","id":"2958","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"462","target":"707","id":"9389","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"65","target":"664","id":"2990","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"596","target":"723","id":"10314","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"260","target":"610","id":"6744","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"337","target":"579","id":"7918","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"39","target":"121","id":"2355","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"285","target":"438","id":"7149","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"14","target":"702","id":"1798","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"97","target":"173","id":"3685","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"166","target":"397","id":"5104","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"250","target":"694","id":"6578","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"258","target":"713","id":"6712","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"184","target":"302","id":"5443","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"421","target":"472","id":"8916","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"508","target":"543","id":"9769","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"117","target":"134","id":"4094","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"7","target":"661","id":"1619","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"389","target":"467","id":"8555","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"316","target":"327","id":"7606","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"6","target":"518","id":"1597","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"32","target":"255","id":"2191","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"33","target":"245","id":"2222","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"80","target":"575","id":"3318","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"144","target":"308","id":"4655","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"131","target":"432","id":"4380","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"32","target":"660","id":"2203","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"61","target":"678","id":"2895","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"210","target":"278","id":"5900","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"453","target":"690","id":"9289","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"54","target":"719","id":"2722","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"80","target":"335","id":"3314","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"34","target":"318","id":"2254","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"31","target":"701","id":"2184","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"582","target":"655","id":"10252","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"211","target":"487","id":"5925","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"224","target":"443","id":"6153","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"82","target":"573","id":"3360","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"614","target":"687","id":"10397","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"268","target":"731","id":"6882","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"517","target":"678","id":"9832","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"610","target":"692","id":"10371","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"398","target":"702","id":"8679","attributes":{"Weight":"1.0"},"color":"rgb(115,148,164)","size":1.0},{"source":"515","target":"620","id":"9810","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"133","target":"659","id":"4430","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"283","target":"330","id":"7117","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"264","target":"466","id":"6804","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"8","target":"527","id":"1644","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"161","target":"553","id":"5006","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"205","target":"582","id":"5832","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"129","target":"164","id":"4326","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"530","target":"683","id":"9946","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"44","target":"179","id":"2463","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"225","target":"419","id":"6171","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"675","target":"728","id":"10618","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"212","target":"645","id":"5952","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"230","target":"484","id":"6256","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"16","target":"733","id":"1842","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"61","target":"314","id":"2873","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"370","target":"630","id":"8288","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"360","target":"388","id":"8183","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"421","target":"594","id":"8925","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"76","target":"663","id":"3238","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"9","target":"236","id":"1669","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"242","target":"544","id":"6442","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"82","target":"623","id":"3364","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"456","target":"536","id":"9323","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"225","target":"424","id":"6172","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"401","target":"557","id":"8712","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"392","target":"414","id":"8601","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"121","target":"461","id":"4184","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"285","target":"650","id":"7156","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"38","target":"517","id":"2348","attributes":{"Weight":"1.0"},"color":"rgb(148,213,115)","size":1.0},{"source":"181","target":"219","id":"5388","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"492","target":"535","id":"9635","attributes":{"Weight":"1.0"},"color":"rgb(116,67,229)","size":1.0},{"source":"6","target":"310","id":"1587","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"384","target":"707","id":"8499","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"67","target":"697","id":"3031","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"437","target":"520","id":"9118","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"28","target":"720","id":"2122","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"225","target":"451","id":"6174","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"572","target":"719","id":"10184","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"27","target":"80","id":"2058","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"279","target":"572","id":"7048","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"115","target":"342","id":"4051","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"63","target":"257","id":"2929","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"182","target":"488","id":"5407","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"311","target":"384","id":"7539","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"387","target":"664","id":"8542","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"263","target":"669","id":"6795","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"131","target":"511","id":"4382","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"63","target":"485","id":"2935","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"164","target":"720","id":"5075","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"70","target":"608","id":"3102","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"283","target":"414","id":"7130","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"40","target":"598","id":"2391","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"98","target":"718","id":"3724","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"238","target":"335","id":"6371","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"640","target":"733","id":"10504","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"132","target":"512","id":"4413","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"119","target":"378","id":"4139","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"405","target":"658","id":"8760","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"313","target":"468","id":"7570","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"398","target":"632","id":"8672","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"155","target":"643","id":"4901","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"377","target":"414","id":"8388","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"135","target":"489","id":"4469","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"31","target":"309","id":"2176","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"102","target":"595","id":"3801","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"509","target":"592","id":"9781","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"25","target":"51","id":"2018","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"445","target":"483","id":"9219","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"21","target":"25","id":"1935","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"50","target":"164","id":"2608","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"203","target":"374","id":"5787","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"227","target":"569","id":"6206","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"384","target":"685","id":"8497","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"18","target":"628","id":"1882","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"140","target":"687","id":"4583","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"78","target":"495","id":"3271","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"52","target":"456","id":"2659","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"42","target":"428","id":"2424","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"220","target":"340","id":"6079","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"269","target":"658","id":"6902","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"98","target":"367","id":"3711","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"212","target":"487","id":"5945","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"545","target":"556","id":"10034","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"39","target":"463","id":"2369","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"96","target":"370","id":"3678","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"190","target":"706","id":"5568","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"244","target":"613","id":"6471","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"635","target":"637","id":"10474","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"313","target":"477","id":"7573","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"200","target":"597","id":"5744","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"69","target":"285","id":"3061","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"250","target":"674","id":"6577","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"587","target":"597","id":"10271","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"256","target":"276","id":"6665","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"147","target":"455","id":"4730","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"136","target":"712","id":"4497","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"144","target":"606","id":"4669","attributes":{"Weight":"1.0"},"color":"rgb(132,148,180)","size":1.0},{"source":"319","target":"349","id":"7654","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"284","target":"306","id":"7137","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"195","target":"605","id":"5649","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"628","target":"664","id":"10446","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"421","target":"508","id":"8918","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"101","target":"361","id":"3776","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"21","target":"708","id":"1954","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"184","target":"312","id":"5444","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"154","target":"224","id":"4862","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"174","target":"704","id":"5259","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"10","target":"153","id":"1689","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"84","target":"533","id":"3400","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"18","target":"383","id":"1875","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"198","target":"538","id":"5705","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"260","target":"665","id":"6746","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"306","target":"380","id":"7475","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"235","target":"489","id":"6336","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"1","target":"519","id":"1477","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"665","target":"723","id":"10601","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"46","target":"675","id":"2541","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"127","target":"715","id":"4303","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"81","target":"620","id":"3342","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"216","target":"618","id":"6022","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"54","target":"202","id":"2693","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"192","target":"666","id":"5595","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"177","target":"221","id":"5303","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"183","target":"462","id":"5423","attributes":{"Weight":"1.0"},"color":"rgb(99,229,148)","size":1.0},{"source":"185","target":"728","id":"5477","attributes":{"Weight":"1.0"},"color":"rgb(229,132,148)","size":1.0},{"source":"60","target":"150","id":"2837","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"287","target":"462","id":"7186","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"179","target":"586","id":"5359","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"269","target":"390","id":"6887","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"16","target":"439","id":"1833","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"176","target":"700","id":"5299","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"8","target":"460","id":"1642","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"114","target":"257","id":"4027","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"52","target":"197","id":"2651","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"122","target":"266","id":"4192","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"95","target":"244","id":"3646","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"416","target":"481","id":"8862","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"342","target":"403","id":"7978","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"114","target":"421","id":"4031","attributes":{"Weight":"1.0"},"color":"rgb(196,67,229)","size":1.0},{"source":"177","target":"218","id":"5302","attributes":{"Weight":"1.0"},"color":"rgb(67,196,180)","size":1.0},{"source":"82","target":"614","id":"3363","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"192","target":"315","id":"5586","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"548","target":"710","id":"10054","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"65","target":"340","id":"2980","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"71","target":"146","id":"3109","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"159","target":"257","id":"4963","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"137","target":"306","id":"4504","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"225","target":"287","id":"6168","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"117","target":"700","id":"4111","attributes":{"Weight":"1.0"},"color":"rgb(100,148,148)","size":1.0},{"source":"208","target":"541","id":"5881","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"195","target":"493","id":"5642","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"668","target":"713","id":"10607","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"280","target":"331","id":"7058","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"469","target":"514","id":"9446","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"87","target":"185","id":"3455","attributes":{"Weight":"1.0"},"color":"rgb(229,132,148)","size":1.0},{"source":"677","target":"685","id":"10623","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"197","target":"700","id":"5696","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"79","target":"375","id":"3285","attributes":{"Weight":"1.0"},"color":"rgb(83,229,115)","size":1.0},{"source":"156","target":"242","id":"4908","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"537","target":"706","id":"9993","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"214","target":"320","id":"5975","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"632","target":"671","id":"10462","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"448","target":"520","id":"9241","attributes":{"Weight":"1.0"},"color":"rgb(148,229,132)","size":1.0},{"source":"211","target":"618","id":"5929","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"524","target":"637","id":"9889","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"189","target":"230","id":"5532","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"454","target":"577","id":"9300","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"29","target":"310","id":"2129","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"298","target":"479","id":"7362","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"79","target":"623","id":"3299","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"141","target":"482","id":"4599","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"211","target":"642","id":"5930","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"438","target":"724","id":"9134","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"189","target":"361","id":"5539","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"329","target":"464","id":"7801","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"259","target":"363","id":"6714","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"525","target":"567","id":"9896","attributes":{"Weight":"1.0"},"color":"rgb(148,115,213)","size":1.0},{"source":"475","target":"614","id":"9519","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"122","target":"454","id":"4198","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"15","target":"97","id":"1800","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"661","target":"693","id":"10590","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"477","target":"680","id":"9536","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"183","target":"736","id":"5439","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"110","target":"719","id":"3957","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"200","target":"579","id":"5741","attributes":{"Weight":"1.0"},"color":"rgb(67,180,164)","size":1.0},{"source":"543","target":"589","id":"10025","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"258","target":"575","id":"6704","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"3","target":"634","id":"1530","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"633","target":"635","id":"10465","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"35","target":"570","id":"2280","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"196","target":"421","id":"5660","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"336","target":"448","id":"7902","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"87","target":"440","id":"3463","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"374","target":"611","id":"8343","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"220","target":"709","id":"6091","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"205","target":"585","id":"5833","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"15","target":"296","id":"1807","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"44","target":"454","id":"2474","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"577","target":"611","id":"10217","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"327","target":"455","id":"7764","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"572","target":"629","id":"10180","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"441","target":"650","id":"9172","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"216","target":"703","id":"6027","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"243","target":"439","id":"6449","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"289","target":"567","id":"7231","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"440","target":"472","id":"9150","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"372","target":"549","id":"8314","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"39","target":"129","id":"2356","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"468","target":"680","id":"9444","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"114","target":"398","id":"4030","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"205","target":"525","id":"5829","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"234","target":"304","id":"6314","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"302","target":"736","id":"7430","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"364","target":"665","id":"8224","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"267","target":"509","id":"6855","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"263","target":"539","id":"6790","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"166","target":"607","id":"5110","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"312","target":"497","id":"7556","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"412","target":"413","id":"8828","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"109","target":"119","id":"3908","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"264","target":"281","id":"6797","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"68","target":"697","id":"3053","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"287","target":"487","id":"7188","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"59","target":"422","id":"2823","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"58","target":"452","id":"2806","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"524","target":"635","id":"9887","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"414","target":"658","id":"8844","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"15","target":"195","id":"1803","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"277","target":"424","id":"7007","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"136","target":"336","id":"4485","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"174","target":"640","id":"5256","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"202","target":"221","id":"5767","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"125","target":"404","id":"4253","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"43","target":"437","id":"2448","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"569","target":"572","id":"10156","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"457","target":"630","id":"9331","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"425","target":"508","id":"8968","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"351","target":"456","id":"8093","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"114","target":"682","id":"4044","attributes":{"Weight":"1.0"},"color":"rgb(180,67,229)","size":1.0},{"source":"500","target":"505","id":"9705","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"47","target":"696","id":"2563","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"451","target":"462","id":"9267","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"307","target":"479","id":"7492","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"110","target":"150","id":"3930","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"315","target":"380","id":"7597","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"384","target":"625","id":"8492","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"23","target":"698","id":"1993","attributes":{"Weight":"1.0"},"color":"rgb(180,67,148)","size":1.0},{"source":"103","target":"581","id":"3821","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"244","target":"314","id":"6459","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"38","target":"461","id":"2345","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"113","target":"278","id":"4009","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"1","target":"108","id":"1466","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"527","target":"612","id":"9913","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"33","target":"50","id":"2207","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"241","target":"692","id":"6428","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"466","target":"651","id":"9422","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"309","target":"332","id":"7515","attributes":{"Weight":"1.0"},"color":"rgb(148,115,148)","size":1.0},{"source":"317","target":"355","id":"7628","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"182","target":"533","id":"5408","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"88","target":"241","id":"3487","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"504","target":"692","id":"9740","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"208","target":"459","id":"5873","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"14","target":"292","id":"1782","attributes":{"Weight":"1.0"},"color":"rgb(148,148,83)","size":1.0},{"source":"41","target":"584","id":"2408","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"633","target":"688","id":"10469","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"7","target":"339","id":"1609","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"373","target":"720","id":"8330","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"26","target":"123","id":"2039","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"263","target":"299","id":"6781","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"447","target":"481","id":"9234","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"228","target":"489","id":"6225","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"291","target":"670","id":"7270","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"12","target":"319","id":"1738","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"433","target":"577","id":"9077","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"345","target":"613","id":"8020","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"25","target":"243","id":"2022","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"178","target":"427","id":"5335","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"454","target":"614","id":"9302","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"402","target":"696","id":"8729","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"323","target":"529","id":"7713","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"157","target":"175","id":"4922","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"473","target":"728","id":"9501","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"88","target":"723","id":"3511","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"541","target":"620","id":"10015","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"29","target":"471","id":"2135","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"8","target":"311","id":"1636","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"106","target":"304","id":"3862","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"3","target":"607","id":"1529","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"37","target":"626","id":"2323","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"149","target":"682","id":"4775","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"176","target":"551","id":"5296","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"109","target":"501","id":"3921","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"183","target":"204","id":"5416","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"251","target":"401","id":"6586","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"492","target":"609","id":"9639","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"254","target":"545","id":"6639","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"169","target":"275","id":"5150","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"28","target":"33","id":"2086","attributes":{"Weight":"1.0"},"color":"rgb(148,132,148)","size":1.0},{"source":"108","target":"435","id":"3896","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"193","target":"724","id":"5612","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"320","target":"362","id":"7677","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"74","target":"654","id":"3186","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"323","target":"699","id":"7718","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"77","target":"310","id":"3246","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"353","target":"595","id":"8122","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"36","target":"315","id":"2295","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"547","target":"567","id":"10046","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"199","target":"274","id":"5717","attributes":{"Weight":"1.0"},"color":"rgb(67,196,213)","size":1.0},{"source":"7","target":"692","id":"1622","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"136","target":"506","id":"4492","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"571","target":"703","id":"10176","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"460","target":"679","id":"9370","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"190","target":"254","id":"5552","attributes":{"Weight":"1.0"},"color":"rgb(148,148,100)","size":1.0},{"source":"14","target":"574","id":"1791","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"42","target":"716","id":"2436","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"233","target":"443","id":"6303","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"61","target":"171","id":"2871","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"459","target":"470","id":"9347","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"127","target":"639","id":"4299","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"43","target":"347","id":"2445","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"18","target":"43","id":"1865","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"277","target":"636","id":"7019","attributes":{"Weight":"1.0"},"color":"rgb(180,196,67)","size":1.0},{"source":"154","target":"462","id":"4873","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"161","target":"398","id":"5003","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"522","target":"532","id":"9865","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"275","target":"667","id":"6991","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"161","target":"726","id":"5014","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"193","target":"281","id":"5597","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"41","target":"273","id":"2399","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"468","target":"515","id":"9440","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"495","target":"666","id":"9667","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"166","target":"226","id":"5099","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"50","target":"316","id":"2612","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"435","target":"526","id":"9099","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"41","target":"570","id":"2407","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"176","target":"464","id":"5292","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"245","target":"629","id":"6492","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"438","target":"647","id":"9129","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"140","target":"384","id":"4564","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"196","target":"508","id":"5665","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"485","target":"726","id":"9584","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"387","target":"670","id":"8543","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"68","target":"684","id":"3051","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"329","target":"563","id":"7806","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"67","target":"684","id":"3029","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"26","target":"447","id":"2048","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"538","target":"636","id":"9996","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"197","target":"367","id":"5684","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"312","target":"684","id":"7564","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"268","target":"560","id":"6879","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"611","target":"614","id":"10375","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"437","target":"628","id":"9120","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"197","target":"615","id":"5695","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"110","target":"591","id":"3951","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"298","target":"307","id":"7353","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"610","target":"723","id":"10374","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"73","target":"697","id":"3167","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"179","target":"527","id":"5356","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"387","target":"503","id":"8537","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"74","target":"179","id":"3172","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"374","target":"385","id":"8331","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"138","target":"346","id":"4520","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"326","target":"406","id":"7750","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"268","target":"377","id":"6865","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"482","target":"622","id":"9566","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"317","target":"446","id":"7630","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"72","target":"190","id":"3131","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"146","target":"407","id":"4712","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"161","target":"632","id":"5008","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"425","target":"663","id":"8978","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"107","target":"278","id":"3877","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"133","target":"325","id":"4418","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"142","target":"187","id":"4608","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"390","target":"405","id":"8568","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"41","target":"467","id":"2405","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"300","target":"469","id":"7391","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"122","target":"203","id":"4191","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"652","target":"667","id":"10560","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"502","target":"683","id":"9725","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"402","target":"656","id":"8725","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"394","target":"399","id":"8621","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"358","target":"600","id":"8166","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"205","target":"494","id":"5827","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"249","target":"481","id":"6552","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"519","target":"605","id":"9844","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"382","target":"689","id":"8465","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"266","target":"610","id":"6838","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"299","target":"384","id":"7371","attributes":{"Weight":"1.0"},"color":"rgb(99,148,180)","size":1.0},{"source":"346","target":"404","id":"8028","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"8","target":"576","id":"1648","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"52","target":"426","id":"2657","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"329","target":"551","id":"7805","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"146","target":"627","id":"4718","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"360","target":"617","id":"8190","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"296","target":"450","id":"7325","attributes":{"Weight":"1.0"},"color":"rgb(67,196,229)","size":1.0},{"source":"88","target":"271","id":"3491","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"246","target":"474","id":"6502","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"375","target":"678","id":"8360","attributes":{"Weight":"1.0"},"color":"rgb(83,229,115)","size":1.0},{"source":"436","target":"490","id":"9107","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"532","target":"677","id":"9955","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"363","target":"597","id":"8211","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"418","target":"494","id":"8881","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"264","target":"382","id":"6800","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"81","target":"477","id":"3337","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"264","target":"689","id":"6810","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"423","target":"545","id":"8942","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"349","target":"529","id":"8068","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"165","target":"240","id":"5082","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"45","target":"249","id":"2499","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"200","target":"342","id":"5732","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"545","target":"694","id":"10040","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"396","target":"417","id":"8643","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"719","target":"720","id":"10674","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"549","target":"615","id":"10057","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"264","target":"441","id":"6802","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"732","target":"733","id":"10690","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"28","target":"407","id":"2107","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"319","target":"608","id":"7669","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"111","target":"489","id":"3976","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"36","target":"66","id":"2287","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"37","target":"182","id":"2311","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"17","target":"256","id":"1849","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"459","target":"518","id":"9352","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"403","target":"537","id":"8732","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"248","target":"588","id":"6538","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"28","target":"705","id":"2121","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"46","target":"404","id":"2527","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"136","target":"248","id":"4484","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"391","target":"412","id":"8585","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"441","target":"466","id":"9168","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"589","target":"604","id":"10280","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"500","target":"691","id":"9711","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"98","target":"427","id":"3714","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"26","target":"291","id":"2045","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"409","target":"508","id":"8796","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"69","target":"466","id":"3070","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"484","target":"512","id":"9573","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"123","target":"249","id":"4214","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"237","target":"416","id":"6357","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"249","target":"675","id":"6558","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"360","target":"506","id":"8186","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"560","target":"561","id":"10110","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"190","target":"200","id":"5550","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"148","target":"686","id":"4757","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"12","target":"221","id":"1734","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"3","target":"240","id":"1521","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"240","target":"359","id":"6399","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"278","target":"579","id":"7029","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"378","target":"647","id":"8405","attributes":{"Weight":"1.0"},"color":"rgb(148,164,148)","size":1.0},{"source":"298","target":"680","id":"7367","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"92","target":"700","id":"3593","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"335","target":"434","id":"7883","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"171","target":"659","id":"5207","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"305","target":"595","id":"7472","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"388","target":"448","id":"8546","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"174","target":"439","id":"5253","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"199","target":"346","id":"5719","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"198","target":"637","id":"5709","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"33","target":"209","id":"2217","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"294","target":"720","id":"7311","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"319","target":"462","id":"7662","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"19","target":"237","id":"1895","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"246","target":"657","id":"6510","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"163","target":"343","id":"5043","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"38","target":"129","id":"2331","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"13","target":"599","id":"1771","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"149","target":"606","id":"4771","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"13","target":"40","id":"1753","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"189","target":"344","id":"5537","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"131","target":"277","id":"4373","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"526","target":"722","id":"9910","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"164","target":"397","id":"5065","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"156","target":"265","id":"4909","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"194","target":"587","id":"5629","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"443","target":"676","id":"9205","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"54","target":"571","id":"2714","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"90","target":"530","id":"3549","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"557","target":"660","id":"10097","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"123","target":"675","id":"4227","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"458","target":"541","id":"9342","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"300","target":"542","id":"7395","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"464","target":"609","id":"9401","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"23","target":"732","id":"1996","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"647","target":"734","id":"10537","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"149","target":"534","id":"4769","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"101","target":"112","id":"3762","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"70","target":"600","id":"3101","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"373","target":"685","id":"8328","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"532","target":"704","id":"9958","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"3","target":"430","id":"1524","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"65","target":"590","id":"2988","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"161","target":"246","id":"4999","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"196","target":"304","id":"5655","attributes":{"Weight":"1.0"},"color":"rgb(148,67,229)","size":1.0},{"source":"373","target":"643","id":"8325","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"1","target":"655","id":"1484","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"39","target":"165","id":"2357","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"455","target":"469","id":"9308","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"98","target":"536","id":"3718","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"443","target":"699","id":"9206","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"632","target":"638","id":"10459","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"461","target":"486","id":"9376","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"355","target":"446","id":"8131","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"32","target":"254","id":"2190","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"163","target":"206","id":"5040","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"246","target":"485","id":"6503","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"418","target":"526","id":"8884","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"414","target":"561","id":"8843","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"271","target":"339","id":"6918","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"104","target":"276","id":"3828","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"157","target":"434","id":"4930","attributes":{"Weight":"1.0"},"color":"rgb(99,148,180)","size":1.0},{"source":"107","target":"407","id":"3880","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"77","target":"471","id":"3252","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"695","target":"732","id":"10659","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"545","target":"558","id":"10036","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"50","target":"155","id":"2607","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"85","target":"586","id":"3427","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"11","target":"118","id":"1708","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"67","target":"270","id":"3018","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"314","target":"496","id":"7587","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"435","target":"519","id":"9097","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"242","target":"375","id":"6436","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"173","target":"582","id":"5244","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"347","target":"664","id":"8044","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"5","target":"27","id":"1554","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"456","target":"700","id":"9328","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"434","target":"616","id":"9092","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"150","target":"294","id":"4782","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"454","target":"455","id":"9294","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"36","target":"584","id":"2301","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"504","target":"610","id":"9736","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"290","target":"393","id":"7243","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"23","target":"708","id":"1995","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"268","target":"658","id":"6881","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"127","target":"160","id":"4286","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"97","target":"493","id":"3694","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"92","target":"427","id":"3584","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"48","target":"704","id":"2576","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"154","target":"371","id":"4870","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"468","target":"686","id":"9445","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"107","target":"321","id":"3878","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"29","target":"479","id":"2137","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"578","target":"692","id":"10232","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"276","target":"446","id":"6997","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"45","target":"58","id":"2492","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"170","target":"696","id":"5189","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"28","target":"321","id":"2103","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"47","target":"694","id":"2562","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"490","target":"586","id":"9615","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"455","target":"678","id":"9317","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"268","target":"394","id":"6870","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"297","target":"621","id":"7344","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"41","target":"389","id":"2404","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"53","target":"497","id":"2679","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"53","target":"68","id":"2670","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"382","target":"441","id":"8452","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"95","target":"163","id":"3644","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"303","target":"679","id":"7448","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"139","target":"616","id":"4551","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"578","target":"721","id":"10234","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"145","target":"316","id":"4680","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"507","target":"566","id":"9759","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"180","target":"652","id":"5385","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"202","target":"451","id":"5776","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"87","target":"521","id":"3469","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"349","target":"368","id":"8061","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"118","target":"220","id":"4114","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"58","target":"123","id":"2793","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"300","target":"301","id":"7387","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"367","target":"372","id":"8252","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"21","target":"23","id":"1933","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"325","target":"507","id":"7736","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"34","target":"317","id":"2253","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"605","target":"655","id":"10350","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"215","target":"364","id":"5990","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"261","target":"608","id":"6768","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"194","target":"379","id":"5622","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"178","target":"718","id":"5345","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"422","target":"478","id":"8934","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"61","target":"721","id":"2899","attributes":{"Weight":"1.0"},"color":"rgb(180,148,148)","size":1.0},{"source":"79","target":"517","id":"3294","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"3","target":"129","id":"1513","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"246","target":"632","id":"6507","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"147","target":"175","id":"4722","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"422","target":"675","id":"8940","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"80","target":"576","id":"3319","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"8","target":"74","id":"1628","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"329","target":"718","id":"7810","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"144","target":"258","id":"4653","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"117","target":"341","id":"4100","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"238","target":"348","id":"6373","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"468","target":"518","id":"9441","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"231","target":"232","id":"6258","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"392","target":"412","id":"8599","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"81","target":"518","id":"3340","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"56","target":"679","id":"2764","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"140","target":"522","id":"4571","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"440","target":"473","id":"9151","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"355","target":"357","id":"8130","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"244","target":"534","id":"6468","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"130","target":"309","id":"4355","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"115","target":"190","id":"4047","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"259","target":"383","id":"6716","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"46","target":"461","id":"2533","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"21","target":"704","id":"1953","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"543","target":"594","id":"10026","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"220","target":"387","id":"6082","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"402","target":"410","id":"8719","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"246","target":"297","id":"6498","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"619","target":"652","id":"10410","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"491","target":"646","id":"9624","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"112","target":"445","id":"4001","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"80","target":"308","id":"3313","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"685","target":"707","id":"10635","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"242","target":"265","id":"6432","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"166","target":"430","id":"5105","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"171","target":"244","id":"5191","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"180","target":"428","id":"5376","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"198","target":"635","id":"5707","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"180","target":"601","id":"5382","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"97","target":"418","id":"3691","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"170","target":"674","id":"5187","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"283","target":"377","id":"7118","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"151","target":"227","id":"4806","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"608","target":"645","id":"10363","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"695","target":"704","id":"10657","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"155","target":"629","id":"4900","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"477","target":"518","id":"9533","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"404","target":"437","id":"8741","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"438","target":"730","id":"9137","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"311","target":"679","id":"7553","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"553","target":"639","id":"10074","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"55","target":"147","id":"2725","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"517","target":"687","id":"9833","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"101","target":"132","id":"3764","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"20","target":"62","id":"1910","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"52","target":"92","id":"2647","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"261","target":"358","id":"6755","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"50","target":"110","id":"2602","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"165","target":"191","id":"5080","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"458","target":"515","id":"9340","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"332","target":"593","id":"7848","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"296","target":"435","id":"7324","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"245","target":"591","id":"6491","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"168","target":"461","id":"5138","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"130","target":"181","id":"4350","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"144","target":"646","id":"4671","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"226","target":"711","id":"6193","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"143","target":"301","id":"4633","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"60","target":"236","id":"2843","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"653","target":"698","id":"10564","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"16","target":"292","id":"1831","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"127","target":"159","id":"4285","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"17","target":"169","id":"1847","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"168","target":"240","id":"5133","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"58","target":"517","id":"2810","attributes":{"Weight":"1.0"},"color":"rgb(132,229,115)","size":1.0},{"source":"139","target":"308","id":"4539","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"435","target":"605","id":"9102","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"405","target":"412","id":"8754","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"129","target":"634","id":"4345","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"53","target":"636","id":"2685","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"394","target":"411","id":"8623","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"421","target":"523","id":"8920","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"319","target":"358","id":"7655","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"171","target":"682","id":"5209","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"271","target":"721","id":"6932","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"383","target":"505","id":"8474","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"346","target":"590","id":"8032","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"382","target":"734","id":"8470","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"559","target":"731","id":"10109","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"153","target":"366","id":"4851","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"33","target":"362","id":"2230","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"44","target":"480","id":"2476","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"43","target":"473","id":"2449","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"164","target":"349","id":"5061","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"273","target":"599","id":"6957","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"217","target":"407","id":"6033","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"320","target":"483","id":"7680","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"267","target":"581","id":"6859","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"212","target":"287","id":"5935","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"263","target":"535","id":"6789","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"147","target":"535","id":"4733","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"407","target":"627","id":"8774","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"636","target":"684","id":"10480","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"327","target":"614","id":"7772","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"309","target":"457","id":"7519","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"332","target":"716","id":"7855","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"187","target":"698","id":"5510","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"248","target":"617","id":"6539","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"27","target":"433","id":"2072","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"173","target":"195","id":"5232","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"89","target":"621","id":"3525","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"501","target":"712","id":"9719","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"447","target":"478","id":"9233","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"469","target":"542","id":"9449","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"72","target":"649","id":"3146","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"442","target":"573","id":"9187","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"424","target":"608","id":"8959","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"316","target":"687","id":"7623","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"537","target":"574","id":"9986","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"416","target":"565","id":"8865","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"154","target":"335","id":"4868","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"162","target":"215","id":"5015","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"207","target":"209","id":"5853","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"95","target":"388","id":"3652","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"395","target":"559","id":"8638","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"378","target":"727","id":"8407","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"27","target":"603","id":"2080","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"14","target":"75","id":"1775","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"185","target":"622","id":"5472","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"169","target":"317","id":"5154","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"57","target":"663","id":"2790","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"250","target":"656","id":"6575","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"5","target":"231","id":"1560","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"418","target":"605","id":"8887","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"356","target":"402","id":"8140","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"155","target":"164","id":"4886","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"248","target":"563","id":"6537","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"514","target":"542","id":"9803","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"148","target":"620","id":"4755","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"221","target":"642","id":"6112","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"132","target":"320","id":"4405","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"83","target":"488","id":"3381","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"395","target":"414","id":"8637","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"184","target":"635","id":"5450","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"236","target":"710","id":"6353","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"331","target":"376","id":"7830","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"330","target":"658","id":"7828","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"601","target":"652","id":"10329","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"523","target":"604","id":"9880","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"36","target":"389","id":"2297","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"145","target":"442","id":"4688","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"412","target":"414","id":"8829","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"288","target":"663","id":"7217","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"525","target":"582","id":"9897","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"83","target":"579","id":"3383","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"27","target":"335","id":"2068","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"317","target":"318","id":"7627","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"24","target":"733","id":"2016","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"251","target":"254","id":"6581","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"85","target":"436","id":"3421","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"281","target":"689","id":"7089","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"352","target":"463","id":"8107","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"157","target":"653","id":"4942","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"16","target":"25","id":"1825","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"151","target":"431","id":"4817","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"2","target":"369","id":"1502","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"409","target":"679","id":"8808","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"69","target":"735","id":"3083","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"433","target":"475","id":"9071","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"58","target":"447","id":"2804","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"60","target":"710","id":"2863","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"189","target":"578","id":"5545","attributes":{"Weight":"1.0"},"color":"rgb(196,180,67)","size":1.0},{"source":"307","target":"459","id":"7487","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"262","target":"344","id":"6773","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"427","target":"700","id":"9001","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"336","target":"727","id":"7910","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"20","target":"406","id":"1924","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"244","target":"630","id":"6472","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"288","target":"472","id":"7202","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"125","target":"452","id":"4258","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"208","target":"470","id":"5875","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"67","target":"635","id":"3026","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"473","target":"533","id":"9493","attributes":{"Weight":"1.0"},"color":"rgb(148,99,229)","size":1.0},{"source":"132","target":"262","id":"4404","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"2","target":"10","id":"1486","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"94","target":"149","id":"3619","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"451","target":"555","id":"9269","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"140","target":"612","id":"4575","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"491","target":"651","id":"9627","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"311","target":"525","id":"7544","attributes":{"Weight":"1.0"},"color":"rgb(67,196,180)","size":1.0},{"source":"250","target":"558","id":"6573","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"466","target":"725","id":"9425","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"245","target":"349","id":"6480","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"486","target":"634","id":"9588","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"152","target":"506","id":"4839","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"185","target":"430","id":"5464","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"255","target":"656","id":"6658","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"231","target":"668","id":"6276","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"181","target":"457","id":"5395","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"104","target":"564","id":"3838","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"16","target":"243","id":"1830","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"46","target":"622","id":"2539","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"363","target":"403","id":"8204","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"241","target":"723","id":"6431","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"49","target":"276","id":"2588","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"397","target":"677","id":"8661","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"22","target":"733","id":"1977","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"70","target":"214","id":"3087","attributes":{"Weight":"1.0"},"color":"rgb(148,180,148)","size":1.0},{"source":"69","target":"633","id":"3072","attributes":{"Weight":"1.0"},"color":"rgb(99,164,148)","size":1.0},{"source":"183","target":"637","id":"5432","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"604","target":"706","id":"10347","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"407","target":"626","id":"8773","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"269","target":"391","id":"6888","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"312","target":"697","id":"7566","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"122","target":"475","id":"4199","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"78","target":"315","id":"3267","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"177","target":"679","id":"5324","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"86","target":"618","id":"3449","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"667","target":"707","id":"10605","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"43","target":"199","id":"2440","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"426","target":"700","id":"8991","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"101","target":"457","id":"3779","attributes":{"Weight":"1.0"},"color":"rgb(148,99,148)","size":1.0},{"source":"53","target":"204","id":"2675","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"211","target":"287","id":"5916","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"106","target":"219","id":"3860","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"292","target":"293","id":"7272","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"56","target":"460","id":"2755","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"8","target":"606","id":"1649","attributes":{"Weight":"1.0"},"color":"rgb(132,148,180)","size":1.0},{"source":"87","target":"409","id":"3460","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"263","target":"698","id":"6796","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"145","target":"687","id":"4700","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"289","target":"676","id":"7233","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"118","target":"272","id":"4115","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"134","target":"365","id":"4440","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"408","target":"625","id":"8782","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"23","target":"25","id":"1979","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"151","target":"547","id":"4822","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"218","target":"261","id":"6045","attributes":{"Weight":"1.0"},"color":"rgb(67,196,229)","size":1.0},{"source":"270","target":"635","id":"6911","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"398","target":"440","id":"8666","attributes":{"Weight":"1.0"},"color":"rgb(196,67,229)","size":1.0},{"source":"377","target":"395","id":"8382","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"689","target":"730","id":"10642","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"471","target":"620","id":"9473","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"34","target":"267","id":"2249","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"178","target":"609","id":"5342","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"185","target":"711","id":"5476","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"74","target":"386","id":"3176","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"39","target":"359","id":"2366","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"238","target":"627","id":"6383","attributes":{"Weight":"1.0"},"color":"rgb(67,180,180)","size":1.0},{"source":"161","target":"657","id":"5011","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"202","target":"358","id":"5772","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"511","target":"703","id":"9795","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"31","target":"181","id":"2172","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"217","target":"662","id":"6041","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"534","target":"682","id":"9972","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"10","target":"630","id":"1701","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"87","target":"589","id":"3474","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"622","target":"728","id":"10425","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"160","target":"639","id":"4994","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"11","target":"43","id":"1705","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"480","target":"614","id":"9555","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"113","target":"627","id":"4018","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"250","target":"254","id":"6561","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"56","target":"654","id":"2761","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"669","target":"698","id":"10608","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"205","target":"274","id":"5822","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"290","target":"413","id":"7250","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"456","target":"718","id":"9329","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"269","target":"394","id":"6891","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"616","target":"668","id":"10400","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"173","target":"296","id":"5236","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"384","target":"654","id":"8493","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"448","target":"563","id":"9243","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"563","target":"727","id":"10129","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"98","target":"426","id":"3713","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"486","target":"711","id":"9589","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"557","target":"694","id":"10099","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"219","target":"309","id":"6069","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"246","target":"322","id":"6499","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"73","target":"312","id":"3156","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"147","target":"432","id":"4728","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"605","target":"722","id":"10351","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"386","target":"408","id":"8517","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"349","target":"429","id":"8066","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"364","target":"438","id":"8216","attributes":{"Weight":"1.0"},"color":"rgb(115,164,148)","size":1.0},{"source":"339","target":"602","id":"7944","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"340","target":"347","id":"7954","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"219","target":"234","id":"6067","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"208","target":"468","id":"5874","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"303","target":"433","id":"7436","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"116","target":"606","id":"4088","attributes":{"Weight":"1.0"},"color":"rgb(132,148,180)","size":1.0},{"source":"407","target":"488","id":"8770","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"223","target":"230","id":"6130","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"64","target":"207","id":"2952","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"341","target":"476","id":"7968","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"109","target":"360","id":"3917","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"148","target":"479","id":"4751","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"225","target":"450","id":"6173","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"207","target":"512","id":"5867","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"376","target":"436","id":"8366","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"111","target":"429","id":"3975","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"31","target":"366","id":"2177","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"261","target":"645","id":"6770","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"207","target":"445","id":"5864","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"691","target":"706","id":"10650","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"20","target":"365","id":"1922","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"146","target":"533","id":"4715","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"436","target":"516","id":"9108","attributes":{"Weight":"1.0"},"color":"rgb(180,148,132)","size":1.0},{"source":"100","target":"304","id":"3752","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"233","target":"529","id":"6305","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"235","target":"499","id":"6337","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"110","target":"371","id":"3944","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"38","target":"165","id":"2332","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"351","target":"551","id":"8098","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"94","target":"534","id":"3631","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"390","target":"413","id":"8571","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"69","target":"729","id":"3080","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"197","target":"549","id":"5692","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"116","target":"139","id":"4066","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"288","target":"311","id":"7196","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"263","target":"514","id":"6788","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"281","target":"651","id":"7088","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"33","target":"349","id":"2227","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"50","target":"111","id":"2603","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"309","target":"645","id":"7522","attributes":{"Weight":"1.0"},"color":"rgb(67,148,229)","size":1.0},{"source":"310","target":"471","id":"7530","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"364","target":"610","id":"8222","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"10","target":"234","id":"1692","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"442","target":"455","id":"9182","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"105","target":"369","id":"3850","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"33","target":"111","id":"2210","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"34","target":"295","id":"2252","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"425","target":"490","id":"8967","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"125","target":"249","id":"4250","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"8","target":"562","id":"1647","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"563","target":"712","id":"10128","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"235","target":"548","id":"6338","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"26","target":"622","id":"2055","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"283","target":"395","id":"7124","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"251","target":"556","id":"6591","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"483","target":"484","id":"9569","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"398","target":"726","id":"8681","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"621","target":"638","id":"10416","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"358","target":"645","id":"8169","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"330","target":"412","id":"7821","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"218","target":"722","id":"6066","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"229","target":"510","id":"6242","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"249","target":"252","id":"6542","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"235","target":"368","id":"6334","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"422","target":"482","id":"8936","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"381","target":"571","id":"8442","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"623","target":"644","id":"10426","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"159","target":"226","id":"4961","attributes":{"Weight":"1.0"},"color":"rgb(196,132,148)","size":1.0},{"source":"86","target":"571","id":"3445","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"417","target":"496","id":"8869","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"394","target":"412","id":"8624","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"437","target":"670","id":"9122","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"391","target":"392","id":"8578","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"516","target":"696","id":"9821","attributes":{"Weight":"1.0"},"color":"rgb(180,148,83)","size":1.0},{"source":"27","target":"303","id":"2066","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"237","target":"482","id":"6364","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"74","target":"732","id":"3193","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"676","target":"717","id":"10620","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"3","target":"166","id":"1515","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"131","target":"619","id":"4390","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"491","target":"724","id":"9629","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"454","target":"573","id":"9299","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"310","target":"313","id":"7525","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"11","target":"711","id":"1728","attributes":{"Weight":"1.0"},"color":"rgb(148,213,132)","size":1.0},{"source":"239","target":"512","id":"6397","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"588","target":"712","id":"10277","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"353","target":"548","id":"8120","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"180","target":"619","id":"5384","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"475","target":"517","id":"9514","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"616","target":"681","id":"10401","attributes":{"Weight":"1.0"},"color":"rgb(83,229,99)","size":1.0},{"source":"224","target":"436","id":"6152","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"480","target":"498","id":"9550","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"202","target":"608","id":"5782","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"279","target":"699","id":"7053","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"79","target":"442","id":"3288","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"434","target":"603","id":"9091","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"245","target":"529","id":"6488","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"99","target":"457","id":"3739","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"79","target":"327","id":"3283","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"130","target":"554","id":"4365","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"9","target":"489","id":"1676","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"150","target":"460","id":"4789","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"522","target":"527","id":"9864","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"131","target":"703","id":"4394","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"45","target":"482","id":"2511","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"227","target":"547","id":"6205","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"85","target":"376","id":"3419","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"525","target":"605","id":"9899","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"88","target":"693","id":"3509","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"276","target":"318","id":"6994","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"254","target":"558","id":"6642","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"602","target":"693","id":"10338","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"276","target":"581","id":"7002","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"425","target":"604","id":"8976","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"293","target":"733","id":"7292","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"319","target":"645","id":"7672","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"12","target":"487","id":"1745","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"613","target":"673","id":"10391","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"626","target":"627","id":"10440","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"380","target":"598","id":"8425","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"198","target":"302","id":"5700","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"313","target":"680","id":"7579","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"327","target":"498","id":"7767","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"15","target":"218","id":"1805","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"42","target":"216","id":"2419","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"400","target":"558","id":"8701","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"232","target":"308","id":"6283","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"129","target":"461","id":"4340","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"386","target":"677","id":"8529","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"119","target":"550","id":"4144","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"281","target":"730","id":"7093","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"493","target":"519","id":"9644","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"277","target":"601","id":"7016","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"196","target":"288","id":"5654","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"470","target":"686","id":"9466","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"277","target":"286","id":"7004","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"103","target":"510","id":"3818","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"378","target":"712","id":"8406","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"12","target":"451","id":"1743","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"115","target":"500","id":"4056","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"288","target":"594","id":"7215","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"573","target":"614","id":"10188","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"32","target":"251","id":"2188","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"193","target":"651","id":"5610","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"280","target":"600","id":"7069","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"141","target":"291","id":"4590","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"476","target":"502","id":"9525","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"383","target":"500","id":"8473","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"358","target":"608","id":"8167","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"659","target":"682","id":"10582","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"280","target":"469","id":"7063","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"7","target":"497","id":"1613","attributes":{"Weight":"1.0"},"color":"rgb(148,229,67)","size":1.0},{"source":"22","target":"732","id":"1976","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"224","target":"462","id":"6154","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"132","target":"361","id":"4408","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"322","target":"639","id":"7702","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"83","target":"146","id":"3372","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"152","target":"206","id":"4830","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"170","target":"400","id":"5176","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"449","target":"676","id":"9255","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"41","target":"284","id":"2400","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"78","target":"598","id":"3274","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"495","target":"599","id":"9666","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"147","target":"653","id":"4737","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"191","target":"711","id":"5581","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"214","target":"445","id":"5980","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"135","target":"331","id":"4460","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"282","target":"651","id":"7107","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"6","target":"459","id":"1590","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"256","target":"510","id":"6673","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"167","target":"461","id":"5123","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"195","target":"525","id":"5645","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"200","target":"574","id":"5740","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"511","target":"652","id":"9794","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"57","target":"589","id":"2786","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"358","target":"487","id":"8164","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"133","target":"714","id":"4433","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"80","target":"258","id":"3311","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"117","target":"513","id":"4106","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"26","target":"46","id":"2036","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"69","target":"465","id":"3069","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"455","target":"535","id":"9310","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"601","target":"618","id":"10327","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"618","target":"619","id":"10406","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"115","target":"259","id":"4050","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"202","target":"555","id":"5780","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"144","target":"238","id":"4652","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"174","target":"540","id":"5254","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"104","target":"592","id":"3840","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"491","target":"725","id":"9630","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"206","target":"388","id":"5843","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"244","target":"714","id":"6476","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"87","target":"622","id":"3477","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"25","target":"174","id":"2021","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"200","target":"379","id":"5734","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"437","target":"590","id":"9119","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"88","target":"218","id":"3485","attributes":{"Weight":"1.0"},"color":"rgb(115,196,148)","size":1.0},{"source":"3","target":"359","id":"1523","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"421","target":"425","id":"8914","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"20","target":"126","id":"1914","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"159","target":"297","id":"4964","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"79","target":"82","id":"3277","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"241","target":"665","id":"6426","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"49","target":"256","id":"2585","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"405","target":"414","id":"8756","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"76","target":"421","id":"3220","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"53","target":"697","id":"2689","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"108","target":"205","id":"3891","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"51","target":"732","id":"2644","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"118","target":"628","id":"4126","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"222","target":"552","id":"6127","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"521","target":"603","id":"9859","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"282","target":"382","id":"7098","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"40","target":"584","id":"2390","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"242","target":"476","id":"6438","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"273","target":"666","id":"6958","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"336","target":"712","id":"7909","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"654","target":"677","id":"10567","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"444","target":"698","id":"9218","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"330","target":"559","id":"7824","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"120","target":"293","id":"4156","attributes":{"Weight":"1.0"},"color":"rgb(229,67,99)","size":1.0},{"source":"299","target":"444","id":"7374","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"84","target":"278","id":"3394","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"75","target":"500","id":"3204","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"184","target":"198","id":"5440","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"488","target":"705","id":"9602","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"283","target":"560","id":"7132","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"573","target":"623","id":"10189","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"23","target":"292","id":"1985","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"83","target":"627","id":"3385","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"154","target":"643","id":"4880","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"39","target":"226","id":"2363","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"400","target":"674","id":"8704","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"111","target":"397","id":"3973","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"207","target":"262","id":"5858","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"126","target":"683","id":"4284","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"334","target":"368","id":"7872","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"323","target":"436","id":"7710","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"286","target":"428","id":"7168","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"93","target":"200","id":"3599","attributes":{"Weight":"1.0"},"color":"rgb(148,196,83)","size":1.0},{"source":"516","target":"684","id":"9819","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"209","target":"344","id":"5891","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"255","target":"696","id":"6662","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"378","target":"550","id":"8400","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"65","target":"199","id":"2977","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"511","target":"619","id":"9793","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"165","target":"607","id":"5091","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"280","target":"431","id":"7060","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"351","target":"372","id":"8090","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"20","target":"544","id":"1929","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"1","target":"435","id":"1474","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"364","target":"723","id":"8230","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"216","target":"511","id":"6015","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"103","target":"276","id":"3810","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"417","target":"507","id":"8870","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"250","target":"251","id":"6559","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"64","target":"112","id":"2947","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"41","target":"598","id":"2409","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"236","target":"429","id":"6347","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"294","target":"571","id":"7302","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"489","target":"499","id":"9603","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"105","target":"457","id":"3852","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"176","target":"549","id":"5295","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"235","target":"595","id":"6340","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"165","target":"166","id":"5076","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"385","target":"623","id":"8512","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"150","target":"349","id":"4785","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"345","target":"350","id":"8012","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"338","target":"682","id":"7936","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"17","target":"592","id":"1864","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"49","target":"592","id":"2600","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"52","target":"351","id":"2654","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"374","target":"454","id":"8336","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"222","target":"429","id":"6123","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"301","target":"703","id":"7416","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"32","target":"423","id":"2197","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"233","target":"323","id":"6298","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"630","target":"672","id":"10454","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"363","target":"706","id":"8215","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"498","target":"543","id":"9690","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"401","target":"696","id":"8718","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"141","target":"516","id":"4600","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"101","target":"239","id":"3771","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"314","target":"682","id":"7595","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"67","target":"184","id":"3015","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"61","target":"244","id":"2872","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"393","target":"394","id":"8607","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"71","target":"107","id":"3107","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"309","target":"672","id":"7523","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"419","target":"489","id":"8897","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"33","target":"64","id":"2208","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"154","target":"629","id":"4878","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"193","target":"729","id":"5614","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"337","target":"396","id":"7913","attributes":{"Weight":"1.0"},"color":"rgb(132,99,229)","size":1.0},{"source":"708","target":"733","id":"10671","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"42","target":"593","id":"2430","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"395","target":"411","id":"8634","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"207","target":"214","id":"5854","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"518","target":"611","id":"9835","attributes":{"Weight":"1.0"},"color":"rgb(148,164,115)","size":1.0},{"source":"7","target":"665","id":"1620","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"249","target":"478","id":"6551","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"257","target":"639","id":"6688","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"281","target":"285","id":"7077","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"438","target":"465","id":"9125","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"126","target":"265","id":"4272","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"240","target":"430","id":"6400","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"156","target":"341","id":"4911","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"116","target":"144","id":"4067","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"29","target":"459","id":"2132","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"347","target":"437","id":"8039","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"513","target":"681","id":"9799","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"406","target":"513","id":"8764","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"188","target":"716","id":"5527","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"494","target":"582","id":"9657","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"469","target":"669","id":"9455","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"263","target":"624","id":"6792","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"491","target":"735","id":"9634","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"144","target":"415","id":"4660","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"119","target":"501","id":"4142","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"140","target":"327","id":"4562","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"154","target":"227","id":"4863","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"396","target":"714","id":"8654","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"416","target":"482","id":"8863","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"8","target":"386","id":"1640","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"270","target":"684","id":"6914","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"436","target":"699","id":"9115","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"153","target":"304","id":"4849","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"245","target":"371","id":"6482","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"328","target":"464","id":"7785","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"64","target":"132","id":"2950","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"277","target":"716","id":"7022","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"109","target":"206","id":"3913","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"208","target":"479","id":"5878","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"321","target":"337","id":"7684","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"156","target":"683","id":"4921","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"139","target":"144","id":"4533","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"383","target":"403","id":"8472","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"226","target":"302","id":"6183","attributes":{"Weight":"1.0"},"color":"rgb(180,213,67)","size":1.0},{"source":"680","target":"686","id":"10629","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"398","target":"671","id":"8678","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"139","target":"713","id":"4555","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"70","target":"211","id":"3085","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"363","target":"417","id":"8205","attributes":{"Weight":"1.0"},"color":"rgb(132,148,164)","size":1.0},{"source":"403","target":"702","id":"8738","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"372","target":"456","id":"8310","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"124","target":"239","id":"4235","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"471","target":"541","id":"9471","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"154","target":"308","id":"4866","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"22","target":"640","id":"1971","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"298","target":"541","id":"7365","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"249","target":"661","id":"6557","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"117","target":"681","id":"4109","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"472","target":"562","id":"9481","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"18","target":"437","id":"1878","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"286","target":"332","id":"7166","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"306","target":"570","id":"7479","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"214","target":"512","id":"5983","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"33","target":"489","id":"2237","attributes":{"Weight":"1.0"},"color":"rgb(229,99,99)","size":1.0},{"source":"131","target":"428","id":"4379","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"273","target":"570","id":"6954","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"3","target":"352","id":"1522","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"371","target":"720","id":"8307","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"359","target":"463","id":"8174","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"27","target":"232","id":"2063","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"83","target":"705","id":"3387","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"451","target":"642","id":"9272","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"596","target":"690","id":"10310","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"64","target":"362","id":"2965","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"444","target":"469","id":"9210","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"246","target":"398","id":"6500","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"160","target":"715","id":"4997","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"175","target":"511","id":"5273","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"217","target":"626","id":"6039","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"250","target":"545","id":"6570","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"432","target":"535","id":"9057","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"729","target":"735","id":"10687","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"491","target":"689","id":"9628","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"121","target":"359","id":"4182","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"242","target":"326","id":"6433","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"288","target":"425","id":"7200","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"89","target":"246","id":"3517","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"145","target":"577","id":"4696","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"259","target":"597","id":"6724","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"55","target":"142","id":"2723","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"20","target":"530","id":"1928","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"192","target":"598","id":"5593","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"150","target":"629","id":"4797","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"210","target":"579","id":"5907","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"526","target":"655","id":"9908","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"28","target":"71","id":"2089","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"184","target":"633","id":"5449","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"324","target":"334","id":"7720","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"184","target":"538","id":"5448","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"390","target":"411","id":"8569","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"308","target":"462","id":"7503","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"83","target":"278","id":"3376","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"629","target":"679","id":"10451","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"402","target":"558","id":"8724","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"384","target":"386","id":"8483","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"49","target":"267","id":"2586","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"467","target":"599","id":"9434","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"350","target":"673","id":"8086","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"105","target":"701","id":"3856","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"322","target":"638","id":"7701","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"34","target":"104","id":"2245","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"161","target":"638","id":"5009","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"255","target":"356","id":"6648","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"2","target":"304","id":"1498","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"187","target":"444","id":"5500","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"54","target":"600","id":"2716","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"138","target":"590","id":"4528","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"134","target":"242","id":"4436","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"30","target":"201","id":"2148","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"147","target":"301","id":"4727","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"70","target":"487","id":"3099","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"24","target":"568","id":"2009","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"76","target":"565","id":"3232","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"569","target":"644","id":"10160","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"69","target":"281","id":"3059","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"108","target":"173","id":"3889","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"647","target":"725","id":"10534","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"178","target":"492","id":"5338","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"496","target":"682","id":"9676","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"21","target":"22","id":"1932","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"48","target":"439","id":"2570","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"36","target":"467","id":"2298","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"124","target":"207","id":"4230","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"571","target":"652","id":"10175","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"37","target":"662","id":"2325","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"28","target":"579","id":"2116","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"338","target":"496","id":"7928","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"48","target":"695","id":"2575","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"110","target":"155","id":"3933","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"177","target":"422","id":"5312","attributes":{"Weight":"1.0"},"color":"rgb(132,229,99)","size":1.0},{"source":"579","target":"705","id":"10240","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"181","target":"234","id":"5389","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"291","target":"416","id":"7259","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"302","target":"637","id":"7425","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"205","target":"493","id":"5826","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"333","target":"578","id":"7860","attributes":{"Weight":"1.0"},"color":"rgb(196,196,67)","size":1.0},{"source":"654","target":"685","id":"10569","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"280","target":"323","id":"7057","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"271","target":"364","id":"6919","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"466","target":"650","id":"9421","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"449","target":"481","id":"9250","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"363","target":"587","id":"8210","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"129","target":"165","id":"4327","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"94","target":"496","id":"3629","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"307","target":"313","id":"7485","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"87","target":"196","id":"3456","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"522","target":"654","id":"9869","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"374","target":"480","id":"8338","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"81","target":"541","id":"3341","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"303","target":"575","id":"7441","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"340","target":"590","id":"7960","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"231","target":"603","id":"6273","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"269","target":"413","id":"6897","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"436","target":"696","id":"9114","attributes":{"Weight":"1.0"},"color":"rgb(229,67,148)","size":1.0},{"source":"578","target":"655","id":"10228","attributes":{"Weight":"1.0"},"color":"rgb(115,196,148)","size":1.0},{"source":"309","target":"701","id":"7524","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"363","target":"500","id":"8206","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"516","target":"635","id":"9816","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"475","target":"498","id":"9513","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"269","target":"561","id":"6901","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"500","target":"649","id":"9710","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"245","target":"429","id":"6486","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"394","target":"560","id":"8628","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"195","target":"582","id":"5647","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"492","target":"718","id":"9642","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"150","target":"316","id":"4783","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"554","target":"701","id":"10081","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"357","target":"581","id":"8157","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"638","target":"657","id":"10489","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"523","target":"728","id":"9884","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"130","target":"369","id":"4357","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"189","target":"333","id":"5536","attributes":{"Weight":"1.0"},"color":"rgb(229,148,67)","size":1.0},{"source":"321","target":"407","id":"7686","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"142","target":"300","id":"4611","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"17","target":"229","id":"1848","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"490","target":"622","id":"9616","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"431","target":"567","id":"9045","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"613","target":"659","id":"10390","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"503","target":"664","id":"9730","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"204","target":"497","id":"5809","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"532","target":"667","id":"9954","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"198","target":"697","id":"5713","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"360","target":"588","id":"8189","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"254","target":"656","id":"6643","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"492","target":"536","id":"9636","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"362","target":"512","id":"8201","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"75","target":"587","id":"3208","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"481","target":"622","id":"9563","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"290","target":"377","id":"7239","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"105","target":"304","id":"3847","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"179","target":"547","id":"5358","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"314","target":"606","id":"7591","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"374","target":"498","id":"8339","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"102","target":"429","id":"3796","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"307","target":"477","id":"7491","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"19","target":"422","id":"1901","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"281","target":"441","id":"7080","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"560","target":"658","id":"10111","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"511","target":"618","id":"9792","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"244","target":"566","id":"6469","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"287","target":"358","id":"7181","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"177","target":"693","id":"5326","attributes":{"Weight":"1.0"},"color":"rgb(115,229,99)","size":1.0},{"source":"299","target":"535","id":"7378","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"348","target":"713","id":"8060","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"407","target":"705","id":"8776","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"293","target":"568","id":"7285","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"572","target":"643","id":"10181","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"19","target":"249","id":"1896","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"53","target":"538","id":"2682","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"135","target":"431","id":"4466","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"534","target":"714","id":"9973","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"573","target":"629","id":"10190","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"213","target":"326","id":"5958","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"456","target":"464","id":"9321","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"399","target":"561","id":"8690","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"85","target":"567","id":"3426","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"679","target":"707","id":"10628","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"18","target":"118","id":"1867","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"294","target":"381","id":"7297","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"385","target":"648","id":"8513","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"280","target":"717","id":"7074","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"276","target":"317","id":"6993","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"11","target":"670","id":"1726","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"491","target":"734","id":"9633","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"463","target":"607","id":"9393","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"84","target":"210","id":"3392","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"61","target":"613","id":"2892","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"288","target":"543","id":"7210","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"88","target":"453","id":"3497","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"135","target":"490","id":"4470","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"127","target":"671","id":"4301","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"177","target":"654","id":"5321","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"35","target":"273","id":"2272","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"368","target":"499","id":"8268","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"245","target":"319","id":"6479","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"365","target":"406","id":"8233","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"188","target":"277","id":"5512","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"145","target":"431","id":"4686","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"369","target":"652","id":"8282","attributes":{"Weight":"1.0"},"color":"rgb(148,115,148)","size":1.0},{"source":"142","target":"653","id":"4622","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"479","target":"620","id":"9546","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"67","target":"183","id":"3014","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"271","target":"504","id":"6921","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"602","target":"661","id":"10334","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"417","target":"714","id":"8878","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"21","target":"289","id":"1942","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"201","target":"353","id":"5756","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"579","target":"662","id":"10239","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"177","target":"386","id":"5310","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"298","target":"313","id":"7355","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"81","target":"680","id":"3343","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"218","target":"582","id":"6059","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"80","target":"232","id":"3309","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"154","target":"183","id":"4861","attributes":{"Weight":"1.0"},"color":"rgb(180,148,132)","size":1.0},{"source":"279","target":"422","id":"7040","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"438","target":"491","id":"9127","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"379","target":"706","id":"8419","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"109","target":"727","id":"3928","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"525","target":"585","id":"9898","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"64","target":"445","id":"2968","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"221","target":"422","id":"6101","attributes":{"Weight":"1.0"},"color":"rgb(132,229,148)","size":1.0},{"source":"257","target":"485","id":"6683","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"474","target":"638","id":"9506","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"368","target":"552","id":"8271","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"242","target":"718","id":"6446","attributes":{"Weight":"1.0"},"color":"rgb(100,148,148)","size":1.0},{"source":"154","target":"164","id":"4860","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"58","target":"482","id":"2809","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"209","target":"361","id":"5893","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"59","target":"622","id":"2830","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"368","target":"643","id":"8274","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"93","target":"216","id":"3600","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"84","target":"488","id":"3399","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"306","target":"598","id":"7481","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"572","target":"591","id":"10179","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"490","target":"728","id":"9621","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"53","target":"184","id":"2673","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"525","target":"631","id":"9900","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"149","target":"496","id":"4767","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"70","target":"450","id":"3096","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"135","target":"720","id":"4480","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"222","target":"489","id":"6124","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"469","target":"624","id":"9452","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"129","target":"685","id":"4347","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"6","target":"313","id":"1588","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"257","target":"657","id":"6689","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"522","target":"567","id":"9866","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"327","target":"577","id":"7770","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"113","target":"488","id":"4014","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"318","target":"446","id":"7640","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"15","target":"585","id":"1816","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"32","target":"694","id":"2205","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"58","target":"481","id":"2808","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"203","target":"442","id":"5790","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"258","target":"303","id":"6695","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"568","target":"640","id":"10148","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"529","target":"717","id":"9942","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"160","target":"246","id":"4981","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"333","target":"601","id":"7863","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"460","target":"685","id":"9371","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"147","target":"299","id":"4725","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"293","target":"640","id":"7286","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"298","target":"620","id":"7366","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"235","target":"552","id":"6339","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"291","target":"452","id":"7263","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"643","target":"644","id":"10514","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"503","target":"520","id":"9726","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"250","target":"401","id":"6565","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"11","target":"628","id":"1724","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"190","target":"379","id":"5556","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"99","target":"370","id":"3738","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"36","target":"137","id":"2289","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"45","target":"64","id":"2494","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"190","target":"259","id":"5553","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"366","target":"369","id":"8241","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"149","target":"396","id":"4765","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"468","target":"471","id":"9437","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"213","target":"502","id":"5964","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"265","target":"375","id":"6821","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"459","target":"468","id":"9346","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"273","target":"584","id":"6955","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"480","target":"573","id":"9552","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"40","target":"666","id":"2393","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"292","target":"640","id":"7276","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"63","target":"726","id":"2945","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"309","target":"366","id":"7516","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"445","target":"692","id":"9223","attributes":{"Weight":"1.0"},"color":"rgb(196,180,67)","size":1.0},{"source":"516","target":"637","id":"9818","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"151","target":"323","id":"4813","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"97","target":"526","id":"3698","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"28","target":"349","id":"2105","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"64","target":"252","id":"2959","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"418","target":"525","id":"8883","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"145","target":"490","id":"4692","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"86","target":"216","id":"3436","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"315","target":"599","id":"7604","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"18","target":"709","id":"1885","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"216","target":"333","id":"6010","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"224","target":"308","id":"6146","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"260","target":"422","id":"6736","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"651","target":"689","id":"10553","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"391","target":"658","id":"8591","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"190","target":"597","id":"5564","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"471","target":"550","id":"9472","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"330","target":"731","id":"7829","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"194","target":"706","id":"5634","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"58","target":"449","id":"2805","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"301","target":"624","id":"7412","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"116","target":"646","id":"4090","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"450","target":"642","id":"9264","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"363","target":"691","id":"8213","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"78","target":"599","id":"3275","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"140","target":"386","id":"4565","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"172","target":"679","id":"5228","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"384","target":"602","id":"8490","attributes":{"Weight":"1.0"},"color":"rgb(115,229,99)","size":1.0},{"source":"86","target":"528","id":"3444","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"77","target":"686","id":"3260","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"375","target":"454","id":"8352","attributes":{"Weight":"1.0"},"color":"rgb(83,229,115)","size":1.0},{"source":"37","target":"407","id":"2317","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"413","target":"561","id":"8838","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"219","target":"630","id":"6075","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"80","target":"231","id":"3308","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"239","target":"354","id":"6390","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"508","target":"589","id":"9772","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"6","target":"479","id":"1595","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"29","target":"541","id":"2140","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"310","target":"541","id":"7535","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"99","target":"304","id":"3734","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"538","target":"736","id":"10001","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"453","target":"693","id":"9291","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"188","target":"511","id":"5517","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"79","target":"678","id":"3301","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"408","target":"667","id":"8784","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"247","target":"666","id":"6527","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"82","target":"122","id":"3345","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"128","target":"727","id":"4324","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"238","target":"415","id":"6374","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"217","target":"579","id":"6037","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"543","target":"573","id":"10024","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"326","target":"476","id":"7751","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"578","target":"661","id":"10229","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"111","target":"316","id":"3967","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"445","target":"723","id":"9224","attributes":{"Weight":"1.0"},"color":"rgb(196,180,67)","size":1.0},{"source":"197","target":"609","id":"5694","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"641","target":"732","id":"10509","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"131","target":"593","id":"4387","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"86","target":"601","id":"3448","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"145","target":"547","id":"4694","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"329","target":"609","id":"7807","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"272","target":"590","id":"6942","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"101","target":"484","id":"3781","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"52","target":"549","id":"2663","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"640","target":"704","id":"10501","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"571","target":"593","id":"10169","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"59","target":"237","id":"2818","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"455","target":"653","id":"9315","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"85","target":"699","id":"3429","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"449","target":"622","id":"9253","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"646","target":"650","id":"10520","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"381","target":"589","id":"8443","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"234","target":"734","id":"6328","attributes":{"Weight":"1.0"},"color":"rgb(67,83,229)","size":1.0},{"source":"540","target":"695","id":"10010","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"549","target":"551","id":"10055","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"537","target":"636","id":"9989","attributes":{"Weight":"1.0"},"color":"rgb(99,229,83)","size":1.0},{"source":"398","target":"583","id":"8670","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"637","target":"697","id":"10486","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"527","target":"667","id":"9916","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"440","target":"565","id":"9157","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"238","target":"717","id":"6386","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"294","target":"373","id":"7296","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"389","target":"495","id":"8556","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"263","target":"653","id":"6793","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"84","target":"182","id":"3391","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"134","target":"156","id":"4434","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"33","target":"320","id":"2225","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"543","target":"565","id":"10023","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"238","target":"434","id":"6375","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"66","target":"247","id":"2996","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"474","target":"671","id":"9509","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"232","target":"258","id":"6281","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"29","target":"81","id":"2124","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"102","target":"120","id":"3783","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"302","target":"697","id":"7428","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"158","target":"243","id":"4946","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"21","target":"174","id":"1940","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"147","target":"300","id":"4726","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"183","target":"642","id":"5433","attributes":{"Weight":"1.0"},"color":"rgb(99,229,148)","size":1.0},{"source":"58","target":"537","id":"2811","attributes":{"Weight":"1.0"},"color":"rgb(132,229,83)","size":1.0},{"source":"90","target":"117","id":"3534","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"114","target":"649","id":"4041","attributes":{"Weight":"1.0"},"color":"rgb(115,148,164)","size":1.0},{"source":"303","target":"348","id":"7433","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"215","target":"693","id":"6003","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"704","target":"708","id":"10666","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"631","target":"722","id":"10457","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"59","target":"123","id":"2815","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"372","target":"464","id":"8311","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"135","target":"529","id":"4471","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"25","target":"641","id":"2029","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"131","target":"294","id":"4375","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"81","target":"686","id":"3344","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"188","target":"286","id":"5513","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"127","target":"690","id":"4302","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"152","target":"336","id":"4832","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"91","target":"476","id":"3566","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"7","target":"260","id":"1606","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"351","target":"700","id":"8101","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"598","target":"666","id":"10320","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"260","target":"364","id":"6734","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"133","target":"350","id":"4421","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"10","target":"219","id":"1691","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"307","target":"458","id":"7486","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"532","target":"625","id":"9952","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"558","target":"696","id":"10105","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"232","target":"575","id":"6288","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"427","target":"464","id":"8994","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"371","target":"644","id":"8303","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"418","target":"582","id":"8885","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"426","target":"536","id":"8986","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"382","target":"730","id":"8469","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"130","target":"670","id":"4367","attributes":{"Weight":"1.0"},"color":"rgb(67,148,213)","size":1.0},{"source":"229","target":"276","id":"6234","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"26","target":"481","id":"2052","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"311","target":"460","id":"7542","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"200","target":"691","id":"5746","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"576","target":"583","id":"10210","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"240","target":"634","id":"6410","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"118","target":"590","id":"4124","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"151","target":"717","id":"4828","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"343","target":"617","id":"8002","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"39","target":"167","id":"2359","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"118","target":"340","id":"4116","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"257","target":"692","id":"6691","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"299","target":"432","id":"7373","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"197","target":"426","id":"5686","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"88","target":"690","id":"3507","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"139","target":"603","id":"4550","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"302","target":"538","id":"7421","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"11","target":"447","id":"1720","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"158","target":"293","id":"4948","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"514","target":"539","id":"9802","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"621","target":"657","id":"10418","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"258","target":"576","id":"6705","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"404","target":"628","id":"8748","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"99","target":"219","id":"3731","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"569","target":"720","id":"10162","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"29","target":"148","id":"2125","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"435","target":"722","id":"9105","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"138","target":"272","id":"4518","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"91","target":"213","id":"3558","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"383","target":"702","id":"8481","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"183","target":"335","id":"5422","attributes":{"Weight":"1.0"},"color":"rgb(99,229,99)","size":1.0},{"source":"466","target":"491","id":"9418","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"377","target":"399","id":"8383","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"116","target":"583","id":"4086","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"498","target":"623","id":"9695","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"31","target":"630","id":"2182","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"183","target":"312","id":"5421","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"110","target":"720","id":"3958","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"163","target":"550","id":"5050","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"253","target":"660","id":"6628","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"1","target":"585","id":"1481","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"116","target":"238","id":"4071","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"298","target":"470","id":"7359","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"224","target":"376","id":"6150","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"187","target":"432","id":"5499","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"30","target":"235","id":"2151","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"421","target":"543","id":"8921","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"7","target":"215","id":"1604","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"200","target":"383","id":"5735","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"521","target":"663","id":"9861","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"164","target":"316","id":"5060","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"189","target":"214","id":"5530","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"79","target":"573","id":"3295","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"132","target":"239","id":"4403","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"117","target":"683","id":"4110","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"152","target":"360","id":"4834","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"101","target":"214","id":"3768","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"105","target":"181","id":"3844","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"374","target":"517","id":"8340","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"306","target":"389","id":"7476","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"501","target":"550","id":"9715","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"348","target":"398","id":"8047","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"621","target":"671","id":"10419","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"313","target":"470","id":"7571","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"83","target":"113","id":"3371","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"232","target":"616","id":"6292","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"633","target":"636","id":"10466","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"73","target":"198","id":"3152","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"357","target":"509","id":"8153","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"13","target":"495","id":"1767","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"136","target":"563","id":"4494","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"155","target":"572","id":"4898","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"260","target":"504","id":"6738","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"267","target":"546","id":"6857","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"59","target":"125","id":"2816","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"533","target":"579","id":"9961","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"112","target":"207","id":"3989","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"56","target":"685","id":"2765","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"277","target":"517","id":"7010","attributes":{"Weight":"1.0"},"color":"rgb(148,196,115)","size":1.0},{"source":"317","target":"581","id":"7635","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"626","target":"705","id":"10442","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"198","target":"658","id":"5710","attributes":{"Weight":"1.0"},"color":"rgb(180,148,115)","size":1.0},{"source":"229","target":"317","id":"6236","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"65","target":"118","id":"2975","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"124","target":"230","id":"4234","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"428","target":"618","id":"9011","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"574","target":"702","id":"10199","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"334","target":"489","id":"7875","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"97","target":"519","id":"3696","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"180","target":"703","id":"5386","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"497","target":"635","id":"9682","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"157","target":"455","id":"4932","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"442","target":"611","id":"9189","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"164","target":"572","id":"5067","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"122","target":"623","id":"4207","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"403","target":"706","id":"8739","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"111","target":"643","id":"3982","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"63","target":"621","id":"2937","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"141","target":"416","id":"4591","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"520","target":"664","id":"9850","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"585","target":"605","id":"10263","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"81","target":"313","id":"3330","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"18","target":"520","id":"1880","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"248","target":"550","id":"6536","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"167","target":"168","id":"5115","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"14","target":"640","id":"1794","attributes":{"Weight":"1.0"},"color":"rgb(148,148,83)","size":1.0},{"source":"14","target":"500","id":"1788","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"415","target":"603","id":"8850","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"369","target":"630","id":"8281","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"56","target":"140","id":"2747","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"145","target":"280","id":"4678","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"209","target":"214","id":"5885","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"26","target":"482","id":"2053","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"59","target":"675","id":"2831","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"45","target":"291","id":"2501","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"428","target":"528","id":"9004","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"88","target":"162","id":"3482","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"51","target":"243","id":"2633","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"544","target":"681","id":"10032","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"281","target":"734","id":"7094","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"543","target":"728","id":"10031","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"419","target":"645","id":"8905","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"426","target":"551","id":"8988","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"381","target":"472","id":"8434","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"76","target":"473","id":"3225","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"527","target":"567","id":"9912","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"356","target":"410","id":"8141","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"161","target":"485","id":"5005","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"283","target":"561","id":"7133","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"38","target":"39","id":"2328","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"51","target":"708","id":"2643","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"134","target":"341","id":"4439","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"201","target":"235","id":"5751","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"63","target":"264","id":"2930","attributes":{"Weight":"1.0"},"color":"rgb(115,83,229)","size":1.0},{"source":"676","target":"728","id":"10621","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"286","target":"716","id":"7179","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"684","target":"697","id":"10633","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"358","target":"451","id":"8162","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"112","target":"361","id":"3999","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"335","target":"603","id":"7889","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"212","target":"642","id":"5951","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"412","target":"559","id":"8830","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"114","target":"726","id":"4046","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"146","target":"217","id":"4706","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"64","target":"189","id":"2951","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"244","target":"396","id":"6464","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"92","target":"456","id":"3585","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"80","target":"167","id":"3307","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"521","target":"565","id":"9856","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"109","target":"336","id":"3915","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"104","target":"509","id":"3835","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"226","target":"240","id":"6182","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"480","target":"611","id":"9554","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"305","target":"552","id":"7471","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"119","target":"152","id":"4132","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"317","target":"592","id":"7636","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"257","target":"297","id":"6678","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"514","target":"624","id":"9804","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"48","target":"243","id":"2567","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"372","target":"427","id":"8309","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"209","target":"239","id":"5888","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"381","target":"443","id":"8433","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"385","target":"577","id":"8509","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"165","target":"352","id":"5084","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"254","target":"660","id":"6644","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"10","target":"701","id":"1703","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"200","target":"259","id":"5731","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"409","target":"498","id":"8795","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"12","target":"287","id":"1737","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"14","target":"16","id":"1773","attributes":{"Weight":"1.0"},"color":"rgb(148,148,83)","size":1.0},{"source":"179","target":"227","id":"5346","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"245","target":"373","id":"6483","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"471","target":"477","id":"9467","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"575","target":"681","id":"10208","attributes":{"Weight":"1.0"},"color":"rgb(83,229,99)","size":1.0},{"source":"462","target":"645","id":"9388","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"83","target":"321","id":"3377","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"95","target":"136","id":"3642","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"252","target":"482","id":"6609","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"494","target":"722","id":"9662","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"171","target":"534","id":"5201","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"41","target":"599","id":"2410","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"438","target":"646","id":"9128","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"490","target":"529","id":"9612","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"393","target":"412","id":"8612","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"215","target":"661","id":"5999","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"100","target":"234","id":"3751","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"305","target":"489","id":"7468","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"136","target":"588","id":"4495","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"203","target":"518","id":"5796","attributes":{"Weight":"1.0"},"color":"rgb(148,164,115)","size":1.0},{"source":"475","target":"518","id":"9515","attributes":{"Weight":"1.0"},"color":"rgb(148,164,115)","size":1.0},{"source":"189","target":"320","id":"5535","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"268","target":"290","id":"6863","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"272","target":"387","id":"6937","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"66","target":"598","id":"3009","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"493","target":"585","id":"9648","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"216","target":"589","id":"6019","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"469","target":"653","id":"9454","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"292","target":"540","id":"7274","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"359","target":"531","id":"8176","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"14","target":"691","id":"1796","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"304","target":"526","id":"7456","attributes":{"Weight":"1.0"},"color":"rgb(67,115,229)","size":1.0},{"source":"97","target":"205","id":"3687","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"420","target":"533","id":"8908","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"618","target":"652","id":"10407","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"108","target":"526","id":"3901","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"692","target":"723","id":"10653","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"544","target":"683","id":"10033","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"103","target":"104","id":"3804","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"70","target":"555","id":"3100","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"274","target":"493","id":"6962","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"97","target":"631","id":"3702","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"46","target":"449","id":"2531","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"241","target":"721","id":"6430","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"185","target":"463","id":"5467","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"157","target":"535","id":"4937","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"25","target":"540","id":"2026","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"556","target":"660","id":"10091","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"471","target":"479","id":"9468","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"158","target":"708","id":"4956","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"221","target":"358","id":"6098","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"359","target":"685","id":"8180","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"12","target":"261","id":"1736","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"141","target":"478","id":"4597","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"548","target":"552","id":"10052","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"90","target":"683","id":"3553","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"68","target":"633","id":"3047","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"2","target":"106","id":"1492","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"191","target":"461","id":"5575","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"582","target":"605","id":"10250","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"7","target":"610","id":"1618","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"487","target":"600","id":"9591","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"237","target":"481","id":"6363","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"165","target":"185","id":"5079","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"690","target":"693","id":"10646","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"3","target":"191","id":"1519","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"323","target":"376","id":"7708","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"333","target":"511","id":"7857","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"132","target":"354","id":"4407","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"465","target":"466","id":"9405","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"576","target":"713","id":"10216","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"172","target":"179","id":"5212","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"206","target":"617","id":"5850","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"63","target":"297","id":"2931","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"98","target":"549","id":"3719","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"77","target":"459","id":"3249","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"318","target":"576","id":"7648","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"191","target":"430","id":"5574","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"442","target":"517","id":"9186","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"63","target":"127","id":"2924","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"555","target":"707","id":"10086","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"81","target":"298","id":"3327","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"311","target":"677","id":"7552","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"460","target":"562","id":"9361","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"131","target":"589","id":"4386","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"199","target":"709","id":"5730","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"290","target":"390","id":"7240","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"472","target":"682","id":"9488","attributes":{"Weight":"1.0"},"color":"rgb(213,67,229)","size":1.0},{"source":"98","target":"328","id":"3708","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"79","target":"454","id":"3289","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"55","target":"175","id":"2727","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"16","target":"704","id":"1839","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"593","target":"618","id":"10297","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"505","target":"587","id":"9746","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"249","target":"404","id":"6544","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"409","target":"594","id":"8804","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"175","target":"432","id":"5269","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"346","target":"670","id":"8035","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"221","target":"451","id":"6104","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"175","target":"325","id":"5268","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"220","target":"670","id":"6090","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"129","target":"430","id":"4339","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"58","target":"675","id":"2814","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"432","target":"623","id":"9062","attributes":{"Weight":"1.0"},"color":"rgb(99,148,196)","size":1.0},{"source":"185","target":"486","id":"5468","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"238","target":"342","id":"6372","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"657","target":"715","id":"10578","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"89","target":"161","id":"3516","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"652","target":"703","id":"10561","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"9","target":"368","id":"1674","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"253","target":"696","id":"6631","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"491","target":"729","id":"9631","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"259","target":"342","id":"6713","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"49","target":"103","id":"2580","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"6","target":"208","id":"1584","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"452","target":"478","id":"9274","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"437","target":"503","id":"9117","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"255","target":"545","id":"6654","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"162","target":"596","id":"5029","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"442","target":"475","id":"9183","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"47","target":"545","id":"2555","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"50","target":"154","id":"2606","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"116","target":"603","id":"4087","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"195","target":"526","id":"5646","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"141","target":"422","id":"4592","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"261","target":"451","id":"6761","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"193","target":"465","id":"5604","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"203","target":"433","id":"5789","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"123","target":"478","id":"4222","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"259","target":"403","id":"6717","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"322","target":"726","id":"7706","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"21","target":"641","id":"1951","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"241","target":"260","id":"6412","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"241","target":"497","id":"6419","attributes":{"Weight":"1.0"},"color":"rgb(148,229,67)","size":1.0},{"source":"225","target":"608","id":"6179","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"196","target":"473","id":"5664","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"480","target":"623","id":"9556","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"423","target":"696","id":"8950","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"472","target":"663","id":"9487","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"334","target":"353","id":"7870","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"99","target":"554","id":"3740","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"413","target":"731","id":"8840","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"74","target":"677","id":"3188","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"42","target":"486","id":"2425","attributes":{"Weight":"1.0"},"color":"rgb(229,180,67)","size":1.0},{"source":"200","target":"363","id":"5733","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"233","target":"717","id":"6311","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"502","target":"544","id":"9723","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"124","target":"344","id":"4239","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"53","target":"312","id":"2678","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"304","target":"309","id":"7450","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"339","target":"364","id":"7938","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"479","target":"518","id":"9544","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"124","target":"512","id":"4246","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"410","target":"423","id":"8810","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"236","target":"499","id":"6349","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"233","target":"331","id":"6299","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"82","target":"442","id":"3354","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"55","target":"535","id":"2739","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"1","target":"494","id":"1476","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"385","target":"433","id":"8500","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"27","target":"713","id":"2085","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"103","target":"564","id":"3820","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"40","target":"66","id":"2376","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"697","target":"736","id":"10661","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"159","target":"657","id":"4975","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"583","target":"702","id":"10258","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"290","target":"405","id":"7247","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"267","target":"276","id":"6847","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"386","target":"654","id":"8527","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"139","target":"654","id":"4552","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"348","target":"430","id":"8049","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"244","target":"659","id":"6473","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"11","target":"59","id":"1706","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"466","target":"724","id":"9424","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"505","target":"597","id":"9747","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"241","target":"661","id":"6425","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"301","target":"698","id":"7415","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"70","target":"419","id":"3094","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"304","target":"352","id":"7451","attributes":{"Weight":"1.0"},"color":"rgb(148,132,148)","size":1.0},{"source":"369","target":"370","id":"8277","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"253","target":"255","id":"6616","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"113","target":"626","id":"4017","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"356","target":"660","id":"8148","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"184","target":"688","id":"5454","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"54","target":"211","id":"2694","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"606","target":"673","id":"10355","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"581","target":"592","id":"10248","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"636","target":"736","id":"10483","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"42","target":"332","id":"2422","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"150","target":"318","id":"4784","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"155","target":"677","id":"4903","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"405","target":"561","id":"8759","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"69","target":"646","id":"3073","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"191","target":"226","id":"5569","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"97","target":"108","id":"3684","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"299","target":"698","id":"7385","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"30","target":"236","id":"2152","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"150","target":"713","id":"4801","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"61","target":"507","id":"2887","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"110","target":"227","id":"3936","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"13","target":"41","id":"1754","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"458","target":"459","id":"9334","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"149","target":"338","id":"4762","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"96","target":"304","id":"3674","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"124","target":"209","id":"4231","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"50","target":"720","id":"2630","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"95","target":"501","id":"3655","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"179","target":"707","id":"5368","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"236","target":"489","id":"6348","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"258","target":"434","id":"6702","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"11","target":"18","id":"1704","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"430","target":"583","id":"9033","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"99","target":"181","id":"3730","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"423","target":"556","id":"8943","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"7","target":"721","id":"1624","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"64","target":"461","id":"2969","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"176","target":"197","id":"5283","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"196","target":"594","id":"5673","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"602","target":"690","id":"10336","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"327","target":"611","id":"7771","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"325","target":"682","id":"7745","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"171","target":"314","id":"5192","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"103","target":"267","id":"3808","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"35","target":"495","id":"2279","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"92","target":"178","id":"3576","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"225","target":"261","id":"6167","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"402","target":"660","id":"8726","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"296","target":"493","id":"7326","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"168","target":"185","id":"5130","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"211","target":"319","id":"5917","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"194","target":"383","id":"5623","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"92","target":"536","id":"3588","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"281","target":"282","id":"7076","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"365","target":"530","id":"8237","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"258","target":"616","id":"6708","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"3","target":"168","id":"1517","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"86","target":"188","id":"3435","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"234","target":"370","id":"6318","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"120","target":"489","id":"4163","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"120","target":"228","id":"4153","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"234","target":"457","id":"6319","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"620","target":"680","id":"10413","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"412","target":"560","id":"8831","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"316","target":"629","id":"7619","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"323","target":"547","id":"7714","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"135","target":"151","id":"4451","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"32","target":"557","id":"2200","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"88","target":"665","id":"3506","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"145","target":"455","id":"4691","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"346","target":"387","id":"8027","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"412","target":"731","id":"8834","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"230","target":"320","id":"6249","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"400","target":"401","id":"8694","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"335","target":"707","id":"7893","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"126","target":"134","id":"4268","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"112","target":"483","id":"4002","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"68","target":"538","id":"3045","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"5","target":"348","id":"1568","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"117","target":"365","id":"4101","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"589","target":"728","id":"10285","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"324","target":"489","id":"7724","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"285","target":"724","id":"7159","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"335","target":"462","id":"7884","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"89","target":"160","id":"3515","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"505","target":"706","id":"9751","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"419","target":"569","id":"8900","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"219","target":"701","id":"6077","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"53","target":"67","id":"2669","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"43","target":"65","id":"2437","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"439","target":"709","id":"9147","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"359","target":"634","id":"8178","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"81","target":"468","id":"3333","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"538","target":"697","id":"10000","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"304","target":"369","id":"7453","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"127","target":"621","id":"4296","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"28","target":"319","id":"2102","attributes":{"Weight":"1.0"},"color":"rgb(67,180,229)","size":1.0},{"source":"53","target":"516","id":"2680","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"163","target":"506","id":"5049","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"87","target":"490","id":"3467","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"50","target":"245","id":"2610","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"234","target":"701","id":"6327","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"138","target":"670","id":"4531","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"116","target":"335","id":"4076","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"29","target":"470","id":"2134","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"450","target":"487","id":"9259","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"75","target":"702","id":"3212","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"226","target":"352","id":"6184","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"11","target":"520","id":"1722","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"393","target":"658","id":"8618","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"352","target":"359","id":"8103","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"450","target":"619","id":"9263","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"268","target":"412","id":"6875","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"79","target":"203","id":"3281","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"213","target":"265","id":"5957","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"482","target":"675","id":"9568","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"61","target":"687","id":"2897","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"290","target":"399","id":"7246","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"539","target":"669","id":"10005","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"334","target":"355","id":"7871","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"62","target":"126","id":"2903","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"153","target":"181","id":"4846","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"188","target":"580","id":"5520","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"99","target":"153","id":"3729","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"232","target":"434","id":"6287","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"399","target":"559","id":"8688","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"316","target":"455","id":"7614","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"198","target":"516","id":"5703","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"132","target":"344","id":"4406","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"312","target":"633","id":"7560","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"439","target":"640","id":"9142","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"202","target":"419","id":"5773","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"602","target":"721","id":"10340","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"208","target":"477","id":"5877","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"145","target":"678","id":"4699","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"646","target":"725","id":"10525","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"194","target":"537","id":"5627","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"528","target":"652","id":"9931","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"598","target":"599","id":"10319","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"474","target":"639","id":"9507","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"32","target":"674","id":"2204","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"135","target":"443","id":"4468","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"90","target":"126","id":"3535","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"25","target":"695","id":"2030","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"568","target":"695","id":"10150","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"220","target":"272","id":"6078","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"580","target":"619","id":"10244","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"519","target":"525","id":"9840","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"318","target":"528","id":"7644","attributes":{"Weight":"1.0"},"color":"rgb(148,196,67)","size":1.0},{"source":"173","target":"631","id":"5247","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"8","target":"172","id":"1633","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"72","target":"500","id":"3140","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"265","target":"681","id":"6828","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"220","target":"628","id":"6088","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"635","target":"684","id":"10475","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"321","target":"705","id":"7694","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"162","target":"610","id":"5031","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"74","target":"460","id":"3179","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"260","target":"261","id":"6729","attributes":{"Weight":"1.0"},"color":"rgb(115,229,148)","size":1.0},{"source":"78","target":"467","id":"3270","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"665","target":"721","id":"10600","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"69","target":"724","id":"3078","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"380","target":"389","id":"8420","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"468","target":"477","id":"9438","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"340","target":"670","id":"7963","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"359","target":"677","id":"8179","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"73","target":"302","id":"3155","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"156","target":"681","id":"4920","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"517","target":"636","id":"9830","attributes":{"Weight":"1.0"},"color":"rgb(99,229,115)","size":1.0},{"source":"369","target":"457","id":"8278","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"65","target":"272","id":"2979","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"319","target":"419","id":"7657","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"120","target":"186","id":"4150","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"5","target":"434","id":"1570","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"290","target":"559","id":"7252","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"14","target":"383","id":"1786","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"110","target":"294","id":"3940","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"28","target":"37","id":"2087","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"556","target":"558","id":"10089","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"568","target":"641","id":"10149","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"218","target":"525","id":"6056","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"497","target":"636","id":"9683","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"92","target":"549","id":"3589","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"47","target":"423","id":"2554","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"538","target":"633","id":"9994","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"497","target":"637","id":"9684","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"69","target":"82","id":"3056","attributes":{"Weight":"1.0"},"color":"rgb(67,164,196)","size":1.0},{"source":"24","target":"25","id":"1998","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"416","target":"661","id":"8867","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"393","target":"405","id":"8610","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"349","target":"719","id":"8075","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"327","target":"442","id":"7762","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"303","target":"409","id":"7434","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"143","target":"300","id":"4632","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"285","target":"465","id":"7151","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"185","target":"359","id":"5462","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"316","target":"678","id":"7622","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"8","target":"532","id":"1646","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"29","target":"77","id":"2123","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"404","target":"461","id":"8742","attributes":{"Weight":"1.0"},"color":"rgb(148,213,132)","size":1.0},{"source":"15","target":"525","id":"1813","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"96","target":"186","id":"3671","attributes":{"Weight":"1.0"},"color":"rgb(148,67,180)","size":1.0},{"source":"62","target":"681","id":"2919","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"38","target":"167","id":"2334","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"193","target":"285","id":"5599","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"101","target":"445","id":"3778","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"172","target":"460","id":"5217","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"442","target":"480","id":"9184","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"327","target":"648","id":"7774","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"119","target":"563","id":"4145","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"88","target":"591","id":"3501","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"278","target":"407","id":"7025","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"388","target":"423","id":"8545","attributes":{"Weight":"1.0"},"color":"rgb(229,148,83)","size":1.0},{"source":"351","target":"427","id":"8092","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"25","target":"704","id":"2031","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"45","target":"125","id":"2496","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"471","target":"680","id":"9474","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"514","target":"698","id":"9807","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"43","target":"664","id":"2455","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"323","target":"490","id":"7712","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"341","target":"544","id":"7972","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"165","target":"531","id":"5090","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"254","target":"356","id":"6633","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"126","target":"530","id":"4281","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"586","target":"717","id":"10270","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"414","target":"731","id":"8845","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"400","target":"694","id":"8705","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"65","target":"404","id":"2984","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"294","target":"591","id":"7305","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"354","target":"483","id":"8127","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"67","target":"637","id":"3028","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"144","target":"348","id":"4658","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"82","target":"648","id":"3366","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"30","target":"353","id":"2156","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"24","target":"708","id":"2014","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"312","target":"524","id":"7558","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"220","target":"347","id":"6081","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"507","target":"682","id":"9764","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"440","target":"562","id":"9156","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"639","target":"726","id":"10498","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"108","target":"582","id":"3902","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"214","target":"361","id":"5978","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"474","target":"715","id":"9510","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"26","target":"452","id":"2050","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"520","target":"590","id":"9848","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"86","target":"652","id":"3451","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"510","target":"592","id":"9785","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"44","target":"374","id":"2470","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"123","target":"452","id":"4221","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"187","target":"469","id":"5502","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"115","target":"574","id":"4059","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"734","target":"735","id":"10691","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"206","target":"501","id":"5845","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"153","target":"369","id":"4852","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"151","target":"331","id":"4814","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"221","target":"462","id":"6105","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"125","target":"661","id":"4266","attributes":{"Weight":"1.0"},"color":"rgb(180,229,67)","size":1.0},{"source":"41","target":"666","id":"2411","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"118","target":"437","id":"4121","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"587","target":"706","id":"10275","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"374","target":"475","id":"8337","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"633","target":"684","id":"10468","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"60","target":"552","id":"2857","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"244","target":"606","id":"6470","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"577","target":"687","id":"10222","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"382","target":"670","id":"8464","attributes":{"Weight":"1.0"},"color":"rgb(67,164,213)","size":1.0},{"source":"4","target":"437","id":"1546","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"75","target":"706","id":"3213","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"287","target":"642","id":"7193","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"228","target":"595","id":"6229","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"34","target":"256","id":"2248","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"468","target":"479","id":"9439","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"206","target":"248","id":"5838","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"12","target":"212","id":"1733","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"464","target":"718","id":"9404","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"18","target":"590","id":"1881","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"103","target":"592","id":"3822","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"35","target":"41","id":"2266","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"130","target":"630","id":"4366","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"89","target":"474","id":"3522","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"318","target":"546","id":"7645","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"33","target":"207","id":"2216","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"392","target":"405","id":"8597","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"322","target":"553","id":"7698","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"26","target":"422","id":"2047","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"231","target":"717","id":"6278","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"137","target":"599","id":"4513","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"147","target":"263","id":"4724","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"562","target":"713","id":"10124","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"182","target":"579","id":"5409","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"511","target":"580","id":"9789","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"159","target":"474","id":"4968","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"93","target":"171","id":"3596","attributes":{"Weight":"1.0"},"color":"rgb(213,115,148)","size":1.0},{"source":"301","target":"431","id":"7402","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"35","target":"389","id":"2277","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"328","target":"426","id":"7782","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"528","target":"618","id":"9928","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"398","target":"668","id":"8677","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"55","target":"624","id":"2742","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"12","target":"419","id":"1740","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"415","target":"434","id":"8846","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"164","target":"685","id":"5073","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"366","target":"370","id":"8242","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"148","target":"515","id":"4752","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"130","target":"234","id":"4352","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"49","target":"318","id":"2591","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"140","target":"375","id":"4563","attributes":{"Weight":"1.0"},"color":"rgb(83,229,99)","size":1.0},{"source":"183","target":"198","id":"5415","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"262","target":"320","id":"6772","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"83","target":"337","id":"3378","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"636","target":"637","id":"10479","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"425","target":"622","id":"8977","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"308","target":"642","id":"7510","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"27","target":"231","id":"2062","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"231","target":"415","id":"6266","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"363","target":"649","id":"8212","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"119","target":"448","id":"4141","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"9","target":"334","id":"1672","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"38","target":"121","id":"2330","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"289","target":"331","id":"7220","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"8","target":"677","id":"1655","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"35","target":"315","id":"2275","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"417","target":"606","id":"8873","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"35","target":"284","id":"2273","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"13","target":"467","id":"1766","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"247","target":"570","id":"6523","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"28","target":"107","id":"2092","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"299","target":"539","id":"7379","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"56","target":"179","id":"2750","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"221","target":"319","id":"6097","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"306","target":"315","id":"7474","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"327","target":"678","id":"7775","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"323","target":"586","id":"7716","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"282","target":"285","id":"7096","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"183","target":"184","id":"5414","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"34","target":"49","id":"2243","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"45","target":"449","id":"2506","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"422","target":"452","id":"8933","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"449","target":"728","id":"9256","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"343","target":"550","id":"7999","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"167","target":"463","id":"5124","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"135","target":"643","id":"4476","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"138","target":"408","id":"4524","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"109","target":"550","id":"3923","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"290","target":"414","id":"7251","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"175","target":"469","id":"5272","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"14","target":"537","id":"1790","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"269","target":"414","id":"6898","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"124","target":"214","id":"4232","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"76","target":"87","id":"3214","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"481","target":"675","id":"9565","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"68","target":"242","id":"3038","attributes":{"Weight":"1.0"},"color":"rgb(116,229,67)","size":1.0},{"source":"140","target":"577","id":"4574","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"386","target":"679","id":"8530","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"531","target":"607","id":"9947","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"519","target":"722","id":"9847","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"105","target":"630","id":"3854","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"328","target":"351","id":"7779","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"487","target":"642","id":"9593","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"457","target":"554","id":"9330","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"140","target":"685","id":"4582","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"232","target":"348","id":"6285","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"237","target":"478","id":"6362","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"74","target":"540","id":"3183","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"191","target":"324","id":"5571","attributes":{"Weight":"1.0"},"color":"rgb(229,132,99)","size":1.0},{"source":"433","target":"573","id":"9076","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"34","target":"509","id":"2258","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"60","target":"368","id":"2849","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"186","target":"499","id":"5490","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"211","target":"450","id":"5921","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"146","target":"705","id":"4720","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"532","target":"732","id":"9960","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"392","target":"395","id":"8595","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"149","target":"350","id":"4764","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"8","target":"56","id":"1626","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"64","target":"209","id":"2953","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"25","target":"640","id":"2028","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"11","target":"503","id":"1721","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"160","target":"281","id":"4983","attributes":{"Weight":"1.0"},"color":"rgb(115,83,229)","size":1.0},{"source":"446","target":"581","id":"9229","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"376","target":"490","id":"8368","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"409","target":"604","id":"8805","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"45","target":"461","id":"2508","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"18","target":"664","id":"1883","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"9","target":"353","id":"1673","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"244","target":"507","id":"6467","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"198","target":"312","id":"5701","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"450","target":"451","id":"9257","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"360","target":"378","id":"8182","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"507","target":"673","id":"9763","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"297","target":"726","id":"7352","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"178","target":"328","id":"5329","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"488","target":"579","id":"9597","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"671","target":"715","id":"10610","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"148","target":"680","id":"4756","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"233","target":"490","id":"6304","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"526","target":"605","id":"9905","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"179","target":"625","id":"5361","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"441","target":"735","id":"9180","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"316","target":"375","id":"7610","attributes":{"Weight":"1.0"},"color":"rgb(164,148,132)","size":1.0},{"source":"33","target":"319","id":"2224","attributes":{"Weight":"1.0"},"color":"rgb(148,180,148)","size":1.0},{"source":"117","target":"242","id":"4097","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"350","target":"682","id":"8087","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"319","target":"424","id":"7658","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"463","target":"486","id":"9391","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"509","target":"564","id":"9779","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"376","target":"717","id":"8376","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"142","target":"263","id":"4609","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"174","target":"243","id":"5250","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"64","target":"565","id":"2973","attributes":{"Weight":"1.0"},"color":"rgb(229,99,148)","size":1.0},{"source":"324","target":"552","id":"7727","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"177","target":"260","id":"5304","attributes":{"Weight":"1.0"},"color":"rgb(115,229,99)","size":1.0},{"source":"427","target":"456","id":"8993","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"379","target":"649","id":"8416","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"120","target":"552","id":"4166","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"374","target":"387","id":"8332","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"458","target":"680","id":"9344","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"91","target":"265","id":"3560","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"254","target":"410","id":"6637","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"117","target":"406","id":"4103","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"97","target":"435","id":"3692","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"61","target":"133","id":"2867","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"255","target":"694","id":"6661","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"244","target":"345","id":"6462","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"382","target":"452","id":"8453","attributes":{"Weight":"1.0"},"color":"rgb(132,164,148)","size":1.0},{"source":"424","target":"462","id":"8953","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"52","target":"536","id":"2662","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"209","target":"354","id":"5892","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"309","target":"630","id":"7521","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"112","target":"362","id":"4000","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"145","target":"376","id":"4685","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"32","target":"253","id":"2189","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"164","target":"677","id":"5072","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"254","target":"694","id":"6646","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"159","target":"715","id":"4978","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"410","target":"656","id":"8815","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"66","target":"570","id":"3007","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"234","target":"369","id":"6317","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"105","target":"219","id":"3845","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"141","target":"436","id":"4593","attributes":{"Weight":"1.0"},"color":"rgb(213,148,132)","size":1.0},{"source":"21","target":"51","id":"1937","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"366","target":"554","id":"8245","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"93","target":"601","id":"3612","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"70","target":"319","id":"3092","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"32","target":"401","id":"2194","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"437","target":"709","id":"9123","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"271","target":"661","id":"6927","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"67","target":"688","id":"3030","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"279","target":"547","id":"7046","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"130","target":"153","id":"4349","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"11","target":"199","id":"1710","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"183","target":"635","id":"5430","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"38","target":"463","id":"2346","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"26","target":"478","id":"2051","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"121","target":"430","id":"4183","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"276","target":"592","id":"7003","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"169","target":"229","id":"5147","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"178","target":"536","id":"5339","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"325","target":"350","id":"7732","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"110","target":"717","id":"3956","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"95","target":"496","id":"3654","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"167","target":"352","id":"5120","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"178","target":"549","id":"5340","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"402","target":"674","id":"8727","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"426","target":"718","id":"8992","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"33","target":"214","id":"2218","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"612","target":"677","id":"10385","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"260","target":"690","id":"6747","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"73","target":"636","id":"3163","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"205","target":"418","id":"5824","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"364","target":"578","id":"8219","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"252","target":"422","id":"6602","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"263","target":"660","id":"6794","attributes":{"Weight":"1.0"},"color":"rgb(180,67,164)","size":1.0},{"source":"57","target":"728","id":"2791","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"180","target":"277","id":"5372","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"476","target":"544","id":"9528","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"450","target":"555","id":"9260","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"446","target":"546","id":"9227","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"105","target":"153","id":"3843","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"223","target":"483","id":"6139","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"390","target":"391","id":"8562","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"111","target":"720","id":"3985","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"377","target":"413","id":"8387","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"348","target":"583","id":"8054","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"110","target":"151","id":"3931","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"339","target":"578","id":"7942","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"74","target":"707","id":"3192","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"27","target":"258","id":"2065","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"285","target":"729","id":"7161","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"293","target":"695","id":"7288","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"405","target":"413","id":"8755","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"129","target":"167","id":"4329","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"302","target":"636","id":"7424","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"447","target":"711","id":"9238","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"26","target":"141","id":"2041","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"334","target":"446","id":"7874","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"283","target":"405","id":"7126","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"84","target":"420","id":"3398","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"17","target":"509","id":"1859","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"94","target":"350","id":"3626","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"250","target":"356","id":"6563","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"47","target":"356","id":"2549","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"37","target":"705","id":"2326","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"56","target":"522","id":"2756","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"107","target":"210","id":"3875","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"14","target":"597","id":"1793","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"300","target":"539","id":"7394","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"174","target":"641","id":"5257","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"287","target":"419","id":"7182","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"52","target":"372","id":"2656","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"84","target":"321","id":"3395","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"248","target":"378","id":"6531","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"164","target":"294","id":"5059","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"63","target":"159","id":"2925","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"310","target":"686","id":"7538","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"488","target":"533","id":"9595","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"403","target":"597","id":"8735","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"49","target":"446","id":"2594","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"302","target":"688","id":"7427","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"38","target":"352","id":"2341","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"438","target":"734","id":"9138","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"116","target":"258","id":"4072","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"184","target":"516","id":"5446","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"431","target":"717","id":"9051","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"131","target":"618","id":"4389","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"587","target":"691","id":"10273","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"348","target":"616","id":"8056","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"281","target":"647","id":"7086","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"123","target":"125","id":"4211","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"549","target":"718","id":"10059","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"158","target":"695","id":"4954","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"388","target":"588","id":"8551","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"282","target":"689","id":"7109","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"286","target":"652","id":"7177","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"504","target":"602","id":"9735","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"15","target":"493","id":"1810","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"88","target":"602","id":"3503","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"229","target":"357","id":"6239","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"446","target":"592","id":"9230","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"415","target":"575","id":"8847","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"590","target":"670","id":"10288","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"336","target":"401","id":"7901","attributes":{"Weight":"1.0"},"color":"rgb(229,148,83)","size":1.0},{"source":"178","target":"464","id":"5337","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"395","target":"731","id":"8642","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"377","target":"411","id":"8385","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"111","target":"319","id":"3968","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"390","target":"392","id":"8563","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"280","target":"567","id":"7067","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"507","target":"659","id":"9762","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"60","target":"499","id":"2854","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"531","target":"711","id":"9949","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"122","target":"678","id":"4209","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"111","target":"349","id":"3969","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"5","target":"576","id":"1574","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"135","target":"676","id":"4477","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"81","target":"458","id":"3331","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"339","target":"514","id":"7941","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"173","target":"493","id":"5239","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"271","target":"693","id":"6931","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"4","target":"18","id":"1533","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"419","target":"608","id":"8902","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"439","target":"641","id":"9143","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"409","target":"728","id":"8809","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"617","target":"712","id":"10404","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"156","target":"365","id":"4912","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"275","target":"369","id":"6981","attributes":{"Weight":"1.0"},"color":"rgb(67,148,148)","size":1.0},{"source":"428","target":"704","id":"9015","attributes":{"Weight":"1.0"},"color":"rgb(229,115,67)","size":1.0},{"source":"126","target":"341","id":"4274","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"77","target":"468","id":"3250","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"440","target":"604","id":"9161","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"50","target":"150","id":"2605","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"100","target":"309","id":"3753","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"691","target":"702","id":"10649","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"8","target":"625","id":"1651","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"24","target":"292","id":"2005","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"48","target":"568","id":"2572","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"112","target":"484","id":"4003","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"153","target":"554","id":"4855","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"318","target":"564","id":"7647","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"436","target":"443","id":"9106","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"96","target":"105","id":"3666","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"143","target":"539","id":"4642","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"148","target":"471","id":"4749","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"280","target":"529","id":"7065","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"557","target":"674","id":"10098","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"39","target":"191","id":"2362","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"452","target":"622","id":"9279","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"411","target":"414","id":"8822","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"393","target":"411","id":"8611","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"264","target":"651","id":"6809","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"465","target":"734","id":"9416","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"93","target":"188","id":"3598","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"429","target":"710","id":"9026","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"22","target":"174","id":"1964","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"83","target":"182","id":"3373","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"327","target":"433","id":"7761","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"210","target":"705","id":"5911","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"329","target":"427","id":"7799","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"120","target":"235","id":"4154","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"319","target":"489","id":"7664","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"139","target":"415","id":"4543","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"276","target":"510","id":"6999","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"39","target":"531","id":"2371","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"687","target":"721","id":"10636","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"441","target":"725","id":"9176","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"326","target":"502","id":"7752","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"129","target":"397","id":"4338","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"173","target":"218","id":"5234","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"353","target":"489","id":"8118","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"200","target":"706","id":"5748","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"233","target":"431","id":"6301","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"257","target":"671","id":"6690","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"168","target":"557","id":"5142","attributes":{"Weight":"1.0"},"color":"rgb(229,132,83)","size":1.0},{"source":"201","target":"305","id":"5753","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"65","target":"387","id":"2983","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"61","target":"442","id":"2883","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"197","target":"372","id":"5685","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"578","target":"693","id":"10233","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"373","target":"591","id":"8323","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"325","target":"566","id":"7740","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"140","target":"654","id":"4577","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"189","target":"601","id":"5546","attributes":{"Weight":"1.0"},"color":"rgb(229,148,67)","size":1.0},{"source":"259","target":"691","id":"6726","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"343","target":"501","id":"7997","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"211","target":"419","id":"5919","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"205","target":"559","id":"5831","attributes":{"Weight":"1.0"},"color":"rgb(148,115,196)","size":1.0},{"source":"211","target":"221","id":"5913","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"232","target":"603","id":"6291","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"169","target":"256","id":"5148","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"382","target":"503","id":"8458","attributes":{"Weight":"1.0"},"color":"rgb(67,164,213)","size":1.0},{"source":"478","target":"558","id":"9540","attributes":{"Weight":"1.0"},"color":"rgb(213,148,83)","size":1.0},{"source":"230","target":"361","id":"6252","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"583","target":"616","id":"10255","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"345","target":"396","id":"8013","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"101","target":"320","id":"3773","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"99","target":"100","id":"3725","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"59","target":"447","id":"2824","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"562","target":"576","id":"10117","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"342","target":"597","id":"7986","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"271","target":"602","id":"6924","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"166","target":"711","id":"5114","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"447","target":"482","id":"9235","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"99","target":"106","id":"3727","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"8","target":"612","id":"1650","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"226","target":"531","id":"6190","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"372","target":"700","id":"8318","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"553","target":"632","id":"10072","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"81","target":"208","id":"3326","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"234","target":"631","id":"6325","attributes":{"Weight":"1.0"},"color":"rgb(67,115,229)","size":1.0},{"source":"329","target":"615","id":"7808","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"116","target":"232","id":"4070","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"104","target":"256","id":"3825","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"179","target":"532","id":"5357","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"369","target":"672","id":"8284","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"167","target":"531","id":"5126","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"251","target":"356","id":"6584","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"303","target":"713","id":"7449","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"34","target":"446","id":"2257","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"295","target":"546","id":"7319","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"730","target":"735","id":"10689","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"171","target":"496","id":"5199","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"37","target":"420","id":"2318","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"184","target":"524","id":"5447","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"11","target":"138","id":"1709","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"327","target":"454","id":"7763","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"117","target":"326","id":"4099","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"144","target":"335","id":"4657","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"19","target":"291","id":"1898","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"274","target":"582","id":"6967","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"150","target":"227","id":"4780","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"193","target":"725","id":"5613","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"200","target":"505","id":"5738","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"462","target":"608","id":"9386","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"16","target":"640","id":"1836","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"479","target":"680","id":"9547","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"438","target":"735","id":"9139","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"257","target":"715","id":"6692","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"109","target":"128","id":"3909","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"157","target":"539","id":"4938","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"419","target":"450","id":"8893","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"227","target":"719","id":"6215","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"349","target":"572","id":"8070","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"14","target":"649","id":"1795","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"282","target":"364","id":"7097","attributes":{"Weight":"1.0"},"color":"rgb(115,164,148)","size":1.0},{"source":"38","target":"58","id":"2329","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"520","target":"709","id":"9852","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"220","target":"590","id":"6087","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"14","target":"505","id":"1789","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"69","target":"651","id":"3076","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"6","target":"29","id":"1580","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"111","target":"419","id":"3974","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"238","target":"547","id":"6376","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"371","target":"629","id":"8301","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"342","target":"363","id":"7975","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"35","target":"40","id":"2265","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"371","target":"397","id":"8292","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"55","target":"187","id":"2728","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"411","target":"559","id":"8823","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"108","target":"605","id":"3904","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"54","target":"462","id":"2711","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"190","target":"587","id":"5563","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"58","target":"59","id":"2792","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"434","target":"521","id":"9087","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"17","target":"275","id":"1851","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"190","target":"649","id":"5565","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"69","target":"734","id":"3082","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"139","target":"303","id":"4538","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"325","target":"511","id":"7737","attributes":{"Weight":"1.0"},"color":"rgb(213,115,148)","size":1.0},{"source":"196","target":"275","id":"5653","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"85","target":"289","id":"3416","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"347","target":"404","id":"8038","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"151","target":"567","id":"4823","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"224","target":"323","id":"6147","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"57","target":"565","id":"2785","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"80","target":"713","id":"3324","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"245","target":"316","id":"6478","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"491","target":"603","id":"9623","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"397","target":"685","id":"8662","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"14","target":"403","id":"1787","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"287","target":"424","id":"7183","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"551","target":"700","id":"10067","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"385","target":"498","id":"8505","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"172","target":"408","id":"5216","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"472","target":"589","id":"9483","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"350","target":"606","id":"8083","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"288","target":"440","id":"7201","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"261","target":"487","id":"6763","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"314","target":"673","id":"7594","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"136","target":"360","id":"4487","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"345","target":"496","id":"8015","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"206","target":"378","id":"5842","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"108","target":"722","id":"3907","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"466","target":"734","id":"9428","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"377","target":"658","id":"8392","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"66","target":"495","id":"3006","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"68","target":"204","id":"3037","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"314","target":"613","id":"7592","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"407","target":"420","id":"8769","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"318","target":"460","id":"7641","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"101","target":"223","id":"3769","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"287","target":"600","id":"7190","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"268","target":"399","id":"6872","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"523","target":"663","id":"9882","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"543","target":"679","id":"10030","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"61","target":"417","id":"2882","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"223","target":"320","id":"6133","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"58","target":"252","id":"2798","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"100","target":"370","id":"3756","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"143","target":"432","id":"4636","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"150","target":"562","id":"4791","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"54","target":"623","id":"2718","attributes":{"Weight":"1.0"},"color":"rgb(67,229,196)","size":1.0},{"source":"140","target":"454","id":"4568","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"490","target":"567","id":"9614","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"563","target":"617","id":"10127","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"517","target":"537","id":"9824","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"453","target":"578","id":"9283","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"413","target":"559","id":"8836","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"73","target":"497","id":"3157","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"144","target":"576","id":"4666","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"424","target":"450","id":"8951","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"446","target":"509","id":"9225","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"72","target":"505","id":"3141","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"249","target":"565","id":"6555","attributes":{"Weight":"1.0"},"color":"rgb(213,148,148)","size":1.0},{"source":"284","target":"666","id":"7147","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"110","target":"111","id":"3929","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"448","target":"550","id":"9242","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"316","target":"373","id":"7609","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"196","target":"521","id":"5666","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"164","target":"569","id":"5066","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"395","target":"412","id":"8635","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"4","target":"346","id":"1542","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"218","target":"422","id":"6051","attributes":{"Weight":"1.0"},"color":"rgb(132,196,148)","size":1.0},{"source":"36","target":"284","id":"2293","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"224","target":"707","id":"6164","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"8","target":"713","id":"1659","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"337","target":"374","id":"7911","attributes":{"Weight":"1.0"},"color":"rgb(67,180,196)","size":1.0},{"source":"320","target":"367","id":"7678","attributes":{"Weight":"1.0"},"color":"rgb(164,99,148)","size":1.0},{"source":"15","target":"173","id":"1802","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"221","target":"279","id":"6095","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"361","target":"362","id":"8193","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"571","target":"618","id":"10171","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"329","target":"456","id":"7800","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"417","target":"673","id":"8876","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"250","target":"653","id":"6574","attributes":{"Weight":"1.0"},"color":"rgb(180,67,164)","size":1.0},{"source":"309","target":"554","id":"7520","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"107","target":"217","id":"3876","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"140","target":"442","id":"4567","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"92","target":"464","id":"3586","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"86","target":"511","id":"3443","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"602","target":"703","id":"10339","attributes":{"Weight":"1.0"},"color":"rgb(196,196,67)","size":1.0},{"source":"302","target":"516","id":"7419","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"140","target":"625","id":"4576","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"494","target":"519","id":"9654","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"521","target":"589","id":"9857","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"149","target":"507","id":"4768","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"78","target":"584","id":"3273","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"17","target":"276","id":"1852","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"340","target":"709","id":"7964","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"19","target":"482","id":"1907","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"318","target":"713","id":"7653","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"180","target":"571","id":"5379","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"31","target":"304","id":"2175","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"12","target":"211","id":"1732","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"269","target":"411","id":"6895","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"81","target":"470","id":"3334","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"18","target":"503","id":"1879","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"322","target":"398","id":"7695","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"73","target":"270","id":"3154","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"12","target":"358","id":"1739","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"91","target":"683","id":"3573","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"247","target":"495","id":"6522","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"382","target":"466","id":"8455","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"433","target":"679","id":"9084","attributes":{"Weight":"1.0"},"color":"rgb(67,229,148)","size":1.0},{"source":"382","target":"646","id":"8460","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"574","target":"597","id":"10196","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"51","target":"174","id":"2632","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"215","target":"690","id":"6001","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"411","target":"413","id":"8821","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"489","target":"710","id":"9610","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"10","target":"31","id":"1682","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"263","target":"469","id":"6787","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"218","target":"605","id":"6062","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"236","target":"368","id":"6346","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"367","target":"456","id":"8255","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"212","target":"600","id":"5948","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"86","target":"703","id":"3453","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"31","target":"234","id":"2174","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"183","target":"497","id":"5424","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"2","target":"96","id":"1488","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"114","target":"485","id":"4034","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"224","target":"586","id":"6160","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"133","target":"149","id":"4414","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"553","target":"726","id":"10078","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"403","target":"500","id":"8730","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"189","target":"362","id":"5540","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"233","target":"436","id":"6302","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"61","target":"566","id":"2889","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"42","target":"333","id":"2423","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"155","target":"371","id":"4894","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"426","target":"427","id":"8982","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"472","target":"594","id":"9484","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"152","target":"712","id":"4844","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"206","target":"336","id":"5839","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"507","target":"606","id":"9760","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"308","target":"668","id":"7511","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"651","target":"730","id":"10557","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"44","target":"498","id":"2477","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"61","target":"454","id":"2884","attributes":{"Weight":"1.0"},"color":"rgb(132,148,196)","size":1.0},{"source":"333","target":"655","id":"7867","attributes":{"Weight":"1.0"},"color":"rgb(148,164,148)","size":1.0},{"source":"517","target":"623","id":"9829","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"26","target":"58","id":"2037","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"110","target":"154","id":"3932","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"480","target":"648","id":"9557","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"396","target":"673","id":"8652","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"85","target":"147","id":"3409","attributes":{"Weight":"1.0"},"color":"rgb(180,67,213)","size":1.0},{"source":"47","target":"557","id":"2557","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"127","target":"632","id":"4297","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"163","target":"336","id":"5042","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"283","target":"566","id":"7134","attributes":{"Weight":"1.0"},"color":"rgb(213,67,196)","size":1.0},{"source":"85","target":"529","id":"3424","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"161","target":"621","id":"5007","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"197","target":"492","id":"5690","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"139","target":"232","id":"4535","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"252","target":"404","id":"6600","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"151","target":"627","id":"4825","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"185","target":"212","id":"5458","attributes":{"Weight":"1.0"},"color":"rgb(148,213,148)","size":1.0},{"source":"167","target":"486","id":"5125","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"311","target":"625","id":"7549","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"503","target":"534","id":"9727","attributes":{"Weight":"1.0"},"color":"rgb(132,148,213)","size":1.0},{"source":"333","target":"703","id":"7868","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"92","target":"367","id":"3581","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"60","target":"528","id":"2855","attributes":{"Weight":"1.0"},"color":"rgb(229,115,99)","size":1.0},{"source":"303","target":"668","id":"7447","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"45","target":"416","id":"2503","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"355","target":"509","id":"8132","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"118","target":"404","id":"4120","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"106","target":"672","id":"3870","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"463","target":"711","id":"9395","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"37","target":"278","id":"2314","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"162","target":"693","id":"5036","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"169","target":"526","id":"5163","attributes":{"Weight":"1.0"},"color":"rgb(67,196,148)","size":1.0},{"source":"294","target":"316","id":"7293","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"81","target":"474","id":"3336","attributes":{"Weight":"1.0"},"color":"rgb(196,83,148)","size":1.0},{"source":"62","target":"117","id":"2902","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"65","target":"220","id":"2978","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"290","target":"412","id":"7249","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"221","target":"261","id":"6094","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"264","target":"697","id":"6811","attributes":{"Weight":"1.0"},"color":"rgb(99,164,148)","size":1.0},{"source":"660","target":"674","id":"10584","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"54","target":"287","id":"2700","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"149","target":"171","id":"4758","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"87","target":"425","id":"3462","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"64","target":"484","id":"2971","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"390","target":"412","id":"8570","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"237","target":"447","id":"6359","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"342","target":"537","id":"7981","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"644","target":"719","id":"10517","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"29","target":"686","id":"2143","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"155","target":"373","id":"4895","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"117","target":"476","id":"4104","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"239","target":"483","id":"6395","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"206","target":"343","id":"5840","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"56","target":"532","id":"2758","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"207","target":"354","id":"5861","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"271","target":"665","id":"6928","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"684","target":"736","id":"10634","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"114","target":"621","id":"4037","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"153","target":"370","id":"4853","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"278","target":"420","id":"7026","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"10","target":"370","id":"1698","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"74","target":"140","id":"3169","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"49","target":"104","id":"2581","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"333","target":"580","id":"7861","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"384","target":"612","id":"8491","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"222","target":"368","id":"6122","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"101","target":"512","id":"3782","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"529","target":"567","id":"9936","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"127","target":"161","id":"4287","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"101","target":"189","id":"3765","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"168","target":"634","id":"5144","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"245","target":"419","id":"6485","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"191","target":"240","id":"5570","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"199","target":"628","id":"5727","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"346","target":"347","id":"8026","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"267","target":"357","id":"6852","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"15","target":"205","id":"1804","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"18","target":"346","id":"1873","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"234","target":"469","id":"6320","attributes":{"Weight":"1.0"},"color":"rgb(99,67,229)","size":1.0},{"source":"348","target":"576","id":"8053","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"151","target":"586","id":"4824","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"215","target":"596","id":"5995","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"177","target":"707","id":"5327","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"231","target":"342","id":"6264","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"330","target":"392","id":"7814","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"20","target":"326","id":"1920","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"351","target":"718","id":"8102","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"429","target":"499","id":"9019","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"523","target":"589","id":"9878","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"101","target":"344","id":"3774","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"128","target":"136","id":"4305","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"350","target":"714","id":"8088","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"135","target":"586","id":"4475","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"417","target":"682","id":"8877","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"67","target":"204","id":"3017","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"394","target":"561","id":"8629","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"333","target":"716","id":"7869","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"447","target":"449","id":"9231","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"528","target":"703","id":"9932","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"131","target":"571","id":"4384","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"137","target":"315","id":"4505","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"1","target":"493","id":"1475","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"224","target":"431","id":"6151","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"341","target":"375","id":"7966","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"203","target":"475","id":"5792","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"441","target":"491","id":"9169","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"415","target":"681","id":"8854","attributes":{"Weight":"1.0"},"color":"rgb(83,229,99)","size":1.0},{"source":"14","target":"587","id":"1792","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"33","target":"429","id":"2233","attributes":{"Weight":"1.0"},"color":"rgb(229,99,99)","size":1.0},{"source":"277","target":"703","id":"7021","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"248","target":"727","id":"6541","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"270","target":"516","id":"6907","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"430","target":"654","id":"9036","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"87","target":"604","id":"3476","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"234","target":"309","id":"6315","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"204","target":"688","id":"5818","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"116","target":"318","id":"4075","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"375","target":"502","id":"8355","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"359","target":"461","id":"8173","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"294","target":"719","id":"7310","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"396","target":"659","id":"8651","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"162","target":"260","id":"5017","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"93","target":"511","id":"3606","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"85","target":"280","id":"3415","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"591","target":"643","id":"10291","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"463","target":"634","id":"9394","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"352","target":"430","id":"8105","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"199","target":"520","id":"5725","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"380","target":"467","id":"8421","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"86","target":"619","id":"3450","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"59","target":"291","id":"2821","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"169","target":"276","id":"5151","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"1","target":"418","id":"1473","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"297","target":"632","id":"7345","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"458","target":"479","id":"9339","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"223","target":"512","id":"6141","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"79","target":"374","id":"3284","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"47","target":"253","id":"2545","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"212","target":"225","id":"5933","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"186","target":"235","id":"5481","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"12","target":"225","id":"1735","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"128","target":"617","id":"4322","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"80","target":"415","id":"3316","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"193","target":"438","id":"5602","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"477","target":"686","id":"9537","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"308","target":"415","id":"7501","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"60","target":"318","id":"2845","attributes":{"Weight":"1.0"},"color":"rgb(148,148,99)","size":1.0},{"source":"572","target":"720","id":"10185","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"585","target":"631","id":"10264","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"275","target":"446","id":"6982","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"625","target":"677","id":"10436","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"182","target":"337","id":"5404","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"410","target":"660","id":"8816","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"21","target":"695","id":"1952","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"215","target":"504","id":"5993","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"132","target":"223","id":"4401","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"109","target":"712","id":"3927","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"40","target":"273","id":"2381","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"46","target":"123","id":"2520","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"8","target":"707","id":"1658","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"7","target":"364","id":"1610","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"408","target":"707","id":"8788","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"227","target":"572","id":"6207","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"89","target":"638","id":"3527","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"22","target":"704","id":"1974","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"193","target":"647","id":"5608","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"493","target":"526","id":"9646","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"218","target":"631","id":"6063","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"60","target":"548","id":"2856","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"162","target":"703","id":"5037","attributes":{"Weight":"1.0"},"color":"rgb(196,196,67)","size":1.0},{"source":"195","target":"722","id":"5652","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"129","target":"607","id":"4344","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"192","target":"273","id":"5583","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"63","target":"657","id":"2941","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"359","target":"711","id":"8181","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"240","target":"352","id":"6398","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"368","target":"419","id":"8265","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"125","target":"447","id":"4256","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"88","target":"221","id":"3486","attributes":{"Weight":"1.0"},"color":"rgb(115,229,148)","size":1.0},{"source":"425","target":"521","id":"8969","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"83","target":"626","id":"3384","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"13","target":"36","id":"1752","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"346","target":"437","id":"8029","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"231","target":"434","id":"6267","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"671","target":"726","id":"10611","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"72","target":"537","id":"3142","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"279","target":"586","id":"7049","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"121","target":"167","id":"4174","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"33","target":"569","id":"2240","attributes":{"Weight":"1.0"},"color":"rgb(229,99,132)","size":1.0},{"source":"120","target":"324","id":"4158","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"38","target":"636","id":"2353","attributes":{"Weight":"1.0"},"color":"rgb(180,213,67)","size":1.0},{"source":"472","target":"543","id":"9480","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"129","target":"168","id":"4330","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"4","target":"11","id":"1532","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"87","target":"508","id":"3468","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"421","target":"589","id":"8924","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"107","target":"627","id":"3886","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"39","target":"486","id":"2370","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"282","target":"646","id":"7104","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"47","target":"401","id":"2551","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"291","target":"382","id":"7258","attributes":{"Weight":"1.0"},"color":"rgb(132,164,148)","size":1.0},{"source":"393","target":"399","id":"8609","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"90","target":"91","id":"3533","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"89","target":"114","id":"3512","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"221","target":"260","id":"6093","attributes":{"Weight":"1.0"},"color":"rgb(115,229,148)","size":1.0},{"source":"54","target":"443","id":"2708","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"548","target":"595","id":"10053","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"202","target":"212","id":"5766","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"157","target":"542","id":"4939","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"228","target":"236","id":"6218","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"185","target":"607","id":"5471","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"333","target":"428","id":"7856","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"51","target":"293","id":"2635","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"62","target":"544","id":"2918","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"22","target":"243","id":"1965","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"157","target":"698","id":"4944","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"196","target":"440","id":"5662","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"152","target":"550","id":"4840","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"95","target":"563","id":"3658","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"269","target":"330","id":"6885","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"192","target":"467","id":"5589","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"182","target":"321","id":"5403","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"285","target":"730","id":"7162","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"604","target":"728","id":"10348","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"139","target":"348","id":"4541","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"177","target":"460","id":"5313","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"396","target":"507","id":"8645","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"170","target":"656","id":"5185","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"325","target":"534","id":"7738","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"321","target":"662","id":"7693","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"540","target":"733","id":"10014","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"646","target":"729","id":"10526","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"485","target":"553","id":"9575","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"28","target":"217","id":"2099","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"196","target":"409","id":"5659","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"105","target":"554","id":"3853","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"179","target":"342","id":"5350","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"125","target":"481","id":"4261","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"140","target":"408","id":"4566","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"188","target":"601","id":"5522","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"349","target":"371","id":"8062","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"64","target":"361","id":"2964","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"656","target":"694","id":"10575","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"66","target":"137","id":"2994","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"7","target":"162","id":"1603","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"51","target":"704","id":"2642","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"74","target":"408","id":"3177","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"72","target":"587","id":"3144","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"606","target":"659","id":"10354","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"212","target":"728","id":"5955","attributes":{"Weight":"1.0"},"color":"rgb(148,148,229)","size":1.0},{"source":"65","target":"628","id":"2989","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"283","target":"391","id":"7120","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"150","target":"569","id":"4792","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"149","target":"244","id":"4759","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"229","target":"275","id":"6233","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"166","target":"463","id":"5107","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"424","target":"555","id":"8957","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"126","target":"242","id":"4271","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"228","target":"235","id":"6217","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"175","target":"514","id":"5274","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"27","target":"543","id":"2075","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"535","target":"698","id":"9979","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"264","target":"735","id":"6817","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"358","target":"419","id":"8159","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"662","target":"705","id":"10593","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"266","target":"661","id":"6839","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"108","target":"493","id":"3897","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"519","target":"526","id":"9841","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"143","target":"514","id":"4640","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"460","target":"707","id":"9372","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"349","target":"373","id":"8063","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"440","target":"702","id":"9165","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"232","target":"303","id":"6282","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"328","target":"536","id":"7787","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"156","target":"326","id":"4910","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"153","target":"234","id":"4848","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"9","target":"548","id":"1678","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"221","target":"693","id":"6114","attributes":{"Weight":"1.0"},"color":"rgb(115,229,148)","size":1.0},{"source":"161","target":"297","id":"5001","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"419","target":"424","id":"8891","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"97","target":"582","id":"3699","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"145","target":"436","id":"4687","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"545","target":"660","id":"10038","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"186","target":"429","id":"5488","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"426","target":"549","id":"8987","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"381","target":"623","id":"8446","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"313","target":"515","id":"7575","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"538","target":"637","id":"9997","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"681","target":"683","id":"10630","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"345","target":"673","id":"8022","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"237","target":"291","id":"6356","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"62","target":"476","id":"2914","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"182","target":"217","id":"5401","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"532","target":"707","id":"9959","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"390","target":"414","id":"8572","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"139","target":"668","id":"4553","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"161","target":"639","id":"5010","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"71","target":"113","id":"3108","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"222","target":"324","id":"6119","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"6","target":"515","id":"1596","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"430","target":"463","id":"9030","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"165","target":"729","id":"5094","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"260","target":"279","id":"6732","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"421","target":"521","id":"8919","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"162","target":"241","id":"5016","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"40","target":"467","id":"2387","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"61","target":"396","id":"2881","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"397","target":"591","id":"8657","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"43","target":"628","id":"2454","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"227","target":"349","id":"6201","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"260","target":"692","id":"6748","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"11","target":"237","id":"1712","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"147","target":"542","id":"4735","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"81","target":"307","id":"3328","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"240","target":"463","id":"6403","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"380","target":"584","id":"8424","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"444","target":"539","id":"9213","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"282","target":"734","id":"7114","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"79","target":"498","id":"3293","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"11","target":"387","id":"1717","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"190","target":"500","id":"5559","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"171","target":"593","id":"5204","attributes":{"Weight":"1.0"},"color":"rgb(213,115,148)","size":1.0},{"source":"120","target":"353","id":"4160","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"340","target":"503","id":"7958","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"36","target":"247","id":"2291","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"57","target":"543","id":"2783","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"314","target":"396","id":"7585","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"102","target":"228","id":"3787","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"302","target":"684","id":"7426","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"603","target":"616","id":"10342","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"196","target":"352","id":"5656","attributes":{"Weight":"1.0"},"color":"rgb(229,132,148)","size":1.0},{"source":"612","target":"685","id":"10388","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"92","target":"351","id":"3580","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"218","target":"655","id":"6064","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"282","target":"729","id":"7112","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"13","target":"315","id":"1763","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"208","target":"313","id":"5871","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"42","target":"571","id":"2428","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"55","target":"370","id":"2733","attributes":{"Weight":"1.0"},"color":"rgb(99,67,229)","size":1.0},{"source":"168","target":"711","id":"5145","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"43","target":"220","id":"2441","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"221","target":"572","id":"6108","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"250","target":"253","id":"6560","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"29","target":"468","id":"2133","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"190","target":"194","id":"5548","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"159","target":"161","id":"4960","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"147","target":"624","id":"4736","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"249","target":"416","id":"6545","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"10","target":"304","id":"1693","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"172","target":"685","id":"5229","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"242","target":"530","id":"6441","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"33","target":"132","id":"2213","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"419","target":"529","id":"8898","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"95","target":"360","id":"3650","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"30","target":"60","id":"2144","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"487","target":"608","id":"9592","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"254","target":"255","id":"6632","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"178","target":"351","id":"5331","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"50","target":"569","id":"2623","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"475","target":"611","id":"9518","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"126","target":"365","id":"4275","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"71","target":"159","id":"3110","attributes":{"Weight":"1.0"},"color":"rgb(115,99,229)","size":1.0},{"source":"427","target":"615","id":"9000","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"58","target":"422","id":"2802","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"33","target":"189","id":"2215","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"302","target":"497","id":"7418","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"475","target":"656","id":"9522","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"367","target":"492","id":"8257","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"646","target":"689","id":"10522","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"334","target":"595","id":"7879","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"138","target":"340","id":"4519","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"201","target":"228","id":"5750","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"575","target":"713","id":"10209","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"71","target":"302","id":"3116","attributes":{"Weight":"1.0"},"color":"rgb(99,180,148)","size":1.0},{"source":"3","target":"167","id":"1516","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"285","target":"651","id":"7157","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"113","target":"182","id":"4006","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"223","target":"354","id":"6135","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"589","target":"594","id":"10279","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"431","target":"703","id":"9050","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"22","target":"293","id":"1967","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"337","target":"407","id":"7914","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"128","target":"563","id":"4320","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"88","target":"364","id":"3494","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"346","target":"709","id":"8036","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"26","target":"237","id":"2042","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"109","target":"617","id":"3926","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"198","target":"270","id":"5699","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"450","target":"600","id":"9261","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"338","target":"613","id":"7933","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"313","target":"686","id":"7580","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"569","target":"591","id":"10157","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"500","target":"587","id":"9708","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"390","target":"560","id":"8574","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"215","target":"665","id":"6000","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"274","target":"435","id":"6961","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"28","target":"245","id":"2100","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"6","target":"620","id":"1599","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"34","target":"357","id":"2256","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"6","target":"468","id":"1591","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"646","target":"647","id":"10519","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"513","target":"683","id":"9800","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"668","target":"702","id":"10606","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"468","target":"470","id":"9436","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"528","target":"716","id":"9934","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"465","target":"729","id":"9414","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"659","target":"673","id":"10581","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"139","target":"231","id":"4534","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"166","target":"486","id":"5108","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"77","target":"515","id":"3255","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"8","target":"522","id":"1643","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"331","target":"547","id":"7836","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"144","target":"371","id":"4659","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"196","target":"604","id":"5674","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"60","target":"371","id":"2850","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"42","target":"180","id":"2415","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"452","target":"670","id":"9280","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"497","target":"736","id":"9688","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"132","target":"445","id":"4410","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"487","target":"555","id":"9590","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"308","target":"726","id":"7514","attributes":{"Weight":"1.0"},"color":"rgb(115,148,180)","size":1.0},{"source":"573","target":"678","id":"10192","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"110","target":"627","id":"3952","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"74","target":"177","id":"3171","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"110","target":"643","id":"3954","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"442","target":"498","id":"9185","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"352","target":"652","id":"8113","attributes":{"Weight":"1.0"},"color":"rgb(229,180,67)","size":1.0},{"source":"216","target":"443","id":"6014","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"553","target":"638","id":"10073","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"289","target":"428","id":"7222","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"155","target":"644","id":"4902","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"477","target":"541","id":"9534","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"189","target":"209","id":"5529","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"281","target":"646","id":"7085","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"329","target":"549","id":"7804","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"71","target":"337","id":"3118","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"211","target":"424","id":"5920","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"260","target":"591","id":"6741","attributes":{"Weight":"1.0"},"color":"rgb(196,148,132)","size":1.0},{"source":"475","target":"648","id":"9521","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"46","target":"249","id":"2524","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"84","target":"337","id":"3396","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"285","target":"647","id":"7155","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"532","target":"654","id":"9953","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"451","target":"645","id":"9273","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"450","target":"645","id":"9265","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"254","target":"400","id":"6634","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"347","target":"387","id":"8037","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"242","target":"681","id":"6444","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"32","target":"170","id":"2186","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"31","target":"457","id":"2180","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"58","target":"424","id":"2803","attributes":{"Weight":"1.0"},"color":"rgb(132,229,148)","size":1.0},{"source":"3","target":"463","id":"1526","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"268","target":"393","id":"6869","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"92","target":"718","id":"3594","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"695","target":"708","id":"10658","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"524","target":"697","id":"9892","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"322","target":"657","id":"7703","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"381","target":"523","id":"8438","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"42","target":"511","id":"2426","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"58","target":"478","id":"2807","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"275","target":"581","id":"6988","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"155","target":"569","id":"4897","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"540","target":"704","id":"10011","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"82","target":"433","id":"3353","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"140","target":"677","id":"4579","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"433","target":"614","id":"9079","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"194","target":"574","id":"5628","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"62","target":"326","id":"2909","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"356","target":"694","id":"8150","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"377","target":"412","id":"8386","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"342","target":"505","id":"7980","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"153","target":"701","id":"4858","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"278","target":"533","id":"7028","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"348","target":"668","id":"8058","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"336","target":"506","id":"7904","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"530","target":"544","id":"9944","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"310","target":"468","id":"7528","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"429","target":"595","id":"9024","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"207","target":"320","id":"5859","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"492","target":"700","id":"9641","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"23","target":"640","id":"1990","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"32","target":"400","id":"2193","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"232","target":"713","id":"6294","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"233","target":"676","id":"6309","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"45","target":"483","id":"2512","attributes":{"Weight":"1.0"},"color":"rgb(213,180,67)","size":1.0},{"source":"290","target":"658","id":"7255","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"383","target":"706","id":"8482","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"212","target":"675","id":"5953","attributes":{"Weight":"1.0"},"color":"rgb(132,229,148)","size":1.0},{"source":"490","target":"717","id":"9620","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"261","target":"424","id":"6759","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"285","target":"646","id":"7154","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"480","target":"517","id":"9551","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"179","target":"717","id":"5369","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"481","target":"503","id":"9561","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"596","target":"610","id":"10307","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"399","target":"405","id":"8682","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"7","target":"88","id":"1602","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"593","target":"652","id":"10299","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"18","target":"347","id":"1874","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"542","target":"653","id":"10019","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"385","target":"518","id":"8507","attributes":{"Weight":"1.0"},"color":"rgb(148,164,115)","size":1.0},{"source":"285","target":"689","id":"7158","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"647","target":"650","id":"10530","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"75","target":"190","id":"3195","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"339","target":"665","id":"7947","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"36","target":"599","id":"2303","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"475","target":"573","id":"9516","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"453","target":"661","id":"9287","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"521","target":"562","id":"9855","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"189","target":"223","id":"5531","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"288","target":"525","id":"7208","attributes":{"Weight":"1.0"},"color":"rgb(148,115,229)","size":1.0},{"source":"468","target":"541","id":"9442","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"68","target":"183","id":"3034","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"237","target":"422","id":"6358","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"61","target":"659","id":"2893","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"226","target":"430","id":"6186","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"360","target":"501","id":"8185","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"646","target":"651","id":"10521","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"571","target":"623","id":"10173","attributes":{"Weight":"1.0"},"color":"rgb(148,196,115)","size":1.0},{"source":"454","target":"687","id":"9306","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"120","target":"733","id":"4170","attributes":{"Weight":"1.0"},"color":"rgb(229,67,99)","size":1.0},{"source":"407","target":"662","id":"8775","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"141","target":"246","id":"4587","attributes":{"Weight":"1.0"},"color":"rgb(180,148,148)","size":1.0},{"source":"464","target":"700","id":"9403","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"606","target":"714","id":"10358","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"500","target":"702","id":"9712","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"650","target":"730","id":"10550","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"43","target":"272","id":"2442","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"550","target":"727","id":"10064","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"247","target":"273","id":"6515","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"568","target":"732","id":"10154","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"67","target":"68","id":"3012","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"274","target":"722","id":"6972","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"61","target":"606","id":"2891","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"287","target":"645","id":"7194","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"602","target":"665","id":"10335","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"542","target":"698","id":"10021","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"135","target":"233","id":"4453","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"403","target":"691","id":"8737","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"327","target":"623","id":"7773","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"641","target":"704","id":"10506","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"530","target":"681","id":"9945","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"366","target":"672","id":"8249","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"50","target":"368","id":"2615","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"33","target":"230","id":"2220","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"87","target":"472","id":"3465","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"99","target":"662","id":"3742","attributes":{"Weight":"1.0"},"color":"rgb(67,99,229)","size":1.0},{"source":"272","target":"520","id":"6941","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"194","target":"200","id":"5618","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"214","target":"223","id":"5971","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"162","target":"453","id":"5026","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"169","target":"304","id":"5153","attributes":{"Weight":"1.0"},"color":"rgb(67,148,148)","size":1.0},{"source":"304","target":"370","id":"7454","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"610","target":"721","id":"10373","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"260","target":"721","id":"6750","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"74","target":"612","id":"3184","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"38","target":"166","id":"2333","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"259","target":"505","id":"6719","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"591","target":"719","id":"10294","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"211","target":"225","id":"5914","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"114","target":"472","id":"4032","attributes":{"Weight":"1.0"},"color":"rgb(196,67,229)","size":1.0},{"source":"142","target":"669","id":"4624","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"159","target":"714","id":"4977","attributes":{"Weight":"1.0"},"color":"rgb(180,67,229)","size":1.0},{"source":"416","target":"452","id":"8859","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"125","target":"675","id":"4267","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"248","target":"506","id":"6535","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"593","target":"716","id":"10301","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"62","target":"242","id":"2907","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"299","target":"514","id":"7377","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"432","target":"624","id":"9063","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"74","target":"532","id":"3182","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"216","target":"601","id":"6021","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"47","target":"336","id":"2548","attributes":{"Weight":"1.0"},"color":"rgb(229,148,83)","size":1.0},{"source":"116","target":"575","id":"4084","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"84","target":"731","id":"3406","attributes":{"Weight":"1.0"},"color":"rgb(148,99,196)","size":1.0},{"source":"2","target":"219","id":"1496","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"296","target":"605","id":"7333","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"208","target":"686","id":"5884","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"265","target":"365","id":"6820","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"428","target":"511","id":"9003","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"30","target":"334","id":"2155","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"321","target":"579","id":"7690","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"94","target":"714","id":"3638","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"419","target":"720","id":"8906","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"348","target":"434","id":"8050","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"461","target":"634","id":"9380","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"136","target":"378","id":"4488","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"8","target":"528","id":"1645","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"60","target":"116","id":"2834","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"312","target":"637","id":"7563","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"209","target":"445","id":"5895","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"440","target":"668","id":"9164","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"267","target":"318","id":"6850","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"628","target":"670","id":"10447","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"537","target":"587","id":"9987","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"154","target":"720","id":"4884","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"257","target":"621","id":"6685","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"132","target":"209","id":"4399","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"48","target":"293","id":"2569","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"58","target":"636","id":"2813","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"467","target":"495","id":"9430","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"450","target":"608","id":"9262","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"163","target":"727","id":"5055","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"268","target":"391","id":"6867","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"449","target":"452","id":"9248","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"580","target":"716","id":"10247","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"460","target":"576","id":"9362","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"574","target":"706","id":"10200","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"303","target":"543","id":"7439","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"19","target":"252","id":"1897","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"176","target":"426","id":"5289","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"585","target":"722","id":"10266","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"408","target":"460","id":"8777","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"72","target":"379","id":"3137","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"158","target":"540","id":"4950","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"514","target":"535","id":"9801","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"190","target":"574","id":"5562","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"297","target":"671","id":"7350","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"312","target":"636","id":"7562","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"100","target":"105","id":"3745","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"389","target":"666","id":"8561","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"374","target":"577","id":"8342","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"319","target":"569","id":"7667","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"260","target":"453","id":"6737","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"513","target":"530","id":"9797","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"123","target":"449","id":"4220","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"111","target":"155","id":"3962","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"77","target":"313","id":"3247","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"412","target":"658","id":"8833","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"469","target":"734","id":"9457","attributes":{"Weight":"1.0"},"color":"rgb(99,83,229)","size":1.0},{"source":"96","target":"219","id":"3672","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"302","target":"633","id":"7422","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"460","target":"532","id":"9360","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"385","target":"687","id":"8516","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"386","target":"667","id":"8528","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"363","target":"702","id":"8214","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"49","target":"275","id":"2587","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"270","target":"302","id":"6904","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"192","target":"570","id":"5591","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"35","target":"467","id":"2278","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"129","target":"166","id":"4328","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"50","target":"719","id":"2629","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"162","target":"578","id":"5028","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"215","target":"721","id":"6004","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"256","target":"592","id":"6677","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"527","target":"625","id":"9914","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"402","target":"557","id":"8723","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"119","target":"712","id":"4148","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"74","target":"311","id":"3174","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"62","target":"683","id":"2920","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"247","target":"467","id":"6521","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"284","target":"584","id":"7144","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"55","target":"263","id":"2729","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"24","target":"48","id":"1999","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"249","target":"422","id":"6546","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"243","target":"732","id":"6457","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"385","target":"611","id":"8510","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"198","target":"204","id":"5698","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"154","target":"397","id":"4872","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"172","target":"706","id":"5230","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"537","target":"702","id":"9992","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"56","target":"172","id":"2748","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"28","target":"626","id":"2117","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"225","target":"487","id":"6176","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"140","target":"316","id":"4561","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"376","target":"699","id":"8375","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"398","target":"639","id":"8674","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"80","target":"303","id":"3312","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"44","target":"433","id":"2472","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"497","target":"697","id":"9687","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"187","target":"542","id":"5506","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"196","target":"472","id":"5663","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"93","target":"716","id":"3617","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"313","target":"518","id":"7576","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"339","target":"721","id":"7951","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"9","target":"186","id":"1664","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"262","target":"354","id":"6774","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"23","target":"641","id":"1991","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"729","target":"730","id":"10685","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"212","target":"555","id":"5947","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"23","target":"439","id":"1987","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"517","target":"611","id":"9827","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"139","target":"238","id":"4536","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"94","target":"171","id":"3620","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"4","target":"709","id":"1553","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"690","target":"721","id":"10647","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"420","target":"488","id":"8907","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"114","target":"657","id":"4042","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"135","target":"349","id":"4461","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"140","target":"679","id":"4581","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"53","target":"684","id":"2687","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"600","target":"645","id":"10325","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"85","target":"443","id":"3422","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"673","target":"682","id":"10613","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"325","target":"417","id":"7734","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"73","target":"183","id":"3150","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"432","target":"469","id":"9055","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"431","target":"490","id":"9042","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"21","target":"48","id":"1936","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"4","target":"520","id":"1548","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"658","target":"731","id":"10580","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"282","target":"725","id":"7111","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"327","target":"517","id":"7768","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"689","target":"725","id":"10640","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"54","target":"319","id":"2702","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"272","target":"670","id":"6945","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"131","target":"180","id":"4370","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"77","target":"518","id":"3256","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"366","target":"591","id":"8247","attributes":{"Weight":"1.0"},"color":"rgb(148,67,213)","size":1.0},{"source":"128","target":"506","id":"4317","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"119","target":"506","id":"4143","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"692","target":"693","id":"10651","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"443","target":"547","id":"9198","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"66","target":"666","id":"3011","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"63","target":"474","id":"2934","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"188","target":"571","id":"5519","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"419","target":"600","id":"8901","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"269","target":"290","id":"6884","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"430","target":"461","id":"9029","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"147","target":"187","id":"4723","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"20","target":"91","id":"1912","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"488","target":"647","id":"9600","attributes":{"Weight":"1.0"},"color":"rgb(67,116,229)","size":1.0},{"source":"240","target":"711","id":"6411","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"618","target":"703","id":"10408","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"237","target":"449","id":"6360","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"351","target":"464","id":"8094","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"88","target":"692","id":"3508","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"459","target":"479","id":"9350","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"385","target":"656","id":"8514","attributes":{"Weight":"1.0"},"color":"rgb(148,148,132)","size":1.0},{"source":"638","target":"692","id":"10491","attributes":{"Weight":"1.0"},"color":"rgb(164,148,148)","size":1.0},{"source":"533","target":"705","id":"9965","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"318","target":"562","id":"7646","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"133","target":"345","id":"4420","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"171","target":"396","id":"5197","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"399","target":"412","id":"8684","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"439","target":"708","id":"9146","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"137","target":"273","id":"4502","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"82","target":"687","id":"3368","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"1","target":"525","id":"1478","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"231","target":"616","id":"6274","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"295","target":"318","id":"7313","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"110","target":"569","id":"3948","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"318","target":"355","id":"7637","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"26","target":"449","id":"2049","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"142","target":"147","id":"4605","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"168","target":"486","id":"5140","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"75","target":"403","id":"3203","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"72","target":"75","id":"3129","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"169","target":"267","id":"5149","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"103","target":"295","id":"3811","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"19","target":"416","id":"1900","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"103","target":"355","id":"3814","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"102","target":"305","id":"3791","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"90","target":"265","id":"3540","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"260","target":"596","id":"6742","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"135","target":"319","id":"4458","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"552","target":"595","id":"10069","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"43","target":"670","id":"2456","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"301","target":"469","id":"7406","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"567","target":"717","id":"10147","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"56","target":"527","id":"2757","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"150","target":"572","id":"4793","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"229","target":"355","id":"6238","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"111","target":"135","id":"3959","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"109","target":"378","id":"3918","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"86","target":"300","id":"3439","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"187","target":"263","id":"5495","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"335","target":"576","id":"7887","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"391","target":"559","id":"8588","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"164","target":"643","id":"5070","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"453","target":"723","id":"9293","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"378","target":"501","id":"8398","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"183","target":"684","id":"5434","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"58","target":"291","id":"2800","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"428","target":"732","id":"9017","attributes":{"Weight":"1.0"},"color":"rgb(229,115,67)","size":1.0},{"source":"34","target":"169","id":"2246","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"79","target":"480","id":"3292","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"228","target":"305","id":"6219","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"425","target":"523","id":"8970","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"260","target":"602","id":"6743","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"106","target":"630","id":"3869","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"314","target":"338","id":"7582","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"111","target":"294","id":"3966","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"36","target":"666","id":"2304","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"595","target":"710","id":"10305","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"376","target":"529","id":"8370","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"55","target":"514","id":"2738","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"330","target":"393","id":"7815","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"157","target":"669","id":"4943","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"438","target":"725","id":"9135","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"106","target":"181","id":"3859","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"400","target":"545","id":"8698","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"540","target":"641","id":"10009","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"130","target":"304","id":"4354","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"386","target":"527","id":"8521","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"316","target":"572","id":"7616","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"191","target":"531","id":"5578","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"169","target":"295","id":"5152","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"31","target":"554","id":"2181","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"122","target":"517","id":"4202","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"160","target":"621","id":"4991","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"267","target":"494","id":"6854","attributes":{"Weight":"1.0"},"color":"rgb(67,196,148)","size":1.0},{"source":"73","target":"204","id":"3153","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"47","target":"656","id":"2559","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"307","target":"680","id":"7497","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"527","target":"677","id":"9917","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"13","target":"584","id":"1769","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"495","target":"584","id":"9664","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"67","target":"516","id":"3022","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"227","target":"316","id":"6199","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"386","target":"522","id":"8520","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"464","target":"551","id":"9399","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"37","target":"107","id":"2308","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"273","target":"495","id":"6953","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"357","target":"564","id":"8156","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"591","target":"644","id":"10292","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"96","target":"100","id":"3665","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"263","target":"301","id":"6783","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"392","target":"561","id":"8604","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"422","target":"449","id":"8932","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"177","target":"408","id":"5311","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"101","target":"124","id":"3763","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"321","target":"626","id":"7691","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"344","target":"512","id":"8011","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"695","target":"733","id":"10660","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"289","target":"586","id":"7232","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"194","target":"702","id":"5633","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"76","target":"604","id":"3236","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"654","target":"702","id":"10570","attributes":{"Weight":"1.0"},"color":"rgb(67,229,116)","size":1.0},{"source":"428","target":"580","id":"9008","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"4","target":"118","id":"1536","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"169","target":"369","id":"5159","attributes":{"Weight":"1.0"},"color":"rgb(67,148,148)","size":1.0},{"source":"229","target":"295","id":"6235","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"537","target":"597","id":"9988","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"365","target":"513","id":"8236","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"2","target":"457","id":"1504","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"36","target":"306","id":"2294","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"23","target":"51","id":"1981","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"278","target":"705","id":"7033","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"257","target":"322","id":"6679","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"387","target":"590","id":"8539","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"300","target":"514","id":"7392","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"157","target":"514","id":"4935","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"106","target":"130","id":"3857","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"291","target":"503","id":"7267","attributes":{"Weight":"1.0"},"color":"rgb(132,229,132)","size":1.0},{"source":"288","target":"589","id":"7214","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"379","target":"702","id":"8418","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"322","target":"715","id":"7705","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"33","target":"484","id":"2236","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"202","target":"487","id":"5779","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"30","target":"186","id":"2147","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"55","target":"143","id":"2724","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"267","target":"295","id":"6848","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"3","target":"531","id":"1528","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"177","target":"612","id":"5319","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"81","target":"515","id":"3339","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"51","target":"695","id":"2641","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"304","target":"701","id":"7462","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"496","target":"673","id":"9675","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"380","target":"599","id":"8426","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"47","target":"674","id":"2561","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"392","target":"560","id":"8603","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"54","target":"294","id":"2701","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"251","target":"674","id":"6596","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"211","target":"212","id":"5912","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"166","target":"373","id":"5103","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"194","target":"500","id":"5625","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"303","target":"629","id":"7446","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"102","target":"353","id":"3794","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"654","target":"679","id":"10568","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"11","target":"404","id":"1718","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"180","target":"511","id":"5377","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"495","target":"570","id":"9663","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"81","target":"471","id":"3335","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"415","target":"583","id":"8849","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"268","target":"414","id":"6877","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"50","target":"319","id":"2613","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"76","target":"573","id":"3233","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"379","target":"537","id":"8412","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"368","target":"429","id":"8266","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"108","target":"274","id":"3893","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"254","target":"696","id":"6647","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"185","target":"634","id":"5473","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"369","target":"667","id":"8283","attributes":{"Weight":"1.0"},"color":"rgb(67,148,180)","size":1.0},{"source":"61","target":"496","id":"2886","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"165","target":"486","id":"5089","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"274","target":"526","id":"6966","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"65","target":"709","id":"2992","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"556","target":"656","id":"10090","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"455","target":"542","id":"9312","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"19","target":"481","id":"1906","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"153","target":"630","id":"4856","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"651","target":"729","id":"10556","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"195","target":"519","id":"5644","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"589","target":"719","id":"10284","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"90","target":"476","id":"3546","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"213","target":"513","id":"5965","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"260","target":"723","id":"6751","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"87","target":"728","id":"3481","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"52","target":"328","id":"2652","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"5","target":"240","id":"1563","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"374","target":"614","id":"8344","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"85","target":"151","id":"3410","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"186","target":"489","id":"5489","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"221","target":"645","id":"6113","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"78","target":"666","id":"3276","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"366","target":"693","id":"8250","attributes":{"Weight":"1.0"},"color":"rgb(115,148,148)","size":1.0},{"source":"365","target":"683","id":"8240","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"472","target":"521","id":"9478","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"176","target":"367","id":"5287","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"150","target":"576","id":"4794","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"227","target":"586","id":"6208","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"337","target":"633","id":"7921","attributes":{"Weight":"1.0"},"color":"rgb(99,180,148)","size":1.0},{"source":"10","target":"181","id":"1690","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"348","target":"654","id":"8057","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"136","target":"343","id":"4486","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"367","target":"464","id":"8256","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"301","target":"602","id":"7411","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"217","target":"278","id":"6030","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"140","target":"172","id":"4557","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"299","target":"301","id":"7370","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"590","target":"664","id":"10287","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"364","target":"683","id":"8225","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"70","target":"424","id":"3095","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"308","target":"575","id":"7505","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"166","target":"634","id":"5111","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"250","target":"557","id":"6572","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"594","target":"663","id":"10303","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"74","target":"384","id":"3175","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"61","target":"149","id":"2870","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"183","target":"633","id":"5429","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"260","target":"366","id":"6735","attributes":{"Weight":"1.0"},"color":"rgb(115,148,148)","size":1.0},{"source":"641","target":"695","id":"10505","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"144","target":"231","id":"4650","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"174","target":"293","id":"5252","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"373","target":"644","id":"8326","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"314","target":"507","id":"7588","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"427","target":"536","id":"8996","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"449","target":"482","id":"9251","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"320","target":"512","id":"7682","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"163","target":"501","id":"5048","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"261","target":"591","id":"6766","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"89","target":"257","id":"3518","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"648","target":"678","id":"10539","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"88","target":"339","id":"3493","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"217","target":"420","id":"6034","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"332","target":"580","id":"7847","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"362","target":"484","id":"8200","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"230","target":"344","id":"6250","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"319","target":"643","id":"7671","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"188","target":"332","id":"5514","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"129","target":"191","id":"4332","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"499","target":"552","id":"9702","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"144","target":"528","id":"4663","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"49","target":"355","id":"2592","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"210","target":"321","id":"5901","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"625","target":"667","id":"10435","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"233","target":"279","id":"6295","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"283","target":"412","id":"7128","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"75","target":"505","id":"3205","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"283","target":"290","id":"7116","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"206","target":"727","id":"5852","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"469","target":"539","id":"9448","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"283","target":"390","id":"7119","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"4","target":"43","id":"1534","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"20","target":"90","id":"1911","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"199","target":"220","id":"5715","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"238","target":"583","id":"6379","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"165","target":"168","id":"5078","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"442","target":"614","id":"9190","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"29","target":"313","id":"2130","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"146","target":"337","id":"4711","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"97","target":"274","id":"3689","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"287","target":"319","id":"7180","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"472","target":"565","id":"9482","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"55","target":"698","id":"2745","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"268","target":"411","id":"6874","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"156","target":"544","id":"4919","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"646","target":"734","id":"10528","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"610","target":"661","id":"10368","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"61","target":"682","id":"2896","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"325","target":"396","id":"7733","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"265","target":"341","id":"6819","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"87","target":"594","id":"3475","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"386","target":"681","id":"8531","attributes":{"Weight":"1.0"},"color":"rgb(83,229,99)","size":1.0},{"source":"372","target":"551","id":"8315","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"285","target":"735","id":"7164","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"476","target":"681","id":"9529","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"112","target":"223","id":"3992","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"541","target":"680","id":"10016","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"1","target":"173","id":"1467","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"204","target":"270","id":"5806","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"578","target":"723","id":"10235","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"424","target":"487","id":"8954","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"243","target":"293","id":"6448","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"269","target":"395","id":"6892","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"246","target":"436","id":"6501","attributes":{"Weight":"1.0"},"color":"rgb(196,67,213)","size":1.0},{"source":"277","target":"511","id":"7009","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"183","target":"688","id":"5435","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"443","target":"719","id":"9208","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"99","target":"630","id":"3741","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"497","target":"633","id":"9681","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"460","target":"527","id":"9358","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"377","target":"392","id":"8379","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"137","target":"284","id":"4503","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"74","target":"685","id":"3190","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"423","target":"674","id":"8948","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"589","target":"644","id":"10282","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"77","target":"479","id":"3254","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"17","target":"546","id":"1861","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"216","target":"381","id":"6011","attributes":{"Weight":"1.0"},"color":"rgb(229,115,148)","size":1.0},{"source":"600","target":"734","id":"10326","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"271","target":"615","id":"6926","attributes":{"Weight":"1.0"},"color":"rgb(132,148,148)","size":1.0},{"source":"253","target":"656","id":"6627","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"268","target":"561","id":"6880","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"358","target":"424","id":"8160","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"638","target":"639","id":"10488","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"179","target":"627","id":"5362","attributes":{"Weight":"1.0"},"color":"rgb(67,180,180)","size":1.0},{"source":"456","target":"551","id":"9325","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"138","target":"387","id":"4522","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"501","target":"563","id":"9716","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"82","target":"577","id":"3361","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"387","target":"628","id":"8540","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"194","target":"597","id":"5630","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"63","target":"715","id":"2944","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"325","target":"606","id":"7741","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"335","target":"555","id":"7885","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"135","target":"569","id":"4474","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"562","target":"604","id":"10120","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"232","target":"335","id":"6284","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"272","target":"628","id":"6943","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"194","target":"363","id":"5621","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"308","target":"335","id":"7499","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"291","target":"622","id":"7269","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"386","target":"616","id":"8525","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"123","target":"237","id":"4213","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"20","target":"265","id":"1919","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"55","target":"301","id":"2732","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"110","target":"629","id":"3953","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"528","target":"713","id":"9933","attributes":{"Weight":"1.0"},"color":"rgb(148,196,99)","size":1.0},{"source":"316","target":"569","id":"7615","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"105","target":"366","id":"3849","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"152","target":"448","id":"4837","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"456","target":"609","id":"9326","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"310","target":"515","id":"7533","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"158","target":"732","id":"4957","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"109","target":"388","id":"3919","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"96","target":"181","id":"3670","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"71","target":"182","id":"3111","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"202","target":"600","id":"5781","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"286","target":"618","id":"7175","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"100","target":"153","id":"3748","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"307","target":"518","id":"7494","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"201","target":"595","id":"5763","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"273","target":"380","id":"6950","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"181","target":"630","id":"5397","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"576","target":"616","id":"10213","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"465","target":"647","id":"9408","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"64","target":"320","id":"2961","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"279","target":"376","id":"7039","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"140","target":"667","id":"4578","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"266","target":"504","id":"6834","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"239","target":"320","id":"6388","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"76","target":"679","id":"3239","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"162","target":"271","id":"5019","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"40","target":"247","id":"2380","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"20","target":"242","id":"1918","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"352","target":"711","id":"8115","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"54","target":"358","id":"2703","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"9","target":"595","id":"1680","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"244","target":"496","id":"6466","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"401","target":"423","id":"8709","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"382","target":"724","id":"8466","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"31","target":"105","id":"2168","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"40","target":"78","id":"2377","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"498","target":"687","id":"9700","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"298","target":"518","id":"7364","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"10","target":"341","id":"1695","attributes":{"Weight":"1.0"},"color":"rgb(83,148,148)","size":1.0},{"source":"184","target":"204","id":"5441","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"335","target":"642","id":"7891","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"45","target":"252","id":"2500","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"205","target":"605","id":"5834","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"47","target":"410","id":"2553","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"237","target":"249","id":"6354","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"312","target":"516","id":"7557","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"123","target":"447","id":"4219","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"183","target":"270","id":"5418","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"214","target":"362","id":"5979","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"75","target":"691","id":"3211","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"6","target":"541","id":"1598","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"62","target":"365","id":"2911","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"356","target":"545","id":"8143","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"27","target":"415","id":"2071","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"140","target":"532","id":"4573","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"50","target":"397","id":"2618","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"249","target":"291","id":"6543","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"508","target":"594","id":"9773","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"70","target":"358","id":"3093","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"294","target":"623","id":"7306","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"322","target":"474","id":"7696","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"402","target":"423","id":"8720","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"143","target":"157","id":"4627","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"699","target":"717","id":"10662","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"15","target":"526","id":"1814","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"274","target":"525","id":"6965","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"8","target":"144","id":"1631","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"522","target":"525","id":"9863","attributes":{"Weight":"1.0"},"color":"rgb(67,196,180)","size":1.0},{"source":"22","target":"51","id":"1961","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"91","target":"365","id":"3563","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"221","target":"424","id":"6102","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"615","target":"718","id":"10399","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"447","target":"622","id":"9236","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"96","target":"106","id":"3667","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"404","target":"520","id":"8745","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"22","target":"23","id":"1957","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"34","target":"276","id":"2251","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"16","target":"641","id":"1837","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"460","target":"646","id":"9366","attributes":{"Weight":"1.0"},"color":"rgb(67,164,180)","size":1.0},{"source":"400","target":"410","id":"8696","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"488","target":"662","id":"9601","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"168","target":"463","id":"5139","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"636","target":"688","id":"10481","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"175","target":"542","id":"5277","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"327","target":"721","id":"7777","attributes":{"Weight":"1.0"},"color":"rgb(115,229,115)","size":1.0},{"source":"71","target":"217","id":"3113","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"231","target":"335","id":"6263","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"302","target":"524","id":"7420","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"28","target":"210","id":"2098","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"48","target":"51","id":"2564","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"133","target":"566","id":"4427","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"89","target":"159","id":"3514","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"157","target":"491","id":"4934","attributes":{"Weight":"1.0"},"color":"rgb(99,83,229)","size":1.0},{"source":"232","target":"238","id":"6279","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"262","target":"512","id":"6780","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"574","target":"649","id":"10197","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"109","target":"506","id":"3922","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"257","target":"726","id":"6694","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"123","target":"252","id":"4215","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"583","target":"713","id":"10259","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"466","target":"689","id":"9423","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"440","target":"728","id":"9166","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"63","target":"102","id":"2922","attributes":{"Weight":"1.0"},"color":"rgb(196,67,180)","size":1.0},{"source":"216","target":"719","id":"6029","attributes":{"Weight":"1.0"},"color":"rgb(229,115,132)","size":1.0},{"source":"459","target":"541","id":"9353","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"192","target":"389","id":"5588","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"95","target":"506","id":"3656","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"28","target":"50","id":"2088","attributes":{"Weight":"1.0"},"color":"rgb(148,99,213)","size":1.0},{"source":"377","target":"405","id":"8384","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"404","target":"590","id":"8747","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"506","target":"617","id":"9755","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"311","target":"532","id":"7546","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"408","target":"522","id":"8778","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"8","target":"179","id":"1635","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"96","target":"309","id":"3675","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"146","target":"488","id":"4714","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"291","target":"482","id":"7266","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"378","target":"561","id":"8401","attributes":{"Weight":"1.0"},"color":"rgb(229,148,115)","size":1.0},{"source":"121","target":"129","id":"4171","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"377","target":"560","id":"8390","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"32","target":"545","id":"2198","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"368","target":"529","id":"8269","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"511","target":"539","id":"9787","attributes":{"Weight":"1.0"},"color":"rgb(180,115,148)","size":1.0},{"source":"439","target":"704","id":"9145","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"420","target":"662","id":"8912","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"647","target":"724","id":"10533","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"278","target":"337","id":"7024","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"292","target":"708","id":"7280","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"373","target":"629","id":"8324","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"361","target":"512","id":"8197","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"97","target":"585","id":"3700","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"177","target":"179","id":"5301","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"331","target":"431","id":"7831","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"80","target":"238","id":"3310","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"256","target":"564","id":"6675","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"380","target":"570","id":"8423","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"49","target":"564","id":"2598","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"622","target":"675","id":"10423","attributes":{"Weight":"1.0"},"color":"rgb(197,229,67)","size":1.0},{"source":"413","target":"414","id":"8835","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"29","target":"620","id":"2141","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"193","target":"730","id":"5615","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"70","target":"221","id":"3088","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"146","target":"420","id":"4713","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"69","target":"725","id":"3079","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"508","target":"523","id":"9768","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"69","target":"374","id":"3063","attributes":{"Weight":"1.0"},"color":"rgb(67,164,196)","size":1.0},{"source":"357","target":"510","id":"8154","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"214","target":"484","id":"5982","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"186","target":"236","id":"5482","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"419","target":"487","id":"8896","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"498","target":"611","id":"9693","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"664","target":"670","id":"10595","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"266","target":"453","id":"6833","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"288","target":"521","id":"7205","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"132","target":"483","id":"4411","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"72","target":"597","id":"3145","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"139","target":"335","id":"4540","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"102","target":"548","id":"3799","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"185","target":"675","id":"5474","attributes":{"Weight":"1.0"},"color":"rgb(213,213,67)","size":1.0},{"source":"198","target":"684","id":"5711","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"209","target":"484","id":"5897","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"597","target":"702","id":"10317","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"92","target":"551","id":"3590","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"89","target":"671","id":"3530","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"216","target":"528","id":"6016","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"106","target":"366","id":"3864","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"185","target":"490","id":"5469","attributes":{"Weight":"1.0"},"color":"rgb(229,132,132)","size":1.0},{"source":"383","target":"574","id":"8476","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"330","target":"405","id":"7819","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"308","target":"707","id":"7512","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"9","target":"30","id":"1660","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"82","target":"387","id":"3351","attributes":{"Weight":"1.0"},"color":"rgb(67,229,180)","size":1.0},{"source":"110","target":"342","id":"3942","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"74","target":"522","id":"3180","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"589","target":"663","id":"10283","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"300","target":"653","id":"7397","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"380","target":"495","id":"8422","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"75","target":"597","id":"3209","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"221","target":"450","id":"6103","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"358","target":"462","id":"8163","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"338","target":"417","id":"7927","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"704","target":"732","id":"10667","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"358","target":"555","id":"8165","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"281","target":"438","id":"7079","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"144","target":"318","id":"4656","attributes":{"Weight":"1.0"},"color":"rgb(67,229,99)","size":1.0},{"source":"200","target":"702","id":"5747","attributes":{"Weight":"1.0"},"color":"rgb(67,229,100)","size":1.0},{"source":"21","target":"293","id":"1944","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"313","target":"541","id":"7577","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"44","target":"342","id":"2469","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"305","target":"548","id":"7470","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"438","target":"683","id":"9132","attributes":{"Weight":"1.0"},"color":"rgb(83,164,148)","size":1.0},{"source":"556","target":"696","id":"10094","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"408","target":"677","id":"8785","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"179","target":"384","id":"5351","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"282","target":"438","id":"7099","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"213","target":"406","id":"5962","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"137","target":"495","id":"4509","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"18","target":"340","id":"1872","attributes":{"Weight":"1.0"},"color":"rgb(67,229,197)","size":1.0},{"source":"258","target":"308","id":"6696","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"76","target":"433","id":"3222","attributes":{"Weight":"1.0"},"color":"rgb(148,148,196)","size":1.0},{"source":"1","target":"296","id":"1472","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"145","target":"233","id":"4676","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"90","target":"365","id":"3543","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"22","target":"540","id":"1969","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"165","target":"463","id":"5088","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"412","target":"561","id":"8832","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"193","target":"282","id":"5598","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"218","target":"221","id":"6043","attributes":{"Weight":"1.0"},"color":"rgb(67,196,229)","size":1.0},{"source":"210","target":"627","id":"5909","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"20","target":"117","id":"1913","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"119","target":"163","id":"4133","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"93","target":"286","id":"3602","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"34","target":"103","id":"2244","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"256","target":"546","id":"6674","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"28","target":"146","id":"2096","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"375","target":"681","id":"8361","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"103","target":"546","id":"3819","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"195","target":"418","id":"5639","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"54","target":"644","id":"2720","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"371","target":"460","id":"8293","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0},{"source":"169","target":"196","id":"5146","attributes":{"Weight":"1.0"},"color":"rgb(148,148,148)","size":1.0},{"source":"178","target":"551","id":"5341","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"87","target":"676","id":"3480","attributes":{"Weight":"1.0"},"color":"rgb(229,67,213)","size":1.0},{"source":"566","target":"682","id":"10142","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"122","target":"573","id":"4203","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"472","target":"523","id":"9479","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"212","target":"490","id":"5946","attributes":{"Weight":"1.0"},"color":"rgb(148,148,213)","size":1.0},{"source":"293","target":"439","id":"7283","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"17","target":"355","id":"1856","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"350","target":"396","id":"8077","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"472","target":"728","id":"9489","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"369","target":"701","id":"8285","attributes":{"Weight":"1.0"},"color":"rgb(67,67,229)","size":1.0},{"source":"338","target":"534","id":"7930","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"98","target":"609","id":"3721","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"179","target":"460","id":"5354","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"331","target":"529","id":"7835","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"218","target":"296","id":"6048","attributes":{"Weight":"1.0"},"color":"rgb(67,164,229)","size":1.0},{"source":"400","target":"556","id":"8699","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"292","target":"733","id":"7282","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"638","target":"726","id":"10494","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"122","target":"648","id":"4208","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"70","target":"261","id":"3090","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"450","target":"716","id":"9266","attributes":{"Weight":"1.0"},"color":"rgb(148,196,148)","size":1.0},{"source":"44","target":"110","id":"2460","attributes":{"Weight":"1.0"},"color":"rgb(148,148,180)","size":1.0},{"source":"41","target":"495","id":"2406","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"183","target":"516","id":"5425","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"124","target":"262","id":"4236","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"381","target":"663","id":"8448","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"170","target":"694","id":"5188","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"214","target":"239","id":"5973","attributes":{"Weight":"1.0"},"color":"rgb(229,132,67)","size":1.0},{"source":"171","target":"507","id":"5200","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"116","target":"348","id":"4077","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"292","target":"641","id":"7277","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"580","target":"601","id":"10242","attributes":{"Weight":"1.0"},"color":"rgb(229,164,67)","size":1.0},{"source":"327","target":"475","id":"7765","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"83","target":"84","id":"3369","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"442","target":"454","id":"9181","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"129","target":"185","id":"4331","attributes":{"Weight":"1.0"},"color":"rgb(229,197,67)","size":1.0},{"source":"256","target":"275","id":"6664","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"87","target":"543","id":"3471","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"164","target":"371","id":"5063","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"382","target":"729","id":"8468","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"562","target":"589","id":"10118","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"348","target":"415","id":"8048","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"433","target":"480","id":"9072","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"89","target":"553","id":"3524","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"386","target":"625","id":"8526","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"41","target":"306","id":"2401","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"405","target":"559","id":"8757","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"34","target":"564","id":"2261","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"54","target":"642","id":"2719","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"79","target":"122","id":"3278","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"55","target":"300","id":"2731","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"724","target":"725","id":"10676","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"665","target":"690","id":"10597","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"57","target":"196","id":"2770","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"159","target":"726","id":"4979","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"465","target":"651","id":"9410","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"282","target":"724","id":"7110","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"325","target":"673","id":"7744","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"504","target":"596","id":"9734","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"94","target":"325","id":"3623","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"113","target":"579","id":"4016","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"409","target":"543","id":"8799","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"253","target":"401","id":"6619","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"311","target":"386","id":"7540","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"462","target":"642","id":"9387","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"504","target":"723","id":"9743","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"514","target":"653","id":"9805","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"367","target":"615","id":"8262","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"423","target":"694","id":"8949","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"157","target":"263","id":"4925","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"160","target":"398","id":"4986","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"114","target":"474","id":"4033","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"143","target":"653","id":"4646","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"563","target":"588","id":"10126","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"504","target":"721","id":"9742","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"289","target":"490","id":"7226","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"135","target":"245","id":"4454","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"104","target":"169","id":"3823","attributes":{"Weight":"1.0"},"color":"rgb(67,229,67)","size":1.0},{"source":"12","target":"555","id":"1746","attributes":{"Weight":"1.0"},"color":"rgb(67,229,229)","size":1.0},{"source":"307","target":"471","id":"7490","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"25","target":"48","id":"2017","attributes":{"Weight":"1.0"},"color":"rgb(229,67,67)","size":1.0},{"source":"114","target":"159","id":"4023","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"328","target":"427","id":"7783","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"657","target":"671","id":"10577","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"522","target":"667","id":"9870","attributes":{"Weight":"1.0"},"color":"rgb(67,229,132)","size":1.0},{"source":"467","target":"570","id":"9431","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"441","target":"647","id":"9171","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"534","target":"670","id":"9970","attributes":{"Weight":"1.0"},"color":"rgb(132,148,213)","size":1.0},{"source":"465","target":"730","id":"9415","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"201","target":"499","id":"5760","attributes":{"Weight":"1.0"},"color":"rgb(229,67,132)","size":1.0},{"source":"29","target":"518","id":"2139","attributes":{"Weight":"1.0"},"color":"rgb(229,100,67)","size":1.0},{"source":"550","target":"563","id":"10060","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"254","target":"402","id":"6636","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"204","target":"736","id":"5820","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"133","target":"496","id":"4424","attributes":{"Weight":"1.0"},"color":"rgb(197,67,229)","size":1.0},{"source":"255","target":"401","id":"6650","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"388","target":"550","id":"8549","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"114","target":"638","id":"4039","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"193","target":"735","id":"5617","attributes":{"Weight":"1.0"},"color":"rgb(67,100,229)","size":1.0},{"source":"117","target":"502","id":"4105","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"41","target":"247","id":"2398","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"152","target":"563","id":"4841","attributes":{"Weight":"1.0"},"color":"rgb(229,229,67)","size":1.0},{"source":"32","target":"356","id":"2192","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"32","target":"402","id":"2195","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"142","target":"698","id":"4625","attributes":{"Weight":"1.0"},"color":"rgb(132,67,229)","size":1.0},{"source":"413","target":"560","id":"8837","attributes":{"Weight":"1.0"},"color":"rgb(229,67,164)","size":1.0},{"source":"456","target":"492","id":"9322","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"91","target":"681","id":"3572","attributes":{"Weight":"1.0"},"color":"rgb(100,229,67)","size":1.0},{"source":"240","target":"434","id":"6401","attributes":{"Weight":"1.0"},"color":"rgb(148,213,99)","size":1.0},{"source":"610","target":"665","id":"10369","attributes":{"Weight":"1.0"},"color":"rgb(164,229,67)","size":1.0},{"source":"76","target":"521","id":"3228","attributes":{"Weight":"1.0"},"color":"rgb(229,67,229)","size":1.0},{"source":"204","target":"684","id":"5817","attributes":{"Weight":"1.0"},"color":"rgb(132,229,67)","size":1.0},{"source":"210","target":"420","id":"5904","attributes":{"Weight":"1.0"},"color":"rgb(67,132,229)","size":1.0},{"source":"145","target":"279","id":"4677","attributes":{"Weight":"1.0"},"color":"rgb(229,67,197)","size":1.0},{"source":"536","target":"615","id":"9983","attributes":{"Weight":"1.0"},"color":"rgb(100,67,229)","size":1.0},{"source":"63","target":"246","id":"2928","attributes":{"Weight":"1.0"},"color":"rgb(164,67,229)","size":1.0},{"source":"170","target":"660","id":"5186","attributes":{"Weight":"1.0"},"color":"rgb(229,67,100)","size":1.0},{"source":"475","target":"687","id":"9524","attributes":{"Weight":"1.0"},"color":"rgb(67,229,164)","size":1.0},{"source":"13","target":"598","id":"1770","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"315","target":"570","id":"7601","attributes":{"Weight":"1.0"},"color":"rgb(67,197,229)","size":1.0},{"source":"151","target":"231","id":"4807","attributes":{"Weight":"1.0"},"color":"rgb(148,148,164)","size":1.0}],"nodes":[{"label":"Ha Dae-sung","x":1235.4569091796875,"y":1551.8240966796875,"id":"268","attributes":{"Eigenvector Centrality":"0.2315255949886878","Betweenness Centrality":"0.0","Appearances":"13","No":"8","Country":"South Korea","Club Country":"China","Club":"Beijing Guoan","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"2 March 1985 (aged 29)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Maxi Pereira","x":-192.70481872558594,"y":101.33695220947266,"id":"486","attributes":{"Eigenvector Centrality":"0.445244561946227","Betweenness Centrality":"0.002622941975601633","Appearances":"90","No":"16","Country":"Uruguay","Club Country":"Portugal","Club":"Benfica","Weighted Degree":"26.0","Modularity Class":"6","Date of birth / Age":"8 June 1984 (aged 30)","Degree":"26","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.32096069868995636"},"color":"rgb(229,197,67)","size":15.333333969116211},{"label":"Manabu Saito","x":700.6929931640625,"y":617.4116821289062,"id":"441","attributes":{"Eigenvector Centrality":"0.3171815377783478","Betweenness Centrality":"0.0","Appearances":"5","No":"20","Country":"Japan","Club Country":"Japan","Club":"Yokohama F. Marinos","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"4 April 1990 (aged 24)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Augusto Fernández","x":-1096.7728271484375,"y":332.52386474609375,"id":"70","attributes":{"Eigenvector Centrality":"0.4883294167498835","Betweenness Centrality":"0.0013747511405558612","Appearances":"9","No":"13","Country":"Argentina","Club Country":"Spain","Club":"Celta Vigo","Weighted Degree":"23.0","Modularity Class":"19","Date of birth / Age":"10 April 1986 (aged 28)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3013530135301353"},"color":"rgb(67,229,229)","size":11.333333015441895},{"label":"Edinson Cavani","x":-109.81510162353516,"y":97.26505279541016,"id":"185","attributes":{"Eigenvector Centrality":"0.5745311470651605","Betweenness Centrality":"0.003956184981235499","Appearances":"62","No":"21","Country":"Uruguay","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"31.0","Modularity Class":"6","Date of birth / Age":"14 February 1987 (aged 27)","Degree":"31","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.328125"},"color":"rgb(229,197,67)","size":22.0},{"label":"Matthias Ginter","x":444.2855224609375,"y":-312.178466796875,"id":"480","attributes":{"Eigenvector Centrality":"0.5180768997288345","Betweenness Centrality":"0.0023990924168658203","Appearances":"2","No":"3","Country":"Germany","Club Country":"Germany","Club":"SC Freiburg","Weighted Degree":"25.0","Modularity Class":"13","Date of birth / Age":"19 January 1994 (aged 20)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3188720173535792"},"color":"rgb(67,229,164)","size":14.0},{"label":"Ki Sung-yueng","x":1168.5513916015625,"y":1424.8240966796875,"id":"390","attributes":{"Eigenvector Centrality":"0.24281665265392566","Betweenness Centrality":"0.0038744127800200497","Appearances":"58","No":"16","Country":"South Korea","Club Country":"England","Club":"Sunderland","Weighted Degree":"23.0","Modularity Class":"10","Date of birth / Age":"24 January 1989 (aged 25)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.2628755364806867"},"color":"rgb(229,67,164)","size":11.333333015441895},{"label":"Johan Djourou","x":57.069740295410156,"y":323.0292663574219,"id":"339","attributes":{"Eigenvector Centrality":"0.39804740593626875","Betweenness Centrality":"7.203079250750265E-4","Appearances":"44","No":"20","Country":"Switzerland","Club Country":"Germany","Club":"Hamburger SV","Weighted Degree":"23.0","Modularity Class":"0","Date of birth / Age":"18 January 1987 (aged 27)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3002450980392157"},"color":"rgb(164,229,67)","size":11.333333015441895},{"label":"Ogenyi Onazi","x":-33.87162780761719,"y":-1294.2327880859375,"id":"537","attributes":{"Eigenvector Centrality":"0.4166984434880051","Betweenness Centrality":"0.01153289479646615","Appearances":"21","No":"17","Country":"Nigeria","Club Country":"Italy","Club":"Lazio","Weighted Degree":"28.0","Modularity Class":"14","Date of birth / Age":"25 December 1992 (aged 21)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3336359509759419"},"color":"rgb(67,229,100)","size":18.0},{"label":"Noel Valladares (c)","x":1633.689697265625,"y":-1230.439697265625,"id":"536","attributes":{"Eigenvector Centrality":"0.2366488794633179","Betweenness Centrality":"0.0","Appearances":"122","No":"18","Country":"Honduras","Club Country":"Honduras","Club":"Olimpia","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"3 May 1977 (aged 37)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Jackson MartÃnez","x":-870.146240234375,"y":947.0243530273438,"id":"304","attributes":{"Eigenvector Centrality":"0.446466126398784","Betweenness Centrality":"0.007655587436909223","Appearances":"27","No":"21","Country":"Colombia","Club Country":"Portugal","Club":"Porto","Weighted Degree":"29.0","Modularity Class":"11","Date of birth / Age":"3 October 1986 (aged 27)","Degree":"29","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.3315290933694181"},"color":"rgb(67,67,229)","size":19.333332061767578},{"label":"Shkodran Mustafi","x":459.89215087890625,"y":-438.27008056640625,"id":"648","attributes":{"Eigenvector Centrality":"0.4748329217376384","Betweenness Centrality":"0.0","Appearances":"1","No":"21","Country":"Germany","Club Country":"Italy","Club":"Sampdoria","Weighted Degree":"22.0","Modularity Class":"13","Date of birth / Age":"17 April 1992 (aged 22)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2955367913148371"},"color":"rgb(67,229,164)","size":10.0},{"label":"Leonardo Bonucci","x":125.05670928955078,"y":766.1940307617188,"id":"416","attributes":{"Eigenvector Centrality":"0.5455496050511396","Betweenness Centrality":"0.0016215443882875223","Appearances":"37","No":"19","Country":"Italy","Club Country":"Italy","Club":"Juventus","Weighted Degree":"28.0","Modularity Class":"3","Date of birth / Age":"1 May 1987 (aged 27)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(197,229,67)","size":18.0},{"label":"Eugenio Mena","x":-294.9122009277344,"y":1499.1805419921875,"id":"209","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"25","No":"2","Country":"Chile","Club Country":"Brazil","Club":"Santos","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"18 July 1988 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Rafael Márquez (c)","x":-2148.71923828125,"y":446.01300048828125,"id":"581","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"120","No":"4","Country":"Mexico","Club Country":"Mexico","Club":"León","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"13 February 1979 (aged 35)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Glen Johnson","x":-77.03864288330078,"y":-917.1484985351562,"id":"258","attributes":{"Eigenvector Centrality":"0.6237674591008824","Betweenness Centrality":"0.0010635550306756442","Appearances":"52","No":"2","Country":"England","Club Country":"England","Club":"Liverpool","Weighted Degree":"27.0","Modularity Class":"28","Date of birth / Age":"23 August 1984 (aged 29)","Degree":"27","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3247901016349978"},"color":"rgb(67,229,132)","size":16.666667938232422},{"label":"Kunle Odunlami","x":-51.50978469848633,"y":-1656.866943359375,"id":"403","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"11","No":"12","Country":"Nigeria","Club Country":"Nigeria","Club":"Sunshine Stars","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"5 March 1990 (aged 24)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Jerry Bengtson","x":1590.51611328125,"y":-1207.114501953125,"id":"328","attributes":{"Eigenvector Centrality":"0.23664887946331797","Betweenness Centrality":"0.0","Appearances":"44","No":"11","Country":"Honduras","Club Country":"United States","Club":"New England Revolution","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"8 April 1987 (aged 27)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Park Chu-young","x":1047.7447509765625,"y":1576.7559814453125,"id":"559","attributes":{"Eigenvector Centrality":"0.2434948987926026","Betweenness Centrality":"0.005100478514823181","Appearances":"64","No":"10","Country":"South Korea","Club Country":"England","Club":"Watford","Weighted Degree":"23.0","Modularity Class":"10","Date of birth / Age":"10 July 1985 (aged 28)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.26649746192893403"},"color":"rgb(229,67,164)","size":11.333333015441895},{"label":"Sergey Ryzhikov","x":-1292.9913330078125,"y":-1369.3878173828125,"id":"641","attributes":{"Eigenvector Centrality":"0.2784495406871368","Betweenness Centrality":"0.0019868644316807485","Appearances":"1","No":"16","Country":"Russia","Club Country":"Russia","Club":"Rubin Kazan","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"19 September 1980 (aged 33)","Degree":"23","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.256186824677588"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Sammir","x":-386.4237060546875,"y":741.6884155273438,"id":"624","attributes":{"Eigenvector Centrality":"0.3564884604564037","Betweenness Centrality":"0.0013005076523818384","Appearances":"6","No":"19","Country":"Croatia","Club Country":"Spain","Club":"Getafe","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"23 April 1987 (aged 27)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30209617755856966"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Milan Badelj","x":-271.9816589355469,"y":685.1373901367188,"id":"514","attributes":{"Eigenvector Centrality":"0.3589573457329694","Betweenness Centrality":"6.712739342317829E-4","Appearances":"9","No":"15","Country":"Croatia","Club Country":"Germany","Club":"Hamburger SV","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"25 February 1989 (aged 25)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3008595988538682"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"José MarÃa Basanta","x":-1144.7310791015625,"y":286.07470703125,"id":"358","attributes":{"Eigenvector Centrality":"0.4756507714516443","Betweenness Centrality":"0.0","Appearances":"10","No":"23","Country":"Argentina","Club Country":"Mexico","Club":"Monterrey","Weighted Degree":"22.0","Modularity Class":"19","Date of birth / Age":"3 April 1984 (aged 30)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2930622009569378"},"color":"rgb(67,229,229)","size":10.0},{"label":"Raúl Albiol","x":-934.9326782226562,"y":-101.35684204101562,"id":"591","attributes":{"Eigenvector Centrality":"0.9188656127061582","Betweenness Centrality":"0.004836935094169011","Appearances":"46","No":"2","Country":"Spain","Club Country":"Italy","Club":"Napoli","Weighted Degree":"32.0","Modularity Class":"23","Date of birth / Age":"4 September 1985 (aged 28)","Degree":"32","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.34249767008387694"},"color":"rgb(229,67,197)","size":23.33333396911621},{"label":"Jordan Henderson","x":-137.00108337402344,"y":-918.7854614257812,"id":"348","attributes":{"Eigenvector Centrality":"0.6237674591008823","Betweenness Centrality":"0.0010635550306756442","Appearances":"11","No":"14","Country":"England","Club Country":"England","Club":"Liverpool","Weighted Degree":"27.0","Modularity Class":"28","Date of birth / Age":"17 June 1990 (aged 23)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3247901016349978"},"color":"rgb(67,229,132)","size":16.666667938232422},{"label":"Masoud Shojaei","x":2059.234375,"y":1154.055419921875,"id":"467","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"50","No":"7","Country":"Iran","Club Country":"Spain","Club":"Las Palmas","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"9 June 1984 (aged 30)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Eden Hazard","x":-567.4556884765625,"y":-819.4087524414062,"id":"179","attributes":{"Eigenvector Centrality":"0.8054480780736979","Betweenness Centrality":"0.004148263742758199","Appearances":"45","No":"10","Country":"Belgium","Club Country":"England","Club":"Chelsea","Weighted Degree":"33.0","Modularity Class":"28","Date of birth / Age":"7 January 1991 (aged 23)","Degree":"33","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34950071326676174"},"color":"rgb(67,229,132)","size":24.666667938232422},{"label":"Victor Moses","x":-114.1285629272461,"y":-1433.164306640625,"id":"702","attributes":{"Eigenvector Centrality":"0.4988980810402226","Betweenness Centrality":"0.0059333803012395","Appearances":"22","No":"11","Country":"Nigeria","Club Country":"England","Club":"Liverpool","Weighted Degree":"31.0","Modularity Class":"14","Date of birth / Age":"12 December 1990 (aged 23)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3206806282722513"},"color":"rgb(67,229,100)","size":22.0},{"label":"Gotoku Sakai","x":626.2552490234375,"y":448.10638427734375,"id":"264","attributes":{"Eigenvector Centrality":"0.3583261950704595","Betweenness Centrality":"0.006133180800190253","Appearances":"12","No":"3","Country":"Japan","Club Country":"Germany","Club":"VfB Stuttgart","Weighted Degree":"25.0","Modularity Class":"27","Date of birth / Age":"14 March 1991 (aged 23)","Degree":"25","Position":"DF","Eccentricity":"4.0","Closeness Centrality":"0.33669262482821805"},"color":"rgb(67,100,229)","size":14.0},{"label":"Jung Sung-ryong","x":1253.423583984375,"y":1593.709716796875,"id":"377","attributes":{"Eigenvector Centrality":"0.2315255949886878","Betweenness Centrality":"0.0","Appearances":"61","No":"1","Country":"South Korea","Club Country":"South Korea","Club":"Suwon Bluewings","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"4 January 1985 (aged 29)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Giorgos Samaras","x":1468.084716796875,"y":290.1719665527344,"id":"254","attributes":{"Eigenvector Centrality":"0.3022386539935686","Betweenness Centrality":"0.015975933226232208","Appearances":"74","No":"7","Country":"Greece","Club Country":"Scotland","Club":"Celtic","Weighted Degree":"25.0","Modularity Class":"15","Date of birth / Age":"21 February 1985 (aged 29)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30523255813953487"},"color":"rgb(229,67,100)","size":14.0},{"label":"Fabrice Olinga","x":342.7852783203125,"y":88.49571228027344,"id":"217","attributes":{"Eigenvector Centrality":"0.3410519410379994","Betweenness Centrality":"0.0014859748176380408","Appearances":"8","No":"19","Country":"Cameroon","Club Country":"Belgium","Club":"Zulte Waregem","Weighted Degree":"23.0","Modularity Class":"17","Date of birth / Age":"12 May 1996 (aged 18)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.32407407407407407"},"color":"rgb(67,132,229)","size":11.333333015441895},{"label":"Maxim Choupo-Moting","x":590.2083740234375,"y":305.8430480957031,"id":"488","attributes":{"Eigenvector Centrality":"0.37131553578083376","Betweenness Centrality":"0.01444381785094054","Appearances":"26","No":"13","Country":"Cameroon","Club Country":"Germany","Club":"Mainz 05","Weighted Degree":"26.0","Modularity Class":"17","Date of birth / Age":"23 March 1989 (aged 25)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3319783197831978"},"color":"rgb(67,132,229)","size":15.333333969116211},{"label":"Jermaine Jones","x":734.7730102539062,"y":-1356.2696533203125,"id":"326","attributes":{"Eigenvector Centrality":"0.30080819732983394","Betweenness Centrality":"0.005869237175578168","Appearances":"42","No":"13","Country":"United States","Club Country":"Turkey","Club":"Be?ikta?","Weighted Degree":"24.0","Modularity Class":"26","Date of birth / Age":"3 November 1981 (aged 32)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3057404326123128"},"color":"rgb(100,229,67)","size":12.666666984558105},{"label":"Viktor Fayzulin","x":-1257.4415283203125,"y":-1320.703125,"id":"704","attributes":{"Eigenvector Centrality":"0.34982465542448266","Betweenness Centrality":"0.004583905120882726","Appearances":"19","No":"20","Country":"Russia","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"26.0","Modularity Class":"2","Date of birth / Age":"22 April 1986 (aged 28)","Degree":"26","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.27904328018223234"},"color":"rgb(229,67,67)","size":15.333333969116211},{"label":"Ghasem Haddadifar","x":1942.61962890625,"y":1184.328125,"id":"247","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"17","No":"11","Country":"Iran","Club Country":"Iran","Club":"Zob Ahan","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"12 July 1983 (aged 30)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Mamadou Sakho","x":-55.28839874267578,"y":-503.58740234375,"id":"440","attributes":{"Eigenvector Centrality":"0.6719226159356836","Betweenness Centrality":"0.0030924546628977845","Appearances":"19","No":"5","Country":"France","Club Country":"England","Club":"Liverpool","Weighted Degree":"31.0","Modularity Class":"16","Date of birth / Age":"13 February 1990 (aged 24)","Degree":"31","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3309320126069338"},"color":"rgb(229,67,229)","size":22.0},{"label":"Majeed Waris","x":324.3560485839844,"y":1417.5355224609375,"id":"437","attributes":{"Eigenvector Centrality":"0.30228653977349984","Betweenness Centrality":"0.002131225990650735","Appearances":"13","No":"18","Country":"Ghana","Club Country":"France","Club":"Valenciennes","Weighted Degree":"23.0","Modularity Class":"5","Date of birth / Age":"19 September 1991 (aged 22)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.29708973322554566"},"color":"rgb(67,229,197)","size":11.333333015441895},{"label":"Jaime AyovÃ","x":-1695.57470703125,"y":-675.8545532226562,"id":"305","attributes":{"Eigenvector Centrality":"0.3623062182068215","Betweenness Centrality":"0.0","Appearances":"30","No":"17","Country":"Ecuador","Club Country":"Mexico","Club":"Tijuana","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"21 February 1988 (aged 26)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Christian Atsu","x":298.6339111328125,"y":1290.552734375,"id":"118","attributes":{"Eigenvector Centrality":"0.3040272220343691","Betweenness Centrality":"0.0033363298478359237","Appearances":"23","No":"7","Country":"Ghana","Club Country":"Netherlands","Club":"Vitesse","Weighted Degree":"23.0","Modularity Class":"5","Date of birth / Age":"10 January 1992 (aged 22)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2960128876359243"},"color":"rgb(67,229,197)","size":11.333333015441895},{"label":"Albert Adomah","x":449.0231628417969,"y":1183.720458984375,"id":"18","attributes":{"Eigenvector Centrality":"0.3025700565824491","Betweenness Centrality":"0.003289744732058429","Appearances":"15","No":"14","Country":"Ghana","Club Country":"England","Club":"Middlesbrough","Weighted Degree":"23.0","Modularity Class":"5","Date of birth / Age":"13 December 1987 (aged 26)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2973300970873787"},"color":"rgb(67,229,197)","size":11.333333015441895},{"label":"João Moutinho","x":-709.1241455078125,"y":410.86029052734375,"id":"332","attributes":{"Eigenvector Centrality":"0.45621028793672236","Betweenness Centrality":"0.0015929309060191388","Appearances":"68","No":"8","Country":"Portugal","Club Country":"France","Club":"AS Monaco","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"8 September 1986 (aged 27)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(229,164,67)","size":14.0},{"label":"Neymar","x":-688.3394775390625,"y":-195.9782257080078,"id":"529","attributes":{"Eigenvector Centrality":"0.9475639715704524","Betweenness Centrality":"0.005368122690024312","Appearances":"49","No":"10","Country":"Brazil","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"36.0","Modularity Class":"23","Date of birth / Age":"5 February 1992 (aged 22)","Degree":"36","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.34249767008387694"},"color":"rgb(229,67,197)","size":28.66666603088379},{"label":"Giannis Fetfatzidis","x":1469.207275390625,"y":587.9270629882812,"id":"250","attributes":{"Eigenvector Centrality":"0.2880961103470562","Betweenness Centrality":"0.004458743060852615","Appearances":"19","No":"18","Country":"Greece","Club Country":"Italy","Club":"Genoa","Weighted Degree":"24.0","Modularity Class":"15","Date of birth / Age":"21 December 1990 (aged 23)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2996331023236853"},"color":"rgb(229,67,100)","size":12.666666984558105},{"label":"Axel Witsel","x":-844.521240234375,"y":-894.0247192382812,"id":"74","attributes":{"Eigenvector Centrality":"0.6174086302888657","Betweenness Centrality":"0.006770928561410678","Appearances":"48","No":"6","Country":"Belgium","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"28.0","Modularity Class":"28","Date of birth / Age":"12 January 1989 (aged 25)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3343949044585987"},"color":"rgb(67,229,132)","size":18.0},{"label":"Gary Medel","x":-135.52125549316406,"y":1534.207275390625,"id":"239","attributes":{"Eigenvector Centrality":"0.32635320504193394","Betweenness Centrality":"0.006690023717310697","Appearances":"61","No":"17","Country":"Chile","Club Country":"Wales","Club":"Cardiff City","Weighted Degree":"23.0","Modularity Class":"18","Date of birth / Age":"3 August 1987 (aged 26)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.2878965922444183"},"color":"rgb(229,132,67)","size":11.333333015441895},{"label":"Eyong Enoh","x":420.9879455566406,"y":149.03363037109375,"id":"210","attributes":{"Eigenvector Centrality":"0.3227718779440803","Betweenness Centrality":"0.0","Appearances":"38","No":"18","Country":"Cameroon","Club Country":"Turkey","Club":"Antalyaspor","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"23 March 1986 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"Reza Haghighi","x":1912.50830078125,"y":1151.8526611328125,"id":"599","attributes":{"Eigenvector Centrality":"0.21274429344229642","Betweenness Centrality":"0.0","Appearances":"8","No":"8","Country":"Iran","Club Country":"Iran","Club":"Persepolis","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"1 February 1989 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Rahman Ahmadi","x":2011.62890625,"y":1143.9183349609375,"id":"584","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"10","No":"1","Country":"Iran","Club Country":"Iran","Club":"Sepahan","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"30 July 1980 (aged 33)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Landry N\u0027Guémo","x":380.334228515625,"y":127.53271484375,"id":"407","attributes":{"Eigenvector Centrality":"0.3227718779440803","Betweenness Centrality":"0.0","Appearances":"40","No":"7","Country":"Cameroon","Club Country":"France","Club":"Bordeaux","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"28 November 1985 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"Omar Gonzalez","x":770.2596435546875,"y":-1596.33251953125,"id":"544","attributes":{"Eigenvector Centrality":"0.27181518429351065","Betweenness Centrality":"0.0","Appearances":"20","No":"3","Country":"United States","Club Country":"United States","Club":"Los Angeles Galaxy","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"11 October 1988 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Mauricio Isla","x":-142.6880340576172,"y":1330.8896484375,"id":"483","attributes":{"Eigenvector Centrality":"0.5204561062047254","Betweenness Centrality":"0.00860736609402208","Appearances":"47","No":"4","Country":"Chile","Club Country":"Italy","Club":"Juventus","Weighted Degree":"32.0","Modularity Class":"18","Date of birth / Age":"12 June 1988 (aged 26)","Degree":"32","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.31599312123817713"},"color":"rgb(229,132,67)","size":23.33333396911621},{"label":"Marco Ureña","x":2171.260498046875,"y":406.7074890136719,"id":"448","attributes":{"Eigenvector Centrality":"0.24681597010360032","Betweenness Centrality":"0.007576013866204986","Appearances":"24","No":"21","Country":"Costa Rica","Club Country":"Russia","Club":"Kuban Krasnodar","Weighted Degree":"23.0","Modularity Class":"29","Date of birth / Age":"5 March 1990 (aged 24)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.27212143650499815"},"color":"rgb(229,229,67)","size":11.333333015441895},{"label":"Alireza Haghighi","x":1910.173095703125,"y":1066.8309326171875,"id":"35","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"6","No":"12","Country":"Iran","Club Country":"Portugal","Club":"Sporting Covilhã","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"2 May 1988 (aged 26)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Nabil Ghilas","x":-1331.1390380859375,"y":965.755126953125,"id":"526","attributes":{"Eigenvector Centrality":"0.4451346192495991","Betweenness Centrality":"0.00948599580264796","Appearances":"5","No":"9","Country":"Algeria","Club Country":"Portugal","Club":"Porto","Weighted Degree":"30.0","Modularity Class":"24","Date of birth / Age":"20 April 1990 (aged 24)","Degree":"30","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.32608695652173914"},"color":"rgb(67,164,229)","size":20.666667938232422},{"label":"Ejike Uzoenyi","x":-90.41376495361328,"y":-1613.627685546875,"id":"194","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"21","No":"3","Country":"Nigeria","Club Country":"Nigeria","Club":"Enugu Rangers","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"23 March 1988 (aged 26)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Giancarlo González","x":2265.36669921875,"y":299.92572021484375,"id":"248","attributes":{"Eigenvector Centrality":"0.23496944760866384","Betweenness Centrality":"0.0","Appearances":"35","No":"3","Country":"Costa Rica","Club Country":"United States","Club":"Columbus Crew","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"8 February 1988 (aged 26)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Ezequiel Lavezzi","x":-846.7564697265625,"y":254.6559600830078,"id":"212","attributes":{"Eigenvector Centrality":"0.6719025529242287","Betweenness Centrality":"0.0033630652398584098","Appearances":"31","No":"22","Country":"Argentina","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"31.0","Modularity Class":"19","Date of birth / Age":"3 May 1985 (aged 29)","Degree":"31","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3173575129533679"},"color":"rgb(67,229,229)","size":22.0},{"label":"Mats Hummels","x":607.8975219726562,"y":-421.7085876464844,"id":"475","attributes":{"Eigenvector Centrality":"0.500680986024227","Betweenness Centrality":"0.008472576600609625","Appearances":"30","No":"5","Country":"Germany","Club Country":"Germany","Club":"Borussia Dortmund","Weighted Degree":"24.0","Modularity Class":"13","Date of birth / Age":"16 December 1988 (aged 25)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.310126582278481"},"color":"rgb(67,229,164)","size":12.666666984558105},{"label":"Lee Keun-ho","x":1296.3543701171875,"y":1607.599609375,"id":"413","attributes":{"Eigenvector Centrality":"0.23152559498868786","Betweenness Centrality":"0.0","Appearances":"63","No":"11","Country":"South Korea","Club Country":"South Korea","Club":"Sangju Sangmu","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"11 April 1985 (aged 29)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Giovanni Sio","x":405.2397155761719,"y":-662.28076171875,"id":"257","attributes":{"Eigenvector Centrality":"0.37146876286160685","Betweenness Centrality":"0.004611725554141086","Appearances":"7","No":"21","Country":"Ivory Coast","Club Country":"Switzerland","Club":"Basel","Weighted Degree":"26.0","Modularity Class":"9","Date of birth / Age":"31 March 1989 (aged 25)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(164,67,229)","size":15.333333969116211},{"label":"Yuri Lodygin","x":-1301.04150390625,"y":-1265.7510986328125,"id":"732","attributes":{"Eigenvector Centrality":"0.34982465542448254","Betweenness Centrality":"0.004583905120882726","Appearances":"3","No":"12","Country":"Russia","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"26.0","Modularity Class":"2","Date of birth / Age":"26 May 1990 (aged 24)","Degree":"26","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.27904328018223234"},"color":"rgb(229,67,67)","size":15.333333969116211},{"label":"Sol Bamba","x":570.6759033203125,"y":-908.820556640625,"id":"657","attributes":{"Eigenvector Centrality":"0.30966117600400694","Betweenness Centrality":"0.0","Appearances":"43","No":"22","Country":"Ivory Coast","Club Country":"Turkey","Club":"Trabzonspor","Weighted Degree":"22.0","Modularity Class":"9","Date of birth / Age":"13 January 1985 (aged 29)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2929453965723396"},"color":"rgb(164,67,229)","size":10.0},{"label":"Aïssa Mandi","x":-1380.8287353515625,"y":1169.2930908203125,"id":"15","attributes":{"Eigenvector Centrality":"0.2958935568628798","Betweenness Centrality":"0.0","Appearances":"2","No":"20","Country":"Algeria","Club Country":"France","Club":"Reims","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"22 October 1991 (aged 22)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Ognjen Vukojevic","x":-265.94671630859375,"y":620.2861938476562,"id":"539","attributes":{"Eigenvector Centrality":"0.37500667699203727","Betweenness Centrality":"0.0014678886642237275","Appearances":"55","No":"8","Country":"Croatia","Club Country":"Ukraine","Club":"Dynamo Kyiv","Weighted Degree":"24.0","Modularity Class":"25","Date of birth / Age":"20 December 1983 (aged 30)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31450577663671375"},"color":"rgb(132,67,229)","size":12.666666984558105},{"label":"Lucas Digne","x":-18.41677474975586,"y":-111.03685760498047,"id":"425","attributes":{"Eigenvector Centrality":"0.6370473545952836","Betweenness Centrality":"0.001865102966313942","Appearances":"2","No":"17","Country":"France","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"29.0","Modularity Class":"16","Date of birth / Age":"20 July 1993 (aged 20)","Degree":"29","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(229,67,229)","size":19.333332061767578},{"label":"Christian Noboa","x":-1672.23583984375,"y":-885.3366088867188,"id":"120","attributes":{"Eigenvector Centrality":"0.4300722628882676","Betweenness Centrality":"0.01081726782351466","Appearances":"42","No":"6","Country":"Ecuador","Club Country":"Russia","Club":"Dynamo Moscow","Weighted Degree":"28.0","Modularity Class":"4","Date of birth / Age":"9 April 1985 (aged 29)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.29317909852413243"},"color":"rgb(229,67,132)","size":18.0},{"label":"Koo Ja-cheol (c)","x":1210.030029296875,"y":1383.635498046875,"id":"399","attributes":{"Eigenvector Centrality":"0.2716656711357499","Betweenness Centrality":"0.007710065459146181","Appearances":"37","No":"13","Country":"South Korea","Club Country":"Germany","Club":"Mainz 05","Weighted Degree":"25.0","Modularity Class":"10","Date of birth / Age":"27 February 1989 (aged 25)","Degree":"25","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.28846153846153844"},"color":"rgb(229,67,164)","size":14.0},{"label":"Adnan Januzaj","x":-638.5029907226562,"y":-663.0790405273438,"id":"8","attributes":{"Eigenvector Centrality":"0.8465738555476343","Betweenness Centrality":"0.005671820760248386","Appearances":"1","No":"20","Country":"Belgium","Club Country":"England","Club":"Manchester United","Weighted Degree":"34.0","Modularity Class":"28","Date of birth / Age":"5 February 1995 (aged 19)","Degree":"34","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3554158607350097"},"color":"rgb(67,229,132)","size":26.0},{"label":"Rúben Amorim","x":-743.581787109375,"y":322.57769775390625,"id":"618","attributes":{"Eigenvector Centrality":"0.4623139362600413","Betweenness Centrality":"0.0011159545915913598","Appearances":"13","No":"20","Country":"Portugal","Club Country":"Portugal","Club":"Benfica","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"27 January 1985 (aged 29)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31722054380664655"},"color":"rgb(229,164,67)","size":14.0},{"label":"Daniel Van Buyten","x":-361.6231994628906,"y":-626.7444458007812,"id":"140","attributes":{"Eigenvector Centrality":"0.835724321534549","Betweenness Centrality":"0.008695741941330284","Appearances":"79","No":"15","Country":"Belgium","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"35.0","Modularity Class":"28","Date of birth / Age":"7 February 1978 (aged 36)","Degree":"35","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.35627726611730487"},"color":"rgb(67,229,132)","size":27.33333396911621},{"label":"Cristian Gamboa","x":2154.08251953125,"y":199.01004028320312,"id":"128","attributes":{"Eigenvector Centrality":"0.24626357410920513","Betweenness Centrality":"0.004369178047589387","Appearances":"25","No":"16","Country":"Costa Rica","Club Country":"Norway","Club":"Rosenborg","Weighted Degree":"23.0","Modularity Class":"29","Date of birth / Age":"24 October 1989 (aged 24)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.26717557251908397"},"color":"rgb(229,229,67)","size":11.333333015441895},{"label":"Luiz Gustavo","x":-456.71649169921875,"y":-142.21359252929688,"id":"431","attributes":{"Eigenvector Centrality":"0.6500423521794667","Betweenness Centrality":"0.002644490835880301","Appearances":"19","No":"17","Country":"Brazil","Club Country":"Germany","Club":"VfL Wolfsburg","Weighted Degree":"28.0","Modularity Class":"23","Date of birth / Age":"23 July 1987 (aged 26)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33242876526458615"},"color":"rgb(229,67,197)","size":18.0},{"label":"Haris Seferovic","x":141.21534729003906,"y":262.27655029296875,"id":"271","attributes":{"Eigenvector Centrality":"0.4282958634195428","Betweenness Centrality":"0.006035628087924649","Appearances":"11","No":"9","Country":"Switzerland","Club Country":"Spain","Club":"Real Sociedad","Weighted Degree":"25.0","Modularity Class":"0","Date of birth / Age":"22 February 1992 (aged 22)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.317083692838654"},"color":"rgb(164,229,67)","size":14.0},{"label":"Bruno Martins Indi","x":870.9440307617188,"y":71.02484130859375,"id":"94","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"16","No":"4","Country":"Netherlands","Club Country":"Netherlands","Club":"Feyenoord","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"8 February 1992 (aged 22)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"Harrison Afful","x":468.0885314941406,"y":1387.692626953125,"id":"272","attributes":{"Eigenvector Centrality":"0.2902743690727881","Betweenness Centrality":"0.0","Appearances":"41","No":"23","Country":"Ghana","Club Country":"Tunisia","Club":"Espérance","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"24 June 1986 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Pedro","x":-1064.4056396484375,"y":-381.1362609863281,"id":"569","attributes":{"Eigenvector Centrality":"0.9370904429273632","Betweenness Centrality":"0.0017384725186443504","Appearances":"40","No":"11","Country":"Spain","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"28 July 1987 (aged 26)","Degree":"31","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(229,67,197)","size":22.0},{"label":"Marcos Rojo","x":-1169.275390625,"y":359.34051513671875,"id":"450","attributes":{"Eigenvector Centrality":"0.5206596128107512","Betweenness Centrality":"0.0012988089193429497","Appearances":"22","No":"16","Country":"Argentina","Club Country":"Portugal","Club":"Sporting CP","Weighted Degree":"25.0","Modularity Class":"19","Date of birth / Age":"20 March 1990 (aged 24)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31038851351351354"},"color":"rgb(67,229,229)","size":14.0},{"label":"Rony MartÃnez","x":1436.8521728515625,"y":-978.241455078125,"id":"615","attributes":{"Eigenvector Centrality":"0.2843426001461682","Betweenness Centrality":"0.011544965385101183","Appearances":"12","No":"16","Country":"Honduras","Club Country":"Honduras","Club":"Real Sociedad","Weighted Degree":"25.0","Modularity Class":"7","Date of birth / Age":"16 October 1988 (aged 25)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2986590816741162"},"color":"rgb(100,67,229)","size":14.0},{"label":"Marcelo","x":-546.0523071289062,"y":-181.72265625,"id":"443","attributes":{"Eigenvector Centrality":"0.8244385370187147","Betweenness Centrality":"0.002939462204472773","Appearances":"31","No":"6","Country":"Brazil","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"33.0","Modularity Class":"23","Date of birth / Age":"12 May 1988 (aged 26)","Degree":"33","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3394919168591224"},"color":"rgb(229,67,197)","size":24.666667938232422},{"label":"Lukas Podolski","x":202.08969116210938,"y":-446.2755126953125,"id":"433","attributes":{"Eigenvector Centrality":"0.6437896004097903","Betweenness Centrality":"0.002673471053911242","Appearances":"114","No":"10","Country":"Germany","Club Country":"England","Club":"Arsenal","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"4 June 1985 (aged 29)","Degree":"29","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3219448094612352"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Diego Lugano (c)","x":-32.81373596191406,"y":-13.45755386352539,"id":"167","attributes":{"Eigenvector Centrality":"0.3938483696056438","Betweenness Centrality":"5.998164097045359E-4","Appearances":"94","No":"2","Country":"Uruguay","Club Country":"England","Club":"West Bromwich Albion","Weighted Degree":"23.0","Modularity Class":"6","Date of birth / Age":"2 November 1980 (aged 33)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31831961888263316"},"color":"rgb(229,197,67)","size":11.333333015441895},{"label":"Bryan Ruiz (c)","x":2006.2958984375,"y":332.363525390625,"id":"95","attributes":{"Eigenvector Centrality":"0.27578394718697025","Betweenness Centrality":"0.017798712465968473","Appearances":"63","No":"10","Country":"Costa Rica","Club Country":"Netherlands","Club":"PSV","Weighted Degree":"25.0","Modularity Class":"29","Date of birth / Age":"18 August 1985 (aged 28)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2892561983471074"},"color":"rgb(229,229,67)","size":14.0},{"label":"Jerry Palacios","x":1713.39697265625,"y":-1049.36083984375,"id":"329","attributes":{"Eigenvector Centrality":"0.2572578722910379","Betweenness Centrality":"0.007827260909354134","Appearances":"24","No":"9","Country":"Honduras","Club Country":"Costa Rica","Club":"Alajuelense","Weighted Degree":"24.0","Modularity Class":"7","Date of birth / Age":"1 November 1981 (aged 32)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2768361581920904"},"color":"rgb(100,67,229)","size":12.666666984558105},{"label":"Emilio Izaguirre","x":1455.924072265625,"y":-1104.433837890625,"id":"197","attributes":{"Eigenvector Centrality":"0.2813611118856367","Betweenness Centrality":"0.011679703221250124","Appearances":"68","No":"7","Country":"Honduras","Club Country":"Scotland","Club":"Celtic","Weighted Degree":"25.0","Modularity Class":"7","Date of birth / Age":"10 May 1986 (aged 28)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2968497576736672"},"color":"rgb(100,67,229)","size":14.0},{"label":"Nicolás Lodeiro","x":-54.9222297668457,"y":16.616008758544922,"id":"531","attributes":{"Eigenvector Centrality":"0.37564528732258246","Betweenness Centrality":"0.0","Appearances":"26","No":"14","Country":"Uruguay","Club Country":"Brazil","Club":"Corinthians","Weighted Degree":"22.0","Modularity Class":"6","Date of birth / Age":"21 March 1989 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3121019108280255"},"color":"rgb(229,197,67)","size":10.0},{"label":"Raphaël Varane","x":-176.20541381835938,"y":-169.9130401611328,"id":"589","attributes":{"Eigenvector Centrality":"0.742488542981204","Betweenness Centrality":"0.0035273454232103265","Appearances":"6","No":"4","Country":"France","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"32.0","Modularity Class":"16","Date of birth / Age":"25 April 1993 (aged 21)","Degree":"32","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.33576975788031066"},"color":"rgb(229,67,229)","size":23.33333396911621},{"label":"Mattia Perin","x":272.2126770019531,"y":763.703857421875,"id":"482","attributes":{"Eigenvector Centrality":"0.44532305932946153","Betweenness Centrality":"0.0034549672499168743","Appearances":"0","No":"13","Country":"Italy","Club Country":"Italy","Club":"Genoa","Weighted Degree":"24.0","Modularity Class":"3","Date of birth / Age":"10 November 1992 (aged 21)","Degree":"24","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.31183708103521424"},"color":"rgb(197,229,67)","size":12.666666984558105},{"label":"Å ime Vrsaljko","x":-183.1659393310547,"y":697.4119873046875,"id":"653","attributes":{"Eigenvector Centrality":"0.3720817713091997","Betweenness Centrality":"0.0039034450268718027","Appearances":"7","No":"2","Country":"Croatia","Club Country":"Italy","Club":"Genoa","Weighted Degree":"24.0","Modularity Class":"25","Date of birth / Age":"10 January 1992 (aged 22)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(132,67,229)","size":12.666666984558105},{"label":"Paulinho","x":-575.74462890625,"y":-298.09417724609375,"id":"567","attributes":{"Eigenvector Centrality":"0.6368676039157191","Betweenness Centrality":"0.002227988166518949","Appearances":"26","No":"8","Country":"Brazil","Club Country":"England","Club":"Tottenham Hotspur","Weighted Degree":"27.0","Modularity Class":"23","Date of birth / Age":"25 July 1988 (aged 25)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3327297419646899"},"color":"rgb(229,67,197)","size":16.666667938232422},{"label":"Medhi Lacen","x":-1321.0677490234375,"y":1173.3302001953125,"id":"493","attributes":{"Eigenvector Centrality":"0.30926248352056784","Betweenness Centrality":"0.0011823348492373809","Appearances":"30","No":"8","Country":"Algeria","Club Country":"Spain","Club":"Getafe","Weighted Degree":"23.0","Modularity Class":"24","Date of birth / Age":"15 May 1984 (aged 30)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2950622240064231"},"color":"rgb(67,164,229)","size":11.333333015441895},{"label":"Ahmed Musa","x":-341.6416320800781,"y":-1640.5048828125,"id":"14","attributes":{"Eigenvector Centrality":"0.36203263260642976","Betweenness Centrality":"0.009769556368358679","Appearances":"35","No":"7","Country":"Nigeria","Club Country":"Russia","Club":"CSKA Moscow","Weighted Degree":"27.0","Modularity Class":"14","Date of birth / Age":"14 October 1992 (aged 21)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2930622009569378"},"color":"rgb(67,229,100)","size":16.666667938232422},{"label":"Max Gradel","x":486.3621826171875,"y":-849.3237915039062,"id":"485","attributes":{"Eigenvector Centrality":"0.32737398677050034","Betweenness Centrality":"5.067313329973086E-4","Appearances":"26","No":"15","Country":"Ivory Coast","Club Country":"France","Club":"Saint-Étienne","Weighted Degree":"23.0","Modularity Class":"9","Date of birth / Age":"30 November 1987 (aged 26)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30548628428927677"},"color":"rgb(164,67,229)","size":11.333333015441895},{"label":"Yoichiro Kakitani","x":646.9409790039062,"y":622.2392578125,"id":"729","attributes":{"Eigenvector Centrality":"0.33192039229134085","Betweenness Centrality":"0.0010231003820519223","Appearances":"12","No":"11","Country":"Japan","Club Country":"Japan","Club":"Cerezo Osaka","Weighted Degree":"23.0","Modularity Class":"27","Date of birth / Age":"3 January 1990 (aged 24)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3190104166666667"},"color":"rgb(67,100,229)","size":11.333333015441895},{"label":"Jefferson","x":-426.4915771484375,"y":-267.5847473144531,"id":"323","attributes":{"Eigenvector Centrality":"0.5425650576268322","Betweenness Centrality":"0.0","Appearances":"9","No":"1","Country":"Brazil","Club Country":"Brazil","Club":"Botafogo","Weighted Degree":"22.0","Modularity Class":"23","Date of birth / Age":"2 January 1983 (aged 31)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3158573270305114"},"color":"rgb(229,67,197)","size":10.0},{"label":"Reuben Gabriel","x":-132.04296875,"y":-1684.207275390625,"id":"597","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"11","No":"4","Country":"Nigeria","Club Country":"Belgium","Club":"Waasland-Beveren","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"25 September 1990 (aged 23)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Adam Kwarasey","x":427.3985290527344,"y":1398.171875,"id":"4","attributes":{"Eigenvector Centrality":"0.2902743690727881","Betweenness Centrality":"0.0","Appearances":"21","No":"12","Country":"Ghana","Club Country":"Norway","Club":"Strømsgodset","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"12 December 1987 (aged 26)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Sergio Busquets","x":-999.5798950195312,"y":-234.14259338378906,"id":"643","attributes":{"Eigenvector Centrality":"0.9370904429273632","Betweenness Centrality":"0.0017384725186443504","Appearances":"65","No":"16","Country":"Spain","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"16 July 1988 (aged 25)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(229,67,197)","size":22.0},{"label":"James Milner","x":-219.63795471191406,"y":-778.5797119140625,"id":"308","attributes":{"Eigenvector Centrality":"0.7015324384017535","Betweenness Centrality":"0.003652191896387035","Appearances":"47","No":"17","Country":"England","Club Country":"England","Club":"Manchester City","Weighted Degree":"30.0","Modularity Class":"28","Date of birth / Age":"4 January 1986 (aged 28)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3316787003610108"},"color":"rgb(67,229,132)","size":20.666667938232422},{"label":"Kyle Beckerman","x":814.4154052734375,"y":-1616.4197998046875,"id":"406","attributes":{"Eigenvector Centrality":"0.2718151842935107","Betweenness Centrality":"0.0","Appearances":"37","No":"15","Country":"United States","Club Country":"United States","Club":"Real Salt Lake","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"23 April 1982 (aged 32)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Charles Itandje","x":514.8746337890625,"y":203.30963134765625,"id":"113","attributes":{"Eigenvector Centrality":"0.3337787545251496","Betweenness Centrality":"0.0034398247134625596","Appearances":"9","No":"16","Country":"Cameroon","Club Country":"Turkey","Club":"Konyaspor","Weighted Degree":"23.0","Modularity Class":"17","Date of birth / Age":"2 November 1982 (aged 31)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(67,132,229)","size":11.333333015441895},{"label":"Javad Nekounam (c)","x":1956.9619140625,"y":1077.9049072265625,"id":"315","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"140","No":"6","Country":"Iran","Club Country":"Kuwait","Club":"Al-Kuwait","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"7 October 1980 (aged 33)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Oleg Shatov","x":-1223.315185546875,"y":-1368.6673583984375,"id":"540","attributes":{"Eigenvector Centrality":"0.34982465542448277","Betweenness Centrality":"0.004583905120882726","Appearances":"7","No":"17","Country":"Russia","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"26.0","Modularity Class":"2","Date of birth / Age":"29 July 1990 (aged 23)","Degree":"26","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.27904328018223234"},"color":"rgb(229,67,67)","size":15.333333969116211},{"label":"Park Joo-ho","x":1252.9921875,"y":1424.8128662109375,"id":"561","attributes":{"Eigenvector Centrality":"0.2716656711357499","Betweenness Centrality":"0.007710065459146181","Appearances":"14","No":"22","Country":"South Korea","Club Country":"Germany","Club":"Mainz 05","Weighted Degree":"25.0","Modularity Class":"10","Date of birth / Age":"16 January 1987 (aged 27)","Degree":"25","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.28846153846153844"},"color":"rgb(229,67,164)","size":14.0},{"label":"James Troisi","x":2041.552490234375,"y":-703.1470336914062,"id":"310","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"11","No":"14","Country":"Australia","Club Country":"Australia","Club":"Melbourne Victory","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"3 July 1988 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"José Holebas","x":1657.004638671875,"y":513.2495727539062,"id":"356","attributes":{"Eigenvector Centrality":"0.269759009750252","Betweenness Centrality":"0.0018881692306353887","Appearances":"22","No":"20","Country":"Greece","Club Country":"Greece","Club":"Olympiacos","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"27 June 1984 (aged 29)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2878965922444183"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Cristián Zapata","x":-503.78399658203125,"y":1159.0504150390625,"id":"130","attributes":{"Eigenvector Centrality":"0.43182337544263927","Betweenness Centrality":"0.007566531908575593","Appearances":"24","No":"2","Country":"Colombia","Club Country":"Italy","Club":"Milan","Weighted Degree":"29.0","Modularity Class":"11","Date of birth / Age":"30 September 1986 (aged 27)","Degree":"29","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.32054077627562144"},"color":"rgb(67,67,229)","size":19.333332061767578},{"label":"José MarÃa Giménez","x":-198.00405883789062,"y":-82.70488739013672,"id":"359","attributes":{"Eigenvector Centrality":"0.5243629945948548","Betweenness Centrality":"0.0015151368839237088","Appearances":"6","No":"13","Country":"Uruguay","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"28.0","Modularity Class":"6","Date of birth / Age":"20 January 1995 (aged 19)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3236459709379128"},"color":"rgb(229,197,67)","size":18.0},{"label":"Brayan Beckeles","x":1616.7569580078125,"y":-1172.5592041015625,"id":"92","attributes":{"Eigenvector Centrality":"0.23664887946331797","Betweenness Centrality":"0.0","Appearances":"23","No":"21","Country":"Honduras","Club Country":"Honduras","Club":"Olimpia","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"28 November 1985 (aged 28)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Cheick Tioté","x":389.42742919921875,"y":-827.5474853515625,"id":"114","attributes":{"Eigenvector Centrality":"0.3955908250789612","Betweenness Centrality":"0.0038844035920882927","Appearances":"43","No":"9","Country":"Ivory Coast","Club Country":"England","Club":"Newcastle United","Weighted Degree":"27.0","Modularity Class":"9","Date of birth / Age":"21 June 1986 (aged 27)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3215223097112861"},"color":"rgb(164,67,229)","size":16.666667938232422},{"label":"Bakhtiar Rahmani","x":2063.09375,"y":1033.573974609375,"id":"78","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"4","No":"18","Country":"Iran","Club Country":"Iran","Club":"Foolad","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"23 September 1991 (aged 22)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Lucas Biglia","x":-845.6185913085938,"y":161.40000915527344,"id":"424","attributes":{"Eigenvector Centrality":"0.5820067449262724","Betweenness Centrality":"0.006925465581949424","Appearances":"18","No":"6","Country":"Argentina","Club Country":"Italy","Club":"Lazio","Weighted Degree":"28.0","Modularity Class":"19","Date of birth / Age":"30 January 1986 (aged 28)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3346994535519126"},"color":"rgb(67,229,229)","size":18.0},{"label":"Ben Halloran","x":1954.241943359375,"y":-623.5980834960938,"id":"81","attributes":{"Eigenvector Centrality":"0.23369288429660703","Betweenness Centrality":"0.013237904694991245","Appearances":"2","No":"10","Country":"Australia","Club Country":"Germany","Club":"Fortuna Düsseldorf","Weighted Degree":"23.0","Modularity Class":"12","Date of birth / Age":"14 June 1992 (aged 21)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.25008506294658045"},"color":"rgb(229,100,67)","size":11.333333015441895},{"label":"Vladimir Granat","x":-1378.149658203125,"y":-1417.718994140625,"id":"708","attributes":{"Eigenvector Centrality":"0.2816622746350613","Betweenness Centrality":"6.368705012250895E-4","Appearances":"5","No":"13","Country":"Russia","Club Country":"Russia","Club":"Dynamo Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"22 May 1987 (aged 27)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.25538568450312715"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Loukas Vyntra","x":1712.4525146484375,"y":526.8307495117188,"id":"423","attributes":{"Eigenvector Centrality":"0.2684383531644051","Betweenness Centrality":"0.0025456380080491328","Appearances":"50","No":"11","Country":"Greece","Club Country":"Spain","Club":"Levante","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"5 February 1981 (aged 33)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2878965922444183"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Mark Milligan","x":2173.81640625,"y":-588.3220825195312,"id":"459","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"29","No":"5","Country":"Australia","Club Country":"Australia","Club":"Melbourne Victory","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"4 August 1985 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Ermin Bicakcic","x":1292.2596435546875,"y":-362.4537353515625,"id":"204","attributes":{"Eigenvector Centrality":"0.2936293974441563","Betweenness Centrality":"0.03700993584936544","Appearances":"7","No":"3","Country":"Bosnia and Herzegovina","Club Country":"Germany","Club":"Eintracht Braunschweig","Weighted Degree":"23.0","Modularity Class":"20","Date of birth / Age":"24 January 1990 (aged 24)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(132,229,67)","size":11.333333015441895},{"label":"Wilfried Bony","x":607.7100219726562,"y":-803.1463012695312,"id":"715","attributes":{"Eigenvector Centrality":"0.3359593705908816","Betweenness Centrality":"0.0021532541982020393","Appearances":"24","No":"12","Country":"Ivory Coast","Club Country":"Wales","Club":"Swansea City","Weighted Degree":"24.0","Modularity Class":"9","Date of birth / Age":"10 December 1988 (aged 25)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(164,67,229)","size":12.666666984558105},{"label":"Hélder Postiga","x":-469.88958740234375,"y":192.2259979248047,"id":"277","attributes":{"Eigenvector Centrality":"0.5176962646733128","Betweenness Centrality":"0.009650096557354645","Appearances":"69","No":"23","Country":"Portugal","Club Country":"Italy","Club":"Lazio","Weighted Degree":"28.0","Modularity Class":"8","Date of birth / Age":"2 August 1982 (aged 31)","Degree":"28","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3437792329279701"},"color":"rgb(229,164,67)","size":18.0},{"label":"Jorge Valdivia","x":-250.01519775390625,"y":1428.5059814453125,"id":"354","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"57","No":"10","Country":"Chile","Club Country":"Brazil","Club":"Palmeiras","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"3 October 1983 (aged 30)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Beto","x":-614.7037963867188,"y":392.89617919921875,"id":"86","attributes":{"Eigenvector Centrality":"0.45178798123360137","Betweenness Centrality":"0.00215629425092769","Appearances":"7","No":"22","Country":"Portugal","Club Country":"Spain","Club":"Sevilla","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"1 May 1982 (aged 32)","Degree":"25","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3278322925958965"},"color":"rgb(229,164,67)","size":14.0},{"label":"Cesc Fà bregas","x":-1070.073486328125,"y":-271.4660339355469,"id":"111","attributes":{"Eigenvector Centrality":"0.9370904429273634","Betweenness Centrality":"0.0017384725186443504","Appearances":"89","No":"10","Country":"Spain","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"4 May 1987 (aged 27)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(229,67,197)","size":22.0},{"label":"Josip Drmic","x":179.95460510253906,"y":206.55291748046875,"id":"364","attributes":{"Eigenvector Centrality":"0.42346070544921693","Betweenness Centrality":"0.005301782677055976","Appearances":"7","No":"19","Country":"Switzerland","Club Country":"Germany","Club":"1. FC Nürnberg","Weighted Degree":"25.0","Modularity Class":"0","Date of birth / Age":"8 August 1992 (aged 21)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3111769686706181"},"color":"rgb(164,229,67)","size":14.0},{"label":"André Ayew","x":486.661865234375,"y":1226.37353515625,"id":"43","attributes":{"Eigenvector Centrality":"0.32139173401751836","Betweenness Centrality":"0.003044413609568673","Appearances":"49","No":"10","Country":"Ghana","Club Country":"France","Club":"Marseille","Weighted Degree":"24.0","Modularity Class":"5","Date of birth / Age":"17 December 1989 (aged 24)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31025749261291685"},"color":"rgb(67,229,197)","size":12.666666984558105},{"label":"Stéphane Mbia","x":284.8869934082031,"y":226.59521484375,"id":"662","attributes":{"Eigenvector Centrality":"0.36731258194731503","Betweenness Centrality":"0.006208857054612341","Appearances":"49","No":"17","Country":"Cameroon","Club Country":"Spain","Club":"Sevilla","Weighted Degree":"25.0","Modularity Class":"17","Date of birth / Age":"20 May 1986 (aged 28)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33182844243792325"},"color":"rgb(67,132,229)","size":14.0},{"label":"Michael Babatunde","x":-143.01881408691406,"y":-1634.2734375,"id":"500","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"5","No":"18","Country":"Nigeria","Club Country":"Ukraine","Club":"Volyn Lutsk","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"24 December 1992 (aged 21)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Peter Odemwingie","x":110.87254333496094,"y":-1595.626953125,"id":"574","attributes":{"Eigenvector Centrality":"0.3422176819910441","Betweenness Centrality":"0.008219781078795195","Appearances":"61","No":"8","Country":"Nigeria","Club Country":"England","Club":"Stoke City","Weighted Degree":"25.0","Modularity Class":"14","Date of birth / Age":"15 July 1981 (aged 32)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.315450643776824"},"color":"rgb(67,229,100)","size":14.0},{"label":"Aron Jóhannsson","x":819.320068359375,"y":-1520.021240234375,"id":"62","attributes":{"Eigenvector Centrality":"0.27181518429351065","Betweenness Centrality":"0.0","Appearances":"8","No":"9","Country":"United States","Club Country":"Netherlands","Club":"AZ","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"10 November 1990 (aged 23)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Gianluigi Buffon (c)","x":152.25355529785156,"y":824.187744140625,"id":"249","attributes":{"Eigenvector Centrality":"0.5455496050511397","Betweenness Centrality":"0.0016215443882875223","Appearances":"140","No":"1","Country":"Italy","Club Country":"Italy","Club":"Juventus","Weighted Degree":"28.0","Modularity Class":"3","Date of birth / Age":"28 January 1978 (aged 36)","Degree":"28","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(197,229,67)","size":18.0},{"label":"Leighton Baines","x":-237.56211853027344,"y":-998.0780029296875,"id":"415","attributes":{"Eigenvector Centrality":"0.5738583419916762","Betweenness Centrality":"0.0013664563333722465","Appearances":"24","No":"3","Country":"England","Club Country":"England","Club":"Everton","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"11 December 1984 (aged 29)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31183708103521424"},"color":"rgb(67,229,132)","size":14.0},{"label":"Mathis Bolly","x":651.6246337890625,"y":-893.9707641601562,"id":"474","attributes":{"Eigenvector Centrality":"0.3195851154336105","Betweenness Centrality":"0.014729679390309034","Appearances":"4","No":"6","Country":"Ivory Coast","Club Country":"Germany","Club":"Fortuna Düsseldorf","Weighted Degree":"23.0","Modularity Class":"9","Date of birth / Age":"14 November 1990 (aged 23)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2979327117957033"},"color":"rgb(164,67,229)","size":11.333333015441895},{"label":"Fidel MartÃnez","x":-1762.245361328125,"y":-617.6648559570312,"id":"228","attributes":{"Eigenvector Centrality":"0.3623062182068215","Betweenness Centrality":"0.0","Appearances":"8","No":"20","Country":"Ecuador","Club Country":"Mexico","Club":"Tijuana","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"15 February 1990 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Bernard","x":-458.79998779296875,"y":-206.65052795410156,"id":"85","attributes":{"Eigenvector Centrality":"0.5696754174200716","Betweenness Centrality":"0.0013333964544832435","Appearances":"11","No":"20","Country":"Brazil","Club Country":"Ukraine","Club":"Shakhtar Donetsk","Weighted Degree":"24.0","Modularity Class":"23","Date of birth / Age":"8 September 1992 (aged 21)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3202614379084967"},"color":"rgb(229,67,197)","size":12.666666984558105},{"label":"Michael Essien","x":376.83282470703125,"y":1298.3724365234375,"id":"503","attributes":{"Eigenvector Centrality":"0.3941490291913924","Betweenness Centrality":"0.004358888803155806","Appearances":"57","No":"5","Country":"Ghana","Club Country":"Italy","Club":"Milan","Weighted Degree":"28.0","Modularity Class":"5","Date of birth / Age":"3 December 1982 (aged 31)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31223449447748514"},"color":"rgb(67,229,197)","size":18.0},{"label":"Luis Garrido","x":1665.724609375,"y":-1263.9407958984375,"id":"426","attributes":{"Eigenvector Centrality":"0.23664887946331803","Betweenness Centrality":"0.0","Appearances":"20","No":"19","Country":"Honduras","Club Country":"Honduras","Club":"Olimpia","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"5 November 1990 (aged 23)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"David Myrie","x":2254.470947265625,"y":256.6007080078125,"id":"152","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"10","No":"8","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Herediano","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"1 June 1988 (aged 26)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Anthony Vanden Borre","x":-577.663330078125,"y":-888.8426513671875,"id":"56","attributes":{"Eigenvector Centrality":"0.532050214639082","Betweenness Centrality":"0.006584182583039559","Appearances":"25","No":"21","Country":"Belgium","Club Country":"Belgium","Club":"Anderlecht","Weighted Degree":"23.0","Modularity Class":"28","Date of birth / Age":"24 October 1987 (aged 26)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3321283325802079"},"color":"rgb(67,229,132)","size":11.333333015441895},{"label":"Jasper Cillessen","x":884.7673950195312,"y":31.96728515625,"id":"314","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"8","No":"1","Country":"Netherlands","Club Country":"Netherlands","Club":"Ajax","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"22 April 1989 (aged 25)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"Fraser Forster","x":12.960638999938965,"y":-928.6837768554688,"id":"232","attributes":{"Eigenvector Centrality":"0.5560882486054125","Betweenness Centrality":"0.010448734894018583","Appearances":"2","No":"22","Country":"England","Club Country":"Scotland","Club":"Celtic","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"17 March 1988 (aged 26)","Degree":"25","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3197042192257503"},"color":"rgb(67,229,132)","size":14.0},{"label":"Andrés Iniesta","x":-1067.9244384765625,"y":-187.44284057617188,"id":"50","attributes":{"Eigenvector Centrality":"0.9370904429273634","Betweenness Centrality":"0.0017384725186443504","Appearances":"97","No":"6","Country":"Spain","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"11 May 1984 (aged 30)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(229,67,197)","size":22.0},{"label":"Santi Cazorla","x":-670.4064331054688,"y":-383.8587951660156,"id":"629","attributes":{"Eigenvector Centrality":"0.8894294715329176","Betweenness Centrality":"0.002430245927643242","Appearances":"64","No":"20","Country":"Spain","Club Country":"England","Club":"Arsenal","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"13 December 1984 (aged 29)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3287119856887299"},"color":"rgb(229,67,197)","size":22.0},{"label":"Henri Bedimo","x":380.5469665527344,"y":174.65756225585938,"id":"278","attributes":{"Eigenvector Centrality":"0.3227718779440803","Betweenness Centrality":"0.0","Appearances":"31","No":"12","Country":"Cameroon","Club Country":"France","Club":"Lyon","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"4 June 1984 (aged 30)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"Koke","x":-921.220947265625,"y":-304.28424072265625,"id":"397","attributes":{"Eigenvector Centrality":"0.7852248920099726","Betweenness Centrality":"7.220203040676876E-4","Appearances":"8","No":"17","Country":"Spain","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"27.0","Modularity Class":"23","Date of birth / Age":"8 January 1992 (aged 22)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3215223097112861"},"color":"rgb(229,67,197)","size":16.666667938232422},{"label":"Vedran Corluka","x":-415.46148681640625,"y":539.5565185546875,"id":"698","attributes":{"Eigenvector Centrality":"0.35564443225400655","Betweenness Centrality":"0.004616126670181397","Appearances":"72","No":"5","Country":"Croatia","Club Country":"Russia","Club":"Lokomotiv Moscow","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"5 February 1986 (aged 28)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2995110024449878"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Salomon Kalou","x":392.3309326171875,"y":-927.29150390625,"id":"621","attributes":{"Eigenvector Centrality":"0.3612323923614013","Betweenness Centrality":"0.0028479267154006356","Appearances":"67","No":"8","Country":"Ivory Coast","Club Country":"France","Club":"Lille","Weighted Degree":"25.0","Modularity Class":"9","Date of birth / Age":"5 August 1985 (aged 28)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.31722054380664655"},"color":"rgb(164,67,229)","size":14.0},{"label":"Maya Yoshida","x":540.3438720703125,"y":427.262451171875,"id":"491","attributes":{"Eigenvector Centrality":"0.43319192924031613","Betweenness Centrality":"0.006300072262103494","Appearances":"41","No":"22","Country":"Japan","Club Country":"England","Club":"Southampton","Weighted Degree":"28.0","Modularity Class":"27","Date of birth / Age":"24 August 1988 (aged 25)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3331822302810517"},"color":"rgb(67,100,229)","size":18.0},{"label":"Luis López","x":1610.1837158203125,"y":-1129.569091796875,"id":"427","attributes":{"Eigenvector Centrality":"0.23664887946331797","Betweenness Centrality":"0.0","Appearances":"0","No":"1","Country":"Honduras","Club Country":"Honduras","Club":"Real España","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"13 September 1993 (aged 20)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Kolo Touré","x":297.0413513183594,"y":-918.4600830078125,"id":"398","attributes":{"Eigenvector Centrality":"0.5026225442560357","Betweenness Centrality":"0.006800410251941604","Appearances":"107","No":"4","Country":"Ivory Coast","Club Country":"England","Club":"Liverpool","Weighted Degree":"31.0","Modularity Class":"9","Date of birth / Age":"19 March 1981 (aged 33)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3237885462555066"},"color":"rgb(164,67,229)","size":22.0},{"label":"Fernando Gago","x":-1147.2889404296875,"y":214.82017517089844,"id":"225","attributes":{"Eigenvector Centrality":"0.4756507714516442","Betweenness Centrality":"0.0","Appearances":"49","No":"5","Country":"Argentina","Club Country":"Argentina","Club":"Boca Juniors","Weighted Degree":"22.0","Modularity Class":"19","Date of birth / Age":"10 April 1986 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2930622009569378"},"color":"rgb(67,229,229)","size":10.0},{"label":"Juan Guillermo Cuadrado","x":-683.1348266601562,"y":1184.008056640625,"id":"370","attributes":{"Eigenvector Centrality":"0.343991844651082","Betweenness Centrality":"0.0018381218571182874","Appearances":"28","No":"11","Country":"Colombia","Club Country":"Italy","Club":"Fiorentina","Weighted Degree":"24.0","Modularity Class":"11","Date of birth / Age":"26 May 1988 (aged 26)","Degree":"24","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3115727002967359"},"color":"rgb(67,67,229)","size":12.666666984558105},{"label":"Arjen Robben","x":630.8056640625,"y":-143.44236755371094,"id":"61","attributes":{"Eigenvector Centrality":"0.6544203740928541","Betweenness Centrality":"0.013375499273402567","Appearances":"75","No":"11","Country":"Netherlands","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"35.0","Modularity Class":"22","Date of birth / Age":"23 January 1984 (aged 30)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34834123222748814"},"color":"rgb(197,67,229)","size":27.33333396911621},{"label":"Mitchell Langerak","x":1759.883544921875,"y":-484.94677734375,"id":"518","attributes":{"Eigenvector Centrality":"0.30472064669130067","Betweenness Centrality":"0.03540110990626156","Appearances":"3","No":"12","Country":"Australia","Club Country":"Germany","Club":"Borussia Dortmund","Weighted Degree":"27.0","Modularity Class":"12","Date of birth / Age":"22 August 1988 (aged 25)","Degree":"27","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.2609158679446219"},"color":"rgb(229,100,67)","size":16.666667938232422},{"label":"Yohan Cabaye","x":-73.94801330566406,"y":-145.8044891357422,"id":"728","attributes":{"Eigenvector Centrality":"0.6370473545952837","Betweenness Centrality":"0.001865102966313942","Appearances":"30","No":"6","Country":"France","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"29.0","Modularity Class":"16","Date of birth / Age":"14 January 1986 (aged 28)","Degree":"29","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(229,67,229)","size":19.333332061767578},{"label":"Jonathan Mensah","x":461.7189025878906,"y":1342.453125,"id":"346","attributes":{"Eigenvector Centrality":"0.2902743690727881","Betweenness Centrality":"0.0","Appearances":"27","No":"19","Country":"Ghana","Club Country":"France","Club":"Évian","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"13 July 1990 (aged 23)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Cristopher Toselli","x":-291.25885009765625,"y":1453.383056640625,"id":"132","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"4","No":"12","Country":"Chile","Club Country":"Chile","Club":"Universidad Católica","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"22 June 1988 (aged 25)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Claudio Marchisio","x":71.69534301757812,"y":813.5997924804688,"id":"125","attributes":{"Eigenvector Centrality":"0.5455496050511397","Betweenness Centrality":"0.0016215443882875223","Appearances":"44","No":"8","Country":"Italy","Club Country":"Italy","Club":"Juventus","Weighted Degree":"28.0","Modularity Class":"3","Date of birth / Age":"19 January 1986 (aged 28)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(197,229,67)","size":18.0},{"label":"Phil Jones","x":-300.3230285644531,"y":-774.0247192382812,"id":"576","attributes":{"Eigenvector Centrality":"0.7938188270448314","Betweenness Centrality":"0.0038886080479693477","Appearances":"10","No":"16","Country":"England","Club Country":"England","Club":"Manchester United","Weighted Degree":"32.0","Modularity Class":"28","Date of birth / Age":"21 February 1992 (aged 22)","Degree":"32","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3393351800554017"},"color":"rgb(67,229,132)","size":23.33333396911621},{"label":"Jack Wilshere","x":-130.01361083984375,"y":-811.2896728515625,"id":"303","attributes":{"Eigenvector Centrality":"0.7063239842607693","Betweenness Centrality":"0.001711566637513174","Appearances":"18","No":"7","Country":"England","Club Country":"England","Club":"Arsenal","Weighted Degree":"30.0","Modularity Class":"28","Date of birth / Age":"1 January 1992 (aged 22)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3199825859817153"},"color":"rgb(67,229,132)","size":20.666667938232422},{"label":"Stephen Adams","x":502.8428955078125,"y":1418.3192138671875,"id":"664","attributes":{"Eigenvector Centrality":"0.2902743690727881","Betweenness Centrality":"0.0","Appearances":"7","No":"1","Country":"Ghana","Club Country":"Ghana","Club":"Aduana Stars","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"28 September 1989 (aged 24)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Randall Brenes","x":2309.687255859375,"y":299.45452880859375,"id":"588","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"39","No":"14","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Cartaginés","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"13 August 1983 (aged 30)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Darijo Srna (c)","x":-317.2035827636719,"y":580.4688720703125,"id":"147","attributes":{"Eigenvector Centrality":"0.36375321381526937","Betweenness Centrality":"2.8773715502087595E-4","Appearances":"112","No":"11","Country":"Croatia","Club Country":"Ukraine","Club":"Shakhtar Donetsk","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"1 May 1982 (aged 32)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30246913580246915"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Carlos Bacca","x":-687.1920776367188,"y":1106.895751953125,"id":"99","attributes":{"Eigenvector Centrality":"0.3586902689991431","Betweenness Centrality":"0.004048504558302689","Appearances":"11","No":"17","Country":"Colombia","Club Country":"Spain","Club":"Sevilla","Weighted Degree":"25.0","Modularity Class":"11","Date of birth / Age":"8 September 1986 (aged 27)","Degree":"25","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.31928757602085145"},"color":"rgb(67,67,229)","size":14.0},{"label":"Dejan Lovren","x":-235.10853576660156,"y":422.8890686035156,"id":"157","attributes":{"Eigenvector Centrality":"0.45972067931258953","Betweenness Centrality":"0.007199493511865955","Appearances":"25","No":"6","Country":"Croatia","Club Country":"England","Club":"Southampton","Weighted Degree":"28.0","Modularity Class":"25","Date of birth / Age":"5 July 1989 (aged 24)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(132,67,229)","size":18.0},{"label":"Mario Götze","x":301.4177551269531,"y":-338.4355163574219,"id":"454","attributes":{"Eigenvector Centrality":"0.6585766805388434","Betweenness Centrality":"0.0026429368589338613","Appearances":"29","No":"19","Country":"Germany","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"3 June 1992 (aged 22)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3390221402214022"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Danny Welbeck","x":-294.47705078125,"y":-689.566650390625,"id":"144","attributes":{"Eigenvector Centrality":"0.793818827044831","Betweenness Centrality":"0.0038886080479693477","Appearances":"24","No":"11","Country":"England","Club Country":"England","Club":"Manchester United","Weighted Degree":"32.0","Modularity Class":"28","Date of birth / Age":"26 November 1990 (aged 23)","Degree":"32","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3393351800554017"},"color":"rgb(67,229,132)","size":23.33333396911621},{"label":"Óscar Boniek GarcÃa","x":1554.068359375,"y":-1285.441650390625,"id":"549","attributes":{"Eigenvector Centrality":"0.24794367045748955","Betweenness Centrality":"0.0014579941476906906","Appearances":"92","No":"14","Country":"Honduras","Club Country":"United States","Club":"Houston Dynamo","Weighted Degree":"23.0","Modularity Class":"7","Date of birth / Age":"4 September 1984 (aged 29)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2750748502994012"},"color":"rgb(100,67,229)","size":11.333333015441895},{"label":"Jorge Fucile","x":-342.37835693359375,"y":145.5472869873047,"id":"352","attributes":{"Eigenvector Centrality":"0.5227167128747061","Betweenness Centrality":"0.009620495110563395","Appearances":"42","No":"4","Country":"Uruguay","Club Country":"Portugal","Club":"Porto","Weighted Degree":"30.0","Modularity Class":"6","Date of birth / Age":"19 November 1984 (aged 29)","Degree":"30","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.34154275092936803"},"color":"rgb(229,197,67)","size":20.666667938232422},{"label":"Rickie Lambert","x":-64.72023010253906,"y":-747.4366455078125,"id":"603","attributes":{"Eigenvector Centrality":"0.5904515327423896","Betweenness Centrality":"0.0016054547217210155","Appearances":"6","No":"18","Country":"England","Club Country":"England","Club":"Southampton","Weighted Degree":"26.0","Modularity Class":"28","Date of birth / Age":"16 February 1982 (aged 32)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.32407407407407407"},"color":"rgb(67,229,132)","size":15.333333969116211},{"label":"Ignazio Abate","x":229.4017333984375,"y":946.2020263671875,"id":"291","attributes":{"Eigenvector Centrality":"0.4999140209709583","Betweenness Centrality":"0.003073405743850096","Appearances":"20","No":"7","Country":"Italy","Club Country":"Italy","Club":"Milan","Weighted Degree":"27.0","Modularity Class":"3","Date of birth / Age":"12 November 1986 (aged 27)","Degree":"27","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31928757602085145"},"color":"rgb(197,229,67)","size":16.666667938232422},{"label":"Antoine Griezmann","x":63.922183990478516,"y":-173.6581573486328,"id":"57","attributes":{"Eigenvector Centrality":"0.5246495592217708","Betweenness Centrality":"0.008309679999517289","Appearances":"4","No":"11","Country":"France","Club Country":"Spain","Club":"Real Sociedad","Weighted Degree":"25.0","Modularity Class":"16","Date of birth / Age":"21 March 1991 (aged 23)","Degree":"25","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.32695729537366547"},"color":"rgb(229,67,229)","size":14.0},{"label":"Asmir Begovic","x":1126.9224853515625,"y":-656.7363891601562,"id":"68","attributes":{"Eigenvector Centrality":"0.320955391099679","Betweenness Centrality":"0.010086360119179452","Appearances":"30","No":"1","Country":"Bosnia and Herzegovina","Club Country":"England","Club":"Stoke City","Weighted Degree":"25.0","Modularity Class":"20","Date of birth / Age":"20 June 1987 (aged 26)","Degree":"25","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.32666666666666666"},"color":"rgb(132,229,67)","size":14.0},{"label":"Gervinho","x":560.3703002929688,"y":-680.4623413085938,"id":"246","attributes":{"Eigenvector Centrality":"0.3739231420118122","Betweenness Centrality":"0.008762525083432785","Appearances":"53","No":"10","Country":"Ivory Coast","Club Country":"Italy","Club":"Roma","Weighted Degree":"26.0","Modularity Class":"9","Date of birth / Age":"27 May 1987 (aged 27)","Degree":"26","Position":"FW","Eccentricity":"4.0","Closeness Centrality":"0.329006266786034"},"color":"rgb(164,67,229)","size":15.333333969116211},{"label":"Shinji Kagawa","x":282.6526184082031,"y":314.0347900390625,"id":"646","attributes":{"Eigenvector Centrality":"0.6754701881349925","Betweenness Centrality":"0.015603619215489676","Appearances":"57","No":"10","Country":"Japan","Club Country":"England","Club":"Manchester United","Weighted Degree":"35.0","Modularity Class":"27","Date of birth / Age":"17 March 1989 (aged 25)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3491686460807601"},"color":"rgb(67,100,229)","size":27.33333396911621},{"label":"Leroy Fer","x":837.33251953125,"y":-102.8897476196289,"id":"417","attributes":{"Eigenvector Centrality":"0.34753754509962104","Betweenness Centrality":"0.0017622038238311907","Appearances":"6","No":"18","Country":"Netherlands","Club Country":"England","Club":"Norwich City","Weighted Degree":"23.0","Modularity Class":"22","Date of birth / Age":"5 January 1990 (aged 24)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.317083692838654"},"color":"rgb(197,67,229)","size":11.333333015441895},{"label":"Abel Hernández","x":-85.60250091552734,"y":-6.678264617919922,"id":"3","attributes":{"Eigenvector Centrality":"0.37564528732258257","Betweenness Centrality":"0.0","Appearances":"12","No":"8","Country":"Uruguay","Club Country":"Italy","Club":"Palermo","Weighted Degree":"22.0","Modularity Class":"6","Date of birth / Age":"8 August 1990 (aged 23)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3121019108280255"},"color":"rgb(229,197,67)","size":10.0},{"label":"Aurélien Chedjou","x":479.9815979003906,"y":42.06589126586914,"id":"71","attributes":{"Eigenvector Centrality":"0.38111818720911783","Betweenness Centrality":"0.007567747700183238","Appearances":"31","No":"14","Country":"Cameroon","Club Country":"Turkey","Club":"Galatasaray","Weighted Degree":"26.0","Modularity Class":"17","Date of birth / Age":"20 June 1985 (aged 28)","Degree":"26","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3423381462505822"},"color":"rgb(67,132,229)","size":15.333333969116211},{"label":"Mateo Kovacic","x":-492.02667236328125,"y":654.4241943359375,"id":"469","attributes":{"Eigenvector Centrality":"0.47619962944812927","Betweenness Centrality":"0.0057313310683672425","Appearances":"10","No":"20","Country":"Croatia","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"29.0","Modularity Class":"25","Date of birth / Age":"6 May 1994 (aged 20)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.32608695652173914"},"color":"rgb(132,67,229)","size":19.333332061767578},{"label":"Vasilis Torosidis","x":1423.180908203125,"y":425.19268798828125,"id":"696","attributes":{"Eigenvector Centrality":"0.32379379672378844","Betweenness Centrality":"0.015251801587601078","Appearances":"66","No":"15","Country":"Greece","Club Country":"Italy","Club":"Roma","Weighted Degree":"26.0","Modularity Class":"15","Date of birth / Age":"10 June 1985 (aged 29)","Degree":"26","Position":"DF","Eccentricity":"4.0","Closeness Centrality":"0.31928757602085145"},"color":"rgb(229,67,100)","size":15.333333969116211},{"label":"Matteo Darmian","x":332.641357421875,"y":846.0514526367188,"id":"478","attributes":{"Eigenvector Centrality":"0.43196054419267377","Betweenness Centrality":"0.0018820457212751422","Appearances":"1","No":"4","Country":"Italy","Club Country":"Italy","Club":"Torino","Weighted Degree":"23.0","Modularity Class":"3","Date of birth / Age":"2 December 1989 (aged 24)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30497925311203317"},"color":"rgb(197,229,67)","size":11.333333015441895},{"label":"Fernando Muslera","x":73.75354766845703,"y":-37.718238830566406,"id":"226","attributes":{"Eigenvector Centrality":"0.43253266088929565","Betweenness Centrality":"0.00796097224898124","Appearances":"58","No":"1","Country":"Uruguay","Club Country":"Turkey","Club":"Galatasaray","Weighted Degree":"26.0","Modularity Class":"6","Date of birth / Age":"16 June 1986 (aged 27)","Degree":"26","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.34249767008387694"},"color":"rgb(229,197,67)","size":15.333333969116211},{"label":"Rio Mavuba","x":-65.83039093017578,"y":-421.9732971191406,"id":"604","attributes":{"Eigenvector Centrality":"0.5305324640410493","Betweenness Centrality":"0.0017087585037009543","Appearances":"12","No":"12","Country":"France","Club Country":"France","Club":"Lille","Weighted Degree":"25.0","Modularity Class":"16","Date of birth / Age":"8 March 1984 (aged 30)","Degree":"25","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.32579787234042556"},"color":"rgb(229,67,229)","size":14.0},{"label":"Didier Ya Konan","x":543.8720092773438,"y":-767.3469848632812,"id":"160","attributes":{"Eigenvector Centrality":"0.34039082013140126","Betweenness Centrality":"0.003415370768047869","Appearances":"25","No":"13","Country":"Ivory Coast","Club Country":"Germany","Club":"Hannover 96","Weighted Degree":"24.0","Modularity Class":"9","Date of birth / Age":"22 May 1984 (aged 30)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.31370038412291934"},"color":"rgb(164,67,229)","size":12.666666984558105},{"label":"Islam Slimani","x":-1357.2412109375,"y":1056.663818359375,"id":"296","attributes":{"Eigenvector Centrality":"0.34570611332658036","Betweenness Centrality":"0.00227391237436229","Appearances":"20","No":"13","Country":"Algeria","Club Country":"Portugal","Club":"Sporting CP","Weighted Degree":"25.0","Modularity Class":"24","Date of birth / Age":"18 June 1988 (aged 25)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30246913580246915"},"color":"rgb(67,164,229)","size":14.0},{"label":"Brad Guzan","x":829.8171997070312,"y":-1411.882568359375,"id":"91","attributes":{"Eigenvector Centrality":"0.28491855645503317","Betweenness Centrality":"0.0014353729751920106","Appearances":"25","No":"12","Country":"United States","Club Country":"England","Club":"Aston Villa","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"9 September 1984 (aged 29)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2929453965723396"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"José Pedro Fuenzalida","x":-198.39776611328125,"y":1545.63720703125,"id":"361","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"23","No":"19","Country":"Chile","Club Country":"Chile","Club":"Colo-Colo","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"22 February 1985 (aged 29)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"LuÃs Neto","x":-787.0558471679688,"y":-14.597501754760742,"id":"428","attributes":{"Eigenvector Centrality":"0.5291116763411419","Betweenness Centrality":"0.007266376231630914","Appearances":"9","No":"14","Country":"Portugal","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"29.0","Modularity Class":"8","Date of birth / Age":"26 May 1988 (aged 26)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3223684210526316"},"color":"rgb(229,164,67)","size":19.333332061767578},{"label":"Dries Mertens","x":-646.4434204101562,"y":-473.26361083984375,"id":"177","attributes":{"Eigenvector Centrality":"0.7906646703428208","Betweenness Centrality":"0.007893651717681398","Appearances":"25","No":"14","Country":"Belgium","Club Country":"Italy","Club":"Napoli","Weighted Degree":"33.0","Modularity Class":"28","Date of birth / Age":"6 May 1987 (aged 27)","Degree":"33","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3531955790485344"},"color":"rgb(67,229,132)","size":24.666667938232422},{"label":"Jan Vertonghen","x":-726.4645385742188,"y":-735.5794067382812,"id":"311","attributes":{"Eigenvector Centrality":"0.5781054780643132","Betweenness Centrality":"0.0013899483715746057","Appearances":"56","No":"5","Country":"Belgium","Club Country":"England","Club":"Tottenham Hotspur","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"24 April 1987 (aged 27)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33638443935926776"},"color":"rgb(67,229,132)","size":14.0},{"label":"Joao Rojas","x":-1776.6961669921875,"y":-531.8544921875,"id":"334","attributes":{"Eigenvector Centrality":"0.38534499087839263","Betweenness Centrality":"0.003660717358574628","Appearances":"30","No":"9","Country":"Ecuador","Club Country":"Mexico","Club":"Cruz Azul","Weighted Degree":"24.0","Modularity Class":"4","Date of birth / Age":"14 June 1989 (aged 24)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2942353883106485"},"color":"rgb(229,67,132)","size":12.666666984558105},{"label":"Ben Foster","x":-170.4840545654297,"y":-869.5690307617188,"id":"80","attributes":{"Eigenvector Centrality":"0.5333561865660762","Betweenness Centrality":"4.2496140393833733E-4","Appearances":"7","No":"13","Country":"England","Club Country":"England","Club":"West Bromwich Albion","Weighted Degree":"23.0","Modularity Class":"28","Date of birth / Age":"3 May 1983 (aged 31)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.30624999999999997"},"color":"rgb(67,229,132)","size":11.333333015441895},{"label":"Reza Ghoochannejhad","x":2037.90625,"y":1109.2969970703125,"id":"598","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"14","No":"16","Country":"Iran","Club Country":"England","Club":"Charlton Athletic","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"20 September 1987 (aged 26)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Ivan PeriÅ¡ic","x":-294.8162841796875,"y":494.7712097167969,"id":"299","attributes":{"Eigenvector Centrality":"0.44148422896622697","Betweenness Centrality":"0.0021210911790253153","Appearances":"29","No":"4","Country":"Croatia","Club Country":"Germany","Club":"VfL Wolfsburg","Weighted Degree":"27.0","Modularity Class":"25","Date of birth / Age":"2 February 1989 (aged 25)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.317083692838654"},"color":"rgb(132,67,229)","size":16.666667938232422},{"label":"Frank Lampard","x":-247.65232849121094,"y":-855.8526000976562,"id":"231","attributes":{"Eigenvector Centrality":"0.7775723533806831","Betweenness Centrality":"0.0029928487399309587","Appearances":"105","No":"8","Country":"England","Club Country":"England","Club":"Chelsea","Weighted Degree":"32.0","Modularity Class":"28","Date of birth / Age":"20 June 1978 (aged 35)","Degree":"32","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3315290933694181"},"color":"rgb(67,229,132)","size":23.33333396911621},{"label":"Yasuhito Endo","x":785.9192504882812,"y":586.3290405273438,"id":"724","attributes":{"Eigenvector Centrality":"0.31718153777834773","Betweenness Centrality":"0.0","Appearances":"144","No":"7","Country":"Japan","Club Country":"Japan","Club":"Gamba Osaka","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"28 January 1980 (aged 34)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Kevin Mirallas","x":-563.9285278320312,"y":-964.3165893554688,"id":"386","attributes":{"Eigenvector Centrality":"0.5945562042887822","Betweenness Centrality":"0.0024227939394388456","Appearances":"44","No":"11","Country":"Belgium","Club Country":"England","Club":"Everton","Weighted Degree":"26.0","Modularity Class":"28","Date of birth / Age":"5 October 1987 (aged 26)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3330312641594925"},"color":"rgb(67,229,132)","size":15.333333969116211},{"label":"Johnny Acosta","x":2202.927978515625,"y":222.98760986328125,"id":"343","attributes":{"Eigenvector Centrality":"0.24571486118323416","Betweenness Centrality":"0.003463283566079935","Appearances":"25","No":"2","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Alajuelense","Weighted Degree":"23.0","Modularity Class":"29","Date of birth / Age":"21 July 1983 (aged 30)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.26601520086862107"},"color":"rgb(229,229,67)","size":11.333333015441895},{"label":"Vincent Enyeama","x":-105.49050903320312,"y":-1519.4764404296875,"id":"706","attributes":{"Eigenvector Centrality":"0.3575079291455913","Betweenness Centrality":"0.0026743855225904787","Appearances":"91","No":"1","Country":"Nigeria","Club Country":"France","Club":"Lille","Weighted Degree":"25.0","Modularity Class":"14","Date of birth / Age":"29 August 1982 (aged 31)","Degree":"25","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.31437125748503"},"color":"rgb(67,229,100)","size":14.0},{"label":"Rodrigo Muñoz","x":-20.128692626953125,"y":28.408824920654297,"id":"607","attributes":{"Eigenvector Centrality":"0.37564528732258257","Betweenness Centrality":"0.0","Appearances":"0","No":"12","Country":"Uruguay","Club Country":"Paraguay","Club":"Libertad","Weighted Degree":"22.0","Modularity Class":"6","Date of birth / Age":"22 January 1982 (aged 32)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3121019108280255"},"color":"rgb(229,197,67)","size":10.0},{"label":"Laurent Koscielny","x":-15.055593490600586,"y":-387.5162048339844,"id":"409","attributes":{"Eigenvector Centrality":"0.6518193073443905","Betweenness Centrality":"0.0017629955601543275","Appearances":"17","No":"21","Country":"France","Club Country":"England","Club":"Arsenal","Weighted Degree":"29.0","Modularity Class":"16","Date of birth / Age":"10 September 1985 (aged 28)","Degree":"29","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3262316910785619"},"color":"rgb(229,67,229)","size":19.333332061767578},{"label":"Steven Gerrard (c)","x":-159.652099609375,"y":-980.668701171875,"id":"668","attributes":{"Eigenvector Centrality":"0.6237674591008822","Betweenness Centrality":"0.0010635550306756442","Appearances":"111","No":"4","Country":"England","Club Country":"England","Club":"Liverpool","Weighted Degree":"27.0","Modularity Class":"28","Date of birth / Age":"30 May 1980 (aged 34)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3247901016349978"},"color":"rgb(67,229,132)","size":16.666667938232422},{"label":"Andrea Pirlo","x":108.05339813232422,"y":870.1171264648438,"id":"46","attributes":{"Eigenvector Centrality":"0.5455496050511397","Betweenness Centrality":"0.0016215443882875223","Appearances":"109","No":"21","Country":"Italy","Club Country":"Italy","Club":"Juventus","Weighted Degree":"28.0","Modularity Class":"3","Date of birth / Age":"19 May 1979 (aged 35)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(197,229,67)","size":18.0},{"label":"Aleksei Kozlov","x":-1463.252685546875,"y":-1376.61376953125,"id":"25","attributes":{"Eigenvector Centrality":"0.28166227463506127","Betweenness Centrality":"6.368705012250895E-4","Appearances":"11","No":"2","Country":"Russia","Club Country":"Russia","Club":"Dynamo Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"16 November 1986 (aged 27)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.25538568450312715"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Yeltsin Tejeda","x":2354.937255859375,"y":330.5636291503906,"id":"727","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"22","No":"17","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Saprissa","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"17 March 1992 (aged 22)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"John Brooks","x":729.48095703125,"y":-1409.59375,"id":"341","attributes":{"Eigenvector Centrality":"0.2843366476001853","Betweenness Centrality":"0.0036883088645504737","Appearances":"4","No":"6","Country":"United States","Club Country":"Germany","Club":"Hertha BSC","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"28 January 1993 (aged 21)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2979327117957033"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"Kwadwo Asamoah","x":285.1675720214844,"y":1193.169677734375,"id":"404","attributes":{"Eigenvector Centrality":"0.5138638941206055","Betweenness Centrality":"0.013451953978807028","Appearances":"62","No":"20","Country":"Ghana","Club Country":"Italy","Club":"Juventus","Weighted Degree":"33.0","Modularity Class":"5","Date of birth / Age":"9 December 1988 (aged 25)","Degree":"33","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3225098727512067"},"color":"rgb(67,229,197)","size":24.666667938232422},{"label":"Andrei Semyonov","x":-1427.725830078125,"y":-1522.6015625,"id":"48","attributes":{"Eigenvector Centrality":"0.26569304291819806","Betweenness Centrality":"0.0","Appearances":"1","No":"5","Country":"Russia","Club Country":"Russia","Club":"Terek Grozny","Weighted Degree":"22.0","Modularity Class":"2","Date of birth / Age":"24 March 1989 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.23244781783681215"},"color":"rgb(229,67,67)","size":10.0},{"label":"Geoff Cameron","x":820.3438720703125,"y":-1464.11474609375,"id":"242","attributes":{"Eigenvector Centrality":"0.3091550505336035","Betweenness Centrality":"0.007189506868566205","Appearances":"27","No":"20","Country":"United States","Club Country":"England","Club":"Stoke City","Weighted Degree":"25.0","Modularity Class":"26","Date of birth / Age":"11 July 1985 (aged 28)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3090832632464256"},"color":"rgb(100,229,67)","size":14.0},{"label":"Juan Camilo Zúñiga","x":-759.6773071289062,"y":893.1192626953125,"id":"366","attributes":{"Eigenvector Centrality":"0.5886662376124554","Betweenness Centrality":"0.01051159651060277","Appearances":"50","No":"18","Country":"Colombia","Club Country":"Italy","Club":"Napoli","Weighted Degree":"33.0","Modularity Class":"11","Date of birth / Age":"14 December 1985 (aged 28)","Degree":"33","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3333333333333333"},"color":"rgb(67,67,229)","size":24.666667938232422},{"label":"Julian Green","x":627.960205078125,"y":-1176.4527587890625,"id":"375","attributes":{"Eigenvector Centrality":"0.592763148395897","Betweenness Centrality":"0.018661873881244673","Appearances":"2","No":"16","Country":"United States","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"35.0","Modularity Class":"26","Date of birth / Age":"6 June 1995 (aged 19)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3327297419646899"},"color":"rgb(100,229,67)","size":27.33333396911621},{"label":"Yuya Osako","x":806.6990356445312,"y":633.545654296875,"id":"735","attributes":{"Eigenvector Centrality":"0.31718153777834784","Betweenness Centrality":"0.0","Appearances":"9","No":"18","Country":"Japan","Club Country":"Germany","Club":"1860 München","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"18 May 1990 (aged 24)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Sammy N\u0027Djock","x":341.5248107910156,"y":155.8591766357422,"id":"626","attributes":{"Eigenvector Centrality":"0.32277187794408035","Betweenness Centrality":"0.0","Appearances":"3","No":"23","Country":"Cameroon","Club Country":"Turkey","Club":"Fethiyespor","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"25 February 1990 (aged 24)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"João Pereira","x":-649.9645385742188,"y":448.8273620605469,"id":"333","attributes":{"Eigenvector Centrality":"0.4540996988101742","Betweenness Centrality":"0.0033859990894464925","Appearances":"36","No":"21","Country":"Portugal","Club Country":"Spain","Club":"Valencia","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"25 February 1984 (aged 30)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.32507739938080493"},"color":"rgb(229,164,67)","size":14.0},{"label":"Ron-Robert Zieler","x":479.21453857421875,"y":-376.45037841796875,"id":"614","attributes":{"Eigenvector Centrality":"0.5011578446474096","Betweenness Centrality":"0.0032324185183237805","Appearances":"3","No":"12","Country":"Germany","Club Country":"Germany","Club":"Hannover 96","Weighted Degree":"24.0","Modularity Class":"13","Date of birth / Age":"12 February 1989 (aged 25)","Degree":"24","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.31599312123817713"},"color":"rgb(67,229,164)","size":12.666666984558105},{"label":"Éder Ãlvarez Balanta","x":-862.3296508789062,"y":1190.236083984375,"id":"181","attributes":{"Eigenvector Centrality":"0.313949251078916","Betweenness Centrality":"0.0","Appearances":"3","No":"16","Country":"Colombia","Club Country":"Argentina","Club":"River Plate","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"28 February 1993 (aged 21)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"MartÃn Demichelis","x":-893.08544921875,"y":82.94781494140625,"id":"462","attributes":{"Eigenvector Centrality":"0.6398902783818312","Betweenness Centrality":"0.003598075368399343","Appearances":"38","No":"15","Country":"Argentina","Club Country":"England","Club":"Manchester City","Weighted Degree":"29.0","Modularity Class":"19","Date of birth / Age":"20 December 1980 (aged 33)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3316787003610108"},"color":"rgb(67,229,229)","size":19.333332061767578},{"label":"Mattia De Sciglio","x":304.86956787109375,"y":920.4893798828125,"id":"481","attributes":{"Eigenvector Centrality":"0.49991402097095844","Betweenness Centrality":"0.003073405743850096","Appearances":"11","No":"2","Country":"Italy","Club Country":"Italy","Club":"Milan","Weighted Degree":"27.0","Modularity Class":"3","Date of birth / Age":"20 October 1992 (aged 21)","Degree":"27","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31928757602085145"},"color":"rgb(197,229,67)","size":16.666667938232422},{"label":"Silvestre Varela","x":-839.6356811523438,"y":400.2161865234375,"id":"652","attributes":{"Eigenvector Centrality":"0.5557776384808136","Betweenness Centrality":"0.006533778730302813","Appearances":"24","No":"18","Country":"Portugal","Club Country":"Portugal","Club":"Porto","Weighted Degree":"30.0","Modularity Class":"8","Date of birth / Age":"2 February 1985 (aged 29)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3387096774193548"},"color":"rgb(229,164,67)","size":20.666667938232422},{"label":"Sergei Ignashevich","x":-1314.4222412109375,"y":-1444.7847900390625,"id":"640","attributes":{"Eigenvector Centrality":"0.27975304502942105","Betweenness Centrality":"8.329697214751982E-4","Appearances":"96","No":"4","Country":"Russia","Club Country":"Russia","Club":"CSKA Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"14 July 1979 (aged 34)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.2544132917964694"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Masato Morishige","x":677.7444458007812,"y":664.5134887695312,"id":"466","attributes":{"Eigenvector Centrality":"0.3171815377783477","Betweenness Centrality":"0.0","Appearances":"10","No":"6","Country":"Japan","Club Country":"Japan","Club":"F.C. Tokyo","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"21 May 1987 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Daniele De Rossi","x":294.1720886230469,"y":656.4853515625,"id":"141","attributes":{"Eigenvector Centrality":"0.4810207457061944","Betweenness Centrality":"0.006374040778649005","Appearances":"95","No":"16","Country":"Italy","Club Country":"Italy","Club":"Roma","Weighted Degree":"26.0","Modularity Class":"3","Date of birth / Age":"24 July 1983 (aged 30)","Degree":"26","Position":"MF","Eccentricity":"4.0","Closeness Centrality":"0.32754010695187163"},"color":"rgb(197,229,67)","size":15.333333969116211},{"label":"Asamoah Gyan (c)","x":384.49658203125,"y":1385.8724365234375,"id":"65","attributes":{"Eigenvector Centrality":"0.29027436907278803","Betweenness Centrality":"0.0","Appearances":"79","No":"3","Country":"Ghana","Club Country":"United Arab Emirates","Club":"Al-Ain","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"22 November 1985 (aged 28)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Eduardo dos Reis Carvalho","x":-685.5633544921875,"y":299.7951965332031,"id":"188","attributes":{"Eigenvector Centrality":"0.40962360528145036","Betweenness Centrality":"0.0","Appearances":"34","No":"1","Country":"Portugal","Club Country":"Portugal","Club":"Braga","Weighted Degree":"22.0","Modularity Class":"8","Date of birth / Age":"19 September 1982 (aged 31)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.30714584203928125"},"color":"rgb(229,164,67)","size":10.0},{"label":"Claudio Bravo (c)","x":-193.7080078125,"y":1267.75439453125,"id":"124","attributes":{"Eigenvector Centrality":"0.36167758865639443","Betweenness Centrality":"0.00416233990960059","Appearances":"79","No":"1","Country":"Chile","Club Country":"Spain","Club":"Real Sociedad","Weighted Degree":"25.0","Modularity Class":"18","Date of birth / Age":"13 April 1983 (aged 31)","Degree":"25","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.30561330561330563"},"color":"rgb(229,132,67)","size":14.0},{"label":"Mickaël Landreau","x":-46.635650634765625,"y":-207.5623779296875,"id":"508","attributes":{"Eigenvector Centrality":"0.4836397599249273","Betweenness Centrality":"0.0","Appearances":"11","No":"23","Country":"France","Club Country":"France","Club":"Bastia","Weighted Degree":"22.0","Modularity Class":"16","Date of birth / Age":"14 May 1979 (aged 35)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.3037190082644628"},"color":"rgb(229,67,229)","size":10.0},{"label":"Carlos Valdés","x":-788.6849365234375,"y":1186.095947265625,"id":"106","attributes":{"Eigenvector Centrality":"0.313949251078916","Betweenness Centrality":"0.0","Appearances":"14","No":"23","Country":"Colombia","Club Country":"Argentina","Club":"San Lorenzo","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"22 May 1985 (aged 29)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"Reto Ziegler","x":3.86130690574646,"y":248.17929077148438,"id":"596","attributes":{"Eigenvector Centrality":"0.384616160215653","Betweenness Centrality":"0.0","Appearances":"35","No":"3","Country":"Switzerland","Club Country":"Italy","Club":"Sassuolo","Weighted Degree":"22.0","Modularity Class":"0","Date of birth / Age":"16 January 1986 (aged 28)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2922465208747515"},"color":"rgb(164,229,67)","size":10.0},{"label":"Diego Benaglio","x":-65.3055419921875,"y":256.201171875,"id":"162","attributes":{"Eigenvector Centrality":"0.4795399294217994","Betweenness Centrality":"0.0025216888133772915","Appearances":"57","No":"1","Country":"Switzerland","Club Country":"Germany","Club":"VfL Wolfsburg","Weighted Degree":"27.0","Modularity Class":"0","Date of birth / Age":"8 September 1983 (aged 30)","Degree":"27","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.31942633637548895"},"color":"rgb(164,229,67)","size":16.666667938232422},{"label":"Mario MartÃnez","x":1689.1534423828125,"y":-1223.1529541015625,"id":"456","attributes":{"Eigenvector Centrality":"0.23664887946331803","Betweenness Centrality":"0.0","Appearances":"37","No":"10","Country":"Honduras","Club Country":"Honduras","Club":"Real España","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"30 July 1989 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"DeAndre Yedlin","x":776.4466552734375,"y":-1500.7615966796875,"id":"156","attributes":{"Eigenvector Centrality":"0.2718151842935107","Betweenness Centrality":"0.0","Appearances":"4","No":"2","Country":"United States","Club Country":"United States","Club":"Seattle Sounders FC","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"9 July 1993 (aged 20)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Alex Wilkinson","x":2120.3818359375,"y":-724.7479858398438,"id":"29","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"3","No":"22","Country":"Australia","Club Country":"South Korea","Club":"Jeonbuk Hyundai Motors","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"13 August 1984 (aged 29)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Yuri Zhirkov","x":-1464.4825439453125,"y":-1475.711669921875,"id":"733","attributes":{"Eigenvector Centrality":"0.2816622746350614","Betweenness Centrality":"6.368705012250895E-4","Appearances":"60","No":"18","Country":"Russia","Club Country":"Russia","Club":"Dynamo Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"20 August 1983 (aged 30)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.25538568450312715"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Alan Dzagoev","x":-1268.1650390625,"y":-1469.7052001953125,"id":"16","attributes":{"Eigenvector Centrality":"0.27975304502942094","Betweenness Centrality":"8.329697214751982E-4","Appearances":"32","No":"10","Country":"Russia","Club Country":"Russia","Club":"CSKA Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"17 June 1990 (aged 23)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.2544132917964694"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Rui PatrÃcio","x":-770.5219116210938,"y":432.8207702636719,"id":"619","attributes":{"Eigenvector Centrality":"0.4410475661612916","Betweenness Centrality":"0.001075874410151188","Appearances":"30","No":"12","Country":"Portugal","Club Country":"Portugal","Club":"Sporting CP","Weighted Degree":"24.0","Modularity Class":"8","Date of birth / Age":"15 February 1988 (aged 26)","Degree":"24","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3185955786736021"},"color":"rgb(229,164,67)","size":12.666666984558105},{"label":"Kostas Katsouranis","x":1625.112060546875,"y":590.2659301757812,"id":"400","attributes":{"Eigenvector Centrality":"0.2581333696341679","Betweenness Centrality":"0.0","Appearances":"111","No":"21","Country":"Greece","Club Country":"Greece","Club":"PAOK","Weighted Degree":"22.0","Modularity Class":"15","Date of birth / Age":"21 June 1979 (aged 34)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2760045061960195"},"color":"rgb(229,67,100)","size":10.0},{"label":"Jozy Altidore","x":866.4315185546875,"y":-1353.639892578125,"id":"365","attributes":{"Eigenvector Centrality":"0.282018657273756","Betweenness Centrality":"0.004513119899770913","Appearances":"70","No":"17","Country":"United States","Club Country":"England","Club":"Sunderland","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"6 November 1989 (aged 24)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"Yacine Brahimi","x":-1176.72509765625,"y":1144.9345703125,"id":"722","attributes":{"Eigenvector Centrality":"0.3206186598118753","Betweenness Centrality":"0.011120766403752676","Appearances":"6","No":"11","Country":"Algeria","Club Country":"Spain","Club":"Granada","Weighted Degree":"24.0","Modularity Class":"24","Date of birth / Age":"8 February 1990 (aged 24)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3125"},"color":"rgb(67,164,229)","size":12.666666984558105},{"label":"Lee Bum-young","x":1190.99267578125,"y":1637.5755615234375,"id":"411","attributes":{"Eigenvector Centrality":"0.23152559498868786","Betweenness Centrality":"0.0","Appearances":"0","No":"23","Country":"South Korea","Club Country":"South Korea","Club":"Busan IPark","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"2 April 1989 (aged 25)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Juan Carlos Paredes","x":-1452.1322021484375,"y":-446.3980712890625,"id":"368","attributes":{"Eigenvector Centrality":"0.7525405481416904","Betweenness Centrality":"0.006691544296226193","Appearances":"38","No":"4","Country":"Ecuador","Club Country":"Ecuador","Club":"Barcelona","Weighted Degree":"35.0","Modularity Class":"4","Date of birth / Age":"8 July 1987 (aged 26)","Degree":"35","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(229,67,132)","size":27.33333396911621},{"label":"Eduardo da Silva","x":-364.40460205078125,"y":586.625732421875,"id":"187","attributes":{"Eigenvector Centrality":"0.36375321381526937","Betweenness Centrality":"2.8773715502087595E-4","Appearances":"63","No":"22","Country":"Croatia","Club Country":"Ukraine","Club":"Shakhtar Donetsk","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"25 February 1983 (aged 31)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30246913580246915"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Giorgos Karagounis (c)","x":1659.2034912109375,"y":651.7564086914062,"id":"253","attributes":{"Eigenvector Centrality":"0.26821419599108537","Betweenness Centrality":"0.011764360515140076","Appearances":"135","No":"10","Country":"Greece","Club Country":"England","Club":"Fulham","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"6 March 1977 (aged 37)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2784090909090909"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Fernandinho","x":-442.978759765625,"y":-336.26580810546875,"id":"224","attributes":{"Eigenvector Centrality":"0.7476247846505292","Betweenness Centrality":"0.004586029475076887","Appearances":"7","No":"5","Country":"Brazil","Club Country":"England","Club":"Manchester City","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"4 May 1985 (aged 29)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34653465346534656"},"color":"rgb(229,67,197)","size":22.0},{"label":"Willian","x":-440.7384338378906,"y":-410.82391357421875,"id":"717","attributes":{"Eigenvector Centrality":"0.7525362816963489","Betweenness Centrality":"0.002196566654268722","Appearances":"7","No":"19","Country":"Brazil","Club Country":"England","Club":"Chelsea","Weighted Degree":"30.0","Modularity Class":"23","Date of birth / Age":"9 August 1988 (aged 25)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3471894189891356"},"color":"rgb(229,67,197)","size":20.666667938232422},{"label":"Ricardo RodrÃguez","x":-71.6590805053711,"y":197.1143798828125,"id":"602","attributes":{"Eigenvector Centrality":"0.47953992942179946","Betweenness Centrality":"0.0025216888133772915","Appearances":"21","No":"13","Country":"Switzerland","Club Country":"Germany","Club":"VfL Wolfsburg","Weighted Degree":"27.0","Modularity Class":"0","Date of birth / Age":"25 August 1992 (aged 21)","Degree":"27","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31942633637548895"},"color":"rgb(164,229,67)","size":16.666667938232422},{"label":"Brad Davis","x":915.6695556640625,"y":-1565.895263671875,"id":"90","attributes":{"Eigenvector Centrality":"0.282163463180194","Betweenness Centrality":"0.0017638995236230006","Appearances":"16","No":"14","Country":"United States","Club Country":"United States","Club":"Houston Dynamo","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"8 November 1981 (aged 32)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2877838684416601"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"Xavi","x":-1013.392822265625,"y":-319.8654479980469,"id":"720","attributes":{"Eigenvector Centrality":"0.9370904429273632","Betweenness Centrality":"0.0017384725186443504","Appearances":"132","No":"8","Country":"Spain","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"25 January 1980 (aged 34)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(229,67,197)","size":22.0},{"label":"Yaya Touré","x":251.69076538085938,"y":-758.7758178710938,"id":"726","attributes":{"Eigenvector Centrality":"0.5209154819658625","Betweenness Centrality":"0.009566975454863513","Appearances":"82","No":"19","Country":"Ivory Coast","Club Country":"England","Club":"Manchester City","Weighted Degree":"31.0","Modularity Class":"9","Date of birth / Age":"13 May 1983 (aged 31)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3330312641594925"},"color":"rgb(164,67,229)","size":22.0},{"label":"Kevin De Bruyne","x":-581.4454956054688,"y":-583.9620971679688,"id":"384","attributes":{"Eigenvector Centrality":"0.6295071279602001","Betweenness Centrality":"0.0038293176434487024","Appearances":"21","No":"7","Country":"Belgium","Club Country":"Germany","Club":"VfL Wolfsburg","Weighted Degree":"28.0","Modularity Class":"28","Date of birth / Age":"28 June 1991 (aged 22)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3380864765409384"},"color":"rgb(67,229,132)","size":18.0},{"label":"Oswaldo Minda","x":-1549.43017578125,"y":-719.5339965820312,"id":"552","attributes":{"Eigenvector Centrality":"0.37271345847500326","Betweenness Centrality":"0.005310330072733828","Appearances":"18","No":"14","Country":"Ecuador","Club Country":"United States","Club":"Chivas USA","Weighted Degree":"23.0","Modularity Class":"4","Date of birth / Age":"July 26, 1983 (aged 30)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3006134969325153"},"color":"rgb(229,67,132)","size":11.333333015441895},{"label":"Raheem Sterling","x":-93.5101089477539,"y":-985.4642944335938,"id":"583","attributes":{"Eigenvector Centrality":"0.6237674591008822","Betweenness Centrality":"0.0010635550306756442","Appearances":"4","No":"19","Country":"England","Club Country":"England","Club":"Liverpool","Weighted Degree":"27.0","Modularity Class":"28","Date of birth / Age":"8 December 1994 (aged 19)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3247901016349978"},"color":"rgb(67,229,132)","size":16.666667938232422},{"label":"Chigozie Agbim","x":-67.00606536865234,"y":-1575.5159912109375,"id":"115","attributes":{"Eigenvector Centrality":"0.3058149002352039","Betweenness Centrality":"0.0","Appearances":"11","No":"21","Country":"Nigeria","Club Country":"Nigeria","Club":"Gombe United","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"28 November 1984 (aged 29)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Bacary Sagna","x":-102.57307434082031,"y":-365.2166442871094,"id":"76","attributes":{"Eigenvector Centrality":"0.6518193073443906","Betweenness Centrality":"0.0017629955601543275","Appearances":"41","No":"15","Country":"France","Club Country":"England","Club":"Arsenal","Weighted Degree":"29.0","Modularity Class":"16","Date of birth / Age":"14 February 1983 (aged 31)","Degree":"29","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3262316910785619"},"color":"rgb(229,67,229)","size":19.333332061767578},{"label":"Timothy Chandler","x":803.3570556640625,"y":-1282.82470703125,"id":"683","attributes":{"Eigenvector Centrality":"0.3137272348985455","Betweenness Centrality":"0.005346568845878015","Appearances":"13","No":"21","Country":"United States","Club Country":"Germany","Club":"1. FC Nürnberg","Weighted Degree":"25.0","Modularity Class":"26","Date of birth / Age":"29 March 1990 (aged 24)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30284301606922126"},"color":"rgb(100,229,67)","size":14.0},{"label":"Muhamed BeÅ¡ic","x":1194.709228515625,"y":-510.0015563964844,"id":"524","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"9","No":"7","Country":"Bosnia and Herzegovina","Club Country":"Hungary","Club":"Ferencváros","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"10 September 1992 (aged 21)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Patrice Evra","x":-226.57672119140625,"y":-327.58880615234375,"id":"562","attributes":{"Eigenvector Centrality":"0.8374426942127946","Betweenness Centrality":"0.008276091758701315","Appearances":"58","No":"3","Country":"France","Club Country":"England","Club":"Manchester United","Weighted Degree":"35.0","Modularity Class":"16","Date of birth / Age":"15 May 1981 (aged 33)","Degree":"35","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3441011235955056"},"color":"rgb(229,67,229)","size":27.33333396911621},{"label":"Edgar Salli","x":416.1859130859375,"y":196.34884643554688,"id":"182","attributes":{"Eigenvector Centrality":"0.3227718779440803","Betweenness Centrality":"0.0","Appearances":"9","No":"20","Country":"Cameroon","Club Country":"France","Club":"Lens","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"17 August 1992 (aged 21)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"José de Jesús Corona","x":-2099.093994140625,"y":287.1224670410156,"id":"355","attributes":{"Eigenvector Centrality":"0.29131873163694544","Betweenness Centrality":"0.0012783129193471678","Appearances":"34","No":"1","Country":"Mexico","Club Country":"Mexico","Club":"Cruz Azul","Weighted Degree":"23.0","Modularity Class":"21","Date of birth / Age":"26 January 1981 (aged 33)","Degree":"23","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.2744585511575803"},"color":"rgb(67,229,67)","size":11.333333015441895},{"label":"Óscar BagüÃ","x":-1773.5125732421875,"y":-705.2896118164062,"id":"548","attributes":{"Eigenvector Centrality":"0.3623062182068213","Betweenness Centrality":"0.0","Appearances":"21","No":"18","Country":"Ecuador","Club Country":"Ecuador","Club":"Emelec","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"10 December 1982 (aged 31)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Djamel Mesbah","x":-1360.75830078125,"y":1211.451904296875,"id":"173","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"26","No":"6","Country":"Algeria","Club Country":"Italy","Club":"Livorno","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"9 October 1984 (aged 29)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Austin Ejide","x":-127.88009643554688,"y":-1587.7188720703125,"id":"72","attributes":{"Eigenvector Centrality":"0.3058149002352039","Betweenness Centrality":"0.0","Appearances":"31","No":"16","Country":"Nigeria","Club Country":"Israel","Club":"Hapoel Be\u0027er Sheva","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"8 April 1984 (aged 30)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Daniel Sturridge","x":-202.59893798828125,"y":-933.4009399414062,"id":"139","attributes":{"Eigenvector Centrality":"0.6237674591008823","Betweenness Centrality":"0.0010635550306756442","Appearances":"12","No":"9","Country":"England","Club Country":"England","Club":"Liverpool","Weighted Degree":"27.0","Modularity Class":"28","Date of birth / Age":"1 September 1989 (aged 24)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3247901016349978"},"color":"rgb(67,229,132)","size":16.666667938232422},{"label":"Toby Alderweireld","x":-719.4182739257812,"y":-665.7479858398438,"id":"685","attributes":{"Eigenvector Centrality":"0.6799862056462357","Betweenness Centrality":"0.0018763771735177332","Appearances":"34","No":"2","Country":"Belgium","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"29.0","Modularity Class":"28","Date of birth / Age":"2 March 1989 (aged 25)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3313796212804328"},"color":"rgb(67,229,132)","size":19.333332061767578},{"label":"Christoph Kramer","x":422.9450988769531,"y":-364.4662170410156,"id":"122","attributes":{"Eigenvector Centrality":"0.4894396183916067","Betweenness Centrality":"6.915469095936232E-4","Appearances":"2","No":"23","Country":"Germany","Club Country":"Germany","Club":"Borussia Mönchengladbach","Weighted Degree":"23.0","Modularity Class":"13","Date of birth / Age":"12 February 1991 (aged 23)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30599500416319736"},"color":"rgb(67,229,164)","size":11.333333015441895},{"label":"Esteban Granados","x":2281.050048828125,"y":393.7303161621094,"id":"206","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"11","No":"13","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Herediano","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"25 October 1985 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Gary Cahill","x":-301.79718017578125,"y":-918.284912109375,"id":"238","attributes":{"Eigenvector Centrality":"0.7775723533806831","Betweenness Centrality":"0.0029928487399309587","Appearances":"24","No":"5","Country":"England","Club Country":"England","Club":"Chelsea","Weighted Degree":"32.0","Modularity Class":"28","Date of birth / Age":"19 December 1985 (aged 28)","Degree":"32","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3315290933694181"},"color":"rgb(67,229,132)","size":23.33333396911621},{"label":"Jonathan de Guzmán","x":917.8981323242188,"y":-45.65421676635742,"id":"345","attributes":{"Eigenvector Centrality":"0.3481568776699336","Betweenness Centrality":"0.0010475901113017954","Appearances":"10","No":"8","Country":"Netherlands","Club Country":"Wales","Club":"Swansea City","Weighted Degree":"23.0","Modularity Class":"22","Date of birth / Age":"13 September 1987 (aged 26)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31873373807458805"},"color":"rgb(197,67,229)","size":11.333333015441895},{"label":"Senijad Ibricic","x":1235.974853515625,"y":-497.09393310546875,"id":"637","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"42","No":"17","Country":"Bosnia and Herzegovina","Club Country":"Turkey","Club":"Kayseri Erciyesspor","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"26 September 1985 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Héctor Herrera","x":-1799.6182861328125,"y":372.85076904296875,"id":"275","attributes":{"Eigenvector Centrality":"0.4116885255313005","Betweenness Centrality":"0.009305549137125925","Appearances":"13","No":"6","Country":"Mexico","Club Country":"Portugal","Club":"Porto","Weighted Degree":"29.0","Modularity Class":"21","Date of birth / Age":"19 April 1990 (aged 24)","Degree":"29","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3128991060025543"},"color":"rgb(67,229,67)","size":19.333332061767578},{"label":"Mario Gavranovic","x":52.757667541503906,"y":247.96585083007812,"id":"453","attributes":{"Eigenvector Centrality":"0.384616160215653","Betweenness Centrality":"0.0","Appearances":"11","No":"17","Country":"Switzerland","Club Country":"Switzerland","Club":"Zürich","Weighted Degree":"22.0","Modularity Class":"0","Date of birth / Age":"24 November 1989 (aged 24)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2922465208747515"},"color":"rgb(164,229,67)","size":10.0},{"label":"Fabian Schär","x":38.15908432006836,"y":161.535400390625,"id":"215","attributes":{"Eigenvector Centrality":"0.4279165187640593","Betweenness Centrality":"0.0017015426628181239","Appearances":"6","No":"22","Country":"Switzerland","Club Country":"Switzerland","Club":"Basel","Weighted Degree":"25.0","Modularity Class":"0","Date of birth / Age":"20 December 1991 (aged 22)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31038851351351354"},"color":"rgb(164,229,67)","size":14.0},{"label":"Faryd Mondragón","x":-825.1312255859375,"y":1158.5755615234375,"id":"219","attributes":{"Eigenvector Centrality":"0.313949251078916","Betweenness Centrality":"0.0","Appearances":"50","No":"22","Country":"Colombia","Club Country":"Colombia","Club":"Deportivo Cali","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"21 June 1971 (aged 42)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"AgustÃn Orión","x":-1115.8746337890625,"y":250.34307861328125,"id":"12","attributes":{"Eigenvector Centrality":"0.47565077145164436","Betweenness Centrality":"0.0","Appearances":"3","No":"12","Country":"Argentina","Club Country":"Argentina","Club":"Boca Juniors","Weighted Degree":"22.0","Modularity Class":"19","Date of birth / Age":"26 July 1981 (aged 32)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2930622009569378"},"color":"rgb(67,229,229)","size":10.0},{"label":"Lazaros Christodoulopoulos","x":1501.577880859375,"y":504.683837890625,"id":"410","attributes":{"Eigenvector Centrality":"0.27279029487191714","Betweenness Centrality":"0.003339511771537693","Appearances":"19","No":"16","Country":"Greece","Club Country":"Italy","Club":"Bologna","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"19 December 1986 (aged 27)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2955367913148371"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Gökhan Inler (c)","x":-228.7349853515625,"y":213.2960662841797,"id":"260","attributes":{"Eigenvector Centrality":"0.6153709092825858","Betweenness Centrality":"0.004199284588766183","Appearances":"73","No":"8","Country":"Switzerland","Club Country":"Italy","Club":"Napoli","Weighted Degree":"31.0","Modularity Class":"0","Date of birth / Age":"27 June 1984 (aged 29)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3331822302810517"},"color":"rgb(164,229,67)","size":22.0},{"label":"Makoto Hasebe (c)","x":672.8050537109375,"y":505.12762451171875,"id":"438","attributes":{"Eigenvector Centrality":"0.34512034913799255","Betweenness Centrality":"0.003186055679065411","Appearances":"78","No":"17","Country":"Japan","Club Country":"Germany","Club":"1. FC Nürnberg","Weighted Degree":"24.0","Modularity Class":"27","Date of birth / Age":"18 January 1984 (aged 30)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3237885462555066"},"color":"rgb(67,100,229)","size":12.666666984558105},{"label":"Pierre Webó","x":292.5826721191406,"y":67.77238464355469,"id":"579","attributes":{"Eigenvector Centrality":"0.3844635752484932","Betweenness Centrality":"0.004484998410532358","Appearances":"56","No":"15","Country":"Cameroon","Club Country":"Turkey","Club":"Fenerbahçe","Weighted Degree":"26.0","Modularity Class":"17","Date of birth / Age":"20 January 1982 (aged 32)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3312302839116719"},"color":"rgb(67,132,229)","size":15.333333969116211},{"label":"Philipp Lahm (c)","x":350.3982849121094,"y":-483.0366516113281,"id":"577","attributes":{"Eigenvector Centrality":"0.6585766805388437","Betweenness Centrality":"0.0026429368589338613","Appearances":"106","No":"16","Country":"Germany","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"11 November 1983 (aged 30)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3390221402214022"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Senad Lulic","x":921.6593627929688,"y":-424.2279052734375,"id":"636","attributes":{"Eigenvector Centrality":"0.39543615259664133","Betweenness Centrality":"0.012993279574519087","Appearances":"33","No":"16","Country":"Bosnia and Herzegovina","Club Country":"Italy","Club":"Lazio","Weighted Degree":"28.0","Modularity Class":"20","Date of birth / Age":"18 January 1986 (aged 28)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3447467166979362"},"color":"rgb(132,229,67)","size":18.0},{"label":"Benedikt Höwedes","x":472.64324951171875,"y":-229.064208984375,"id":"82","attributes":{"Eigenvector Centrality":"0.5529715553555452","Betweenness Centrality":"0.006227653676219969","Appearances":"21","No":"4","Country":"Germany","Club Country":"Germany","Club":"Schalke \u002704","Weighted Degree":"27.0","Modularity Class":"13","Date of birth / Age":"29 February 1988 (aged 26)","Degree":"27","Position":"DF","Eccentricity":"4.0","Closeness Centrality":"0.3353102189781022"},"color":"rgb(67,229,164)","size":16.666667938232422},{"label":"Kostas Manolas","x":1643.82080078125,"y":458.0362854003906,"id":"401","attributes":{"Eigenvector Centrality":"0.26975900975025197","Betweenness Centrality":"0.0018881692306353887","Appearances":"9","No":"4","Country":"Greece","Club Country":"Greece","Club":"Olympiacos","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"14 June 1991 (aged 22)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2878965922444183"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Fabián Orellana","x":-331.134033203125,"y":1411.263916015625,"id":"214","attributes":{"Eigenvector Centrality":"0.3330736796416985","Betweenness Centrality":"0.001077331406628747","Appearances":"26","No":"14","Country":"Chile","Club Country":"Spain","Club":"Celta Vigo","Weighted Degree":"23.0","Modularity Class":"18","Date of birth / Age":"27 January 1986 (aged 28)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.2851047323506594"},"color":"rgb(229,132,67)","size":11.333333015441895},{"label":"Donis Escober","x":1653.1510009765625,"y":-1192.211181640625,"id":"176","attributes":{"Eigenvector Centrality":"0.23664887946331797","Betweenness Centrality":"0.0","Appearances":"26","No":"22","Country":"Honduras","Club Country":"Honduras","Club":"Olimpia","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"3 February 1980 (aged 34)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Ricardo Costa","x":-699.53125,"y":481.9271545410156,"id":"601","attributes":{"Eigenvector Centrality":"0.4540996988101741","Betweenness Centrality":"0.0033859990894464925","Appearances":"19","No":"13","Country":"Portugal","Club Country":"Spain","Club":"Valencia","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"16 May 1981 (aged 33)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.32507739938080493"},"color":"rgb(229,164,67)","size":14.0},{"label":"Ezequiel Garay","x":-1064.4405517578125,"y":219.3739471435547,"id":"211","attributes":{"Eigenvector Centrality":"0.5249878217996955","Betweenness Centrality":"8.46487079105798E-4","Appearances":"18","No":"2","Country":"Argentina","Club Country":"Portugal","Club":"Benfica","Weighted Degree":"25.0","Modularity Class":"19","Date of birth / Age":"10 October 1986 (aged 27)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3084347461183382"},"color":"rgb(67,229,229)","size":14.0},{"label":"Alexis Sánchez","x":-613.0529174804688,"y":828.0868530273438,"id":"33","attributes":{"Eigenvector Centrality":"0.7577535645406533","Betweenness Centrality":"0.017626870894997412","Appearances":"67","No":"7","Country":"Chile","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"37.0","Modularity Class":"18","Date of birth / Age":"19 December 1988 (aged 25)","Degree":"37","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.31599312123817713"},"color":"rgb(229,132,67)","size":30.0},{"label":"Fernando Torres","x":-744.5380249023438,"y":-446.9110107421875,"id":"227","attributes":{"Eigenvector Centrality":"0.9333483233206638","Betweenness Centrality":"0.002581134642452991","Appearances":"107","No":"9","Country":"Spain","Club Country":"England","Club":"Chelsea","Weighted Degree":"32.0","Modularity Class":"23","Date of birth / Age":"20 March 1984 (aged 30)","Degree":"32","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.34186046511627904"},"color":"rgb(229,67,197)","size":23.33333396911621},{"label":"Gonzalo HiguaÃn","x":-976.8049926757812,"y":255.48199462890625,"id":"261","attributes":{"Eigenvector Centrality":"0.7220713713108181","Betweenness Centrality":"0.003097438956551802","Appearances":"36","No":"9","Country":"Argentina","Club Country":"Italy","Club":"Napoli","Weighted Degree":"32.0","Modularity Class":"19","Date of birth / Age":"10 December 1987 (aged 26)","Degree":"32","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3313796212804328"},"color":"rgb(67,229,229)","size":23.33333396911621},{"label":"Ehsan Hajsafi","x":1992.868408203125,"y":1102.4462890625,"id":"192","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"62","No":"3","Country":"Iran","Club Country":"Iran","Club":"Sepahan","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"25 February 1990 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Bruno Alves","x":-538.8344116210938,"y":183.03184509277344,"id":"93","attributes":{"Eigenvector Centrality":"0.45315937558107916","Betweenness Centrality":"0.0029488481093627983","Appearances":"72","No":"2","Country":"Portugal","Club Country":"Turkey","Club":"Fenerbahçe","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"27 November 1981 (aged 32)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3295964125560538"},"color":"rgb(229,164,67)","size":14.0},{"label":"Nicolas N\u0027Koulou","x":368.8940734863281,"y":227.7928924560547,"id":"533","attributes":{"Eigenvector Centrality":"0.3530552378369678","Betweenness Centrality":"0.004082717349656557","Appearances":"48","No":"3","Country":"Cameroon","Club Country":"France","Club":"Marseille","Weighted Degree":"24.0","Modularity Class":"17","Date of birth / Age":"27 March 1990 (aged 24)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.32856504246759055"},"color":"rgb(67,132,229)","size":12.666666984558105},{"label":"Olivier Giroud","x":-51.68798065185547,"y":-320.7739562988281,"id":"543","attributes":{"Eigenvector Centrality":"0.6518193073443905","Betweenness Centrality":"0.0017629955601543275","Appearances":"30","No":"9","Country":"France","Club Country":"England","Club":"Arsenal","Weighted Degree":"29.0","Modularity Class":"16","Date of birth / Age":"30 September 1986 (aged 27)","Degree":"29","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.3262316910785619"},"color":"rgb(229,67,229)","size":19.333332061767578},{"label":"Carlo Costly","x":1569.5697021484375,"y":-1167.26904296875,"id":"98","attributes":{"Eigenvector Centrality":"0.23664887946331803","Betweenness Centrality":"0.0","Appearances":"70","No":"13","Country":"Honduras","Club Country":"Honduras","Club":"Real España","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"18 July 1982 (aged 31)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Joseph Yobo (c)","x":3.398852586746216,"y":-1540.3546142578125,"id":"363","attributes":{"Eigenvector Centrality":"0.31894295086009894","Betweenness Centrality":"0.001459927835720332","Appearances":"97","No":"2","Country":"Nigeria","Club Country":"England","Club":"Norwich City","Weighted Degree":"23.0","Modularity Class":"14","Date of birth / Age":"6 September 1980 (aged 33)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30359355638166047"},"color":"rgb(67,229,100)","size":11.333333015441895},{"label":"Ãngel di MarÃa","x":-968.576416015625,"y":161.4849395751953,"id":"54","attributes":{"Eigenvector Centrality":"0.7593130725565046","Betweenness Centrality":"0.0038213005480664053","Appearances":"47","No":"7","Country":"Argentina","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"33.0","Modularity Class":"19","Date of birth / Age":"14 February 1988 (aged 26)","Degree":"33","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.32450331125827814"},"color":"rgb(67,229,229)","size":24.666667938232422},{"label":"Jordy Clasie","x":920.4804077148438,"y":7.3684821128845215,"id":"350","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"8","No":"16","Country":"Netherlands","Club Country":"Netherlands","Club":"Feyenoord","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"27 June 1991 (aged 22)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"Steve von Bergen","x":10.285480499267578,"y":206.5318145751953,"id":"665","attributes":{"Eigenvector Centrality":"0.384616160215653","Betweenness Centrality":"0.0","Appearances":"41","No":"5","Country":"Switzerland","Club Country":"Switzerland","Club":"Young Boys","Weighted Degree":"22.0","Modularity Class":"0","Date of birth / Age":"10 June 1983 (aged 31)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2922465208747515"},"color":"rgb(164,229,67)","size":10.0},{"label":"Jorge Claros","x":1693.2894287109375,"y":-1172.8018798828125,"id":"351","attributes":{"Eigenvector Centrality":"0.23664887946331803","Betweenness Centrality":"0.0","Appearances":"49","No":"20","Country":"Honduras","Club Country":"Honduras","Club":"Motagua","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"8 January 1986 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Afriyie Acquah","x":358.2573547363281,"y":1238.4801025390625,"id":"11","attributes":{"Eigenvector Centrality":"0.3547601242424494","Betweenness Centrality":"0.0031553330963140233","Appearances":"5","No":"6","Country":"Ghana","Club Country":"Italy","Club":"Parma","Weighted Degree":"26.0","Modularity Class":"5","Date of birth / Age":"5 January 1992 (aged 22)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3001224989791752"},"color":"rgb(67,229,197)","size":15.333333969116211},{"label":"Godfrey Oboabona","x":9.590389251708984,"y":-1597.5946044921875,"id":"259","attributes":{"Eigenvector Centrality":"0.3182459136756436","Betweenness Centrality":"0.0012640880568401147","Appearances":"35","No":"14","Country":"Nigeria","Club Country":"Turkey","Club":"Çaykur Rizespor","Weighted Degree":"23.0","Modularity Class":"14","Date of birth / Age":"16 August 1990 (aged 23)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3007364975450082"},"color":"rgb(67,229,100)","size":11.333333015441895},{"label":"Chris Smalling","x":-375.0207214355469,"y":-737.6563720703125,"id":"116","attributes":{"Eigenvector Centrality":"0.7938188270448313","Betweenness Centrality":"0.0038886080479693477","Appearances":"12","No":"12","Country":"England","Club Country":"England","Club":"Manchester United","Weighted Degree":"32.0","Modularity Class":"28","Date of birth / Age":"22 November 1989 (aged 24)","Degree":"32","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3393351800554017"},"color":"rgb(67,229,132)","size":23.33333396911621},{"label":"Shinji Okazaki","x":873.31982421875,"y":703.7589721679688,"id":"647","attributes":{"Eigenvector Centrality":"0.3658451426994684","Betweenness Centrality":"0.01364644508084283","Appearances":"76","No":"9","Country":"Japan","Club Country":"Germany","Club":"Mainz 05","Weighted Degree":"26.0","Modularity Class":"27","Date of birth / Age":"16 April 1986 (aged 28)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3313796212804328"},"color":"rgb(67,100,229)","size":15.333333969116211},{"label":"Panagiotis Kone","x":1535.2935791015625,"y":466.85699462890625,"id":"557","attributes":{"Eigenvector Centrality":"0.27279029487191714","Betweenness Centrality":"0.003339511771537693","Appearances":"16","No":"8","Country":"Greece","Club Country":"Italy","Club":"Bologna","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"26 July 1987 (aged 26)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2955367913148371"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Michel Vorm","x":868.7987060546875,"y":-56.30570602416992,"id":"507","attributes":{"Eigenvector Centrality":"0.34815687766993364","Betweenness Centrality":"0.0010475901113017954","Appearances":"14","No":"22","Country":"Netherlands","Club Country":"Wales","Club":"Swansea City","Weighted Degree":"23.0","Modularity Class":"22","Date of birth / Age":"3 October 1983 (aged 30)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.31873373807458805"},"color":"rgb(197,67,229)","size":11.333333015441895},{"label":"Moussa Sissoko","x":49.93161392211914,"y":-364.4847106933594,"id":"523","attributes":{"Eigenvector Centrality":"0.5292224497836602","Betweenness Centrality":"0.0019647591823339743","Appearances":"17","No":"18","Country":"France","Club Country":"England","Club":"Newcastle United","Weighted Degree":"25.0","Modularity Class":"16","Date of birth / Age":"16 August 1989 (aged 24)","Degree":"25","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3315290933694181"},"color":"rgb(229,67,229)","size":14.0},{"label":"Haris Medunjanin","x":1200.25390625,"y":-418.5536193847656,"id":"270","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"35","No":"18","Country":"Bosnia and Herzegovina","Club Country":"Turkey","Club":"Gaziantepspor","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"8 March 1985 (aged 29)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Jasmin Fejzic","x":1170.343505859375,"y":-544.86572265625,"id":"312","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"0","No":"12","Country":"Bosnia and Herzegovina","Club Country":"Germany","Club":"VfR Aalen","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"15 May 1986 (aged 28)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Mohammed Rabiu","x":577.3356323242188,"y":1315.146484375,"id":"520","attributes":{"Eigenvector Centrality":"0.3006021575032019","Betweenness Centrality":"0.008146054895944195","Appearances":"17","No":"17","Country":"Ghana","Club Country":"Russia","Club":"Kuban Krasnodar","Weighted Degree":"23.0","Modularity Class":"5","Date of birth / Age":"31 December 1989 (aged 24)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.29720986655883547"},"color":"rgb(67,229,197)","size":11.333333015441895},{"label":"Morgan Schneiderlin","x":8.893564224243164,"y":-207.0862274169922,"id":"521","attributes":{"Eigenvector Centrality":"0.5951644353181168","Betweenness Centrality":"0.003380555121507494","Appearances":"1","No":"22","Country":"France","Club Country":"England","Club":"Southampton","Weighted Degree":"28.0","Modularity Class":"16","Date of birth / Age":"8 November 1989 (aged 24)","Degree":"28","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.32989228007181326"},"color":"rgb(229,67,229)","size":18.0},{"label":"Xabi Alonso","x":-899.6201171875,"y":-193.28744506835938,"id":"719","attributes":{"Eigenvector Centrality":"0.904011259559127","Betweenness Centrality":"0.001687861941424018","Appearances":"111","No":"14","Country":"Spain","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"25 November 1981 (aged 32)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3350045578851413"},"color":"rgb(229,67,197)","size":22.0},{"label":"Sergio Ramos","x":-838.3143310546875,"y":-237.3342742919922,"id":"644","attributes":{"Eigenvector Centrality":"0.9040112595591273","Betweenness Centrality":"0.001687861941424018","Appearances":"117","No":"15","Country":"Spain","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"30 March 1986 (aged 28)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3350045578851413"},"color":"rgb(229,67,197)","size":22.0},{"label":"Mauricio Pinilla","x":-356.00860595703125,"y":1526.689208984375,"id":"484","attributes":{"Eigenvector Centrality":"0.32867119536836353","Betweenness Centrality":"0.0016022418362757359","Appearances":"27","No":"9","Country":"Chile","Club Country":"Italy","Club":"Cagliari","Weighted Degree":"23.0","Modularity Class":"18","Date of birth / Age":"4 February 1984 (aged 30)","Degree":"23","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.2854368932038835"},"color":"rgb(229,132,67)","size":11.333333015441895},{"label":"Giovani dos Santos","x":-2058.406494140625,"y":426.6941833496094,"id":"256","attributes":{"Eigenvector Centrality":"0.2771264523867947","Betweenness Centrality":"0.0","Appearances":"76","No":"10","Country":"Mexico","Club Country":"Spain","Club":"Villarreal","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"11 May 1989 (aged 25)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Sebastián Coates","x":-52.67010498046875,"y":55.84718322753906,"id":"634","attributes":{"Eigenvector Centrality":"0.37564528732258257","Betweenness Centrality":"0.0","Appearances":"15","No":"19","Country":"Uruguay","Club Country":"Uruguay","Club":"Nacional","Weighted Degree":"22.0","Modularity Class":"6","Date of birth / Age":"7 October 1990 (aged 23)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3121019108280255"},"color":"rgb(229,197,67)","size":10.0},{"label":"Rodrigo Palacio","x":-1056.1539306640625,"y":433.82733154296875,"id":"608","attributes":{"Eigenvector Centrality":"0.5658107599692683","Betweenness Centrality":"0.0025393109943757006","Appearances":"22","No":"18","Country":"Argentina","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"27.0","Modularity Class":"19","Date of birth / Age":"5 February 1982 (aged 32)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3272484416740873"},"color":"rgb(67,229,229)","size":16.666667938232422},{"label":"Pejman Montazeri","x":2022.994140625,"y":1015.429931640625,"id":"570","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"22","No":"15","Country":"Iran","Club Country":"Qatar","Club":"Umm Salal","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"6 September 1983 (aged 30)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Osman Chávez","x":1657.87158203125,"y":-1139.41357421875,"id":"551","attributes":{"Eigenvector Centrality":"0.23664887946331795","Betweenness Centrality":"0.0","Appearances":"54","No":"2","Country":"Honduras","Club Country":"China","Club":"Qingdao Jonoon","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"29 July 1984 (aged 29)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Kim Shin-wook","x":1231.204833984375,"y":1679.30859375,"id":"394","attributes":{"Eigenvector Centrality":"0.23152559498868786","Betweenness Centrality":"0.0","Appearances":"27","No":"18","Country":"South Korea","Club Country":"South Korea","Club":"Ulsan Hyundai","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"14 April 1988 (aged 26)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Khosro Heydari","x":2085.276611328125,"y":1118.5545654296875,"id":"389","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"49","No":"2","Country":"Iran","Club Country":"Iran","Club":"Esteghlal","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"14 September 1983 (aged 30)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Diego Costa","x":-946.3432006835938,"y":-379.19134521484375,"id":"164","attributes":{"Eigenvector Centrality":"0.7852248920099726","Betweenness Centrality":"7.220203040676876E-4","Appearances":"2","No":"19","Country":"Spain","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"27.0","Modularity Class":"23","Date of birth / Age":"7 October 1988 (aged 25)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3215223097112861"},"color":"rgb(229,67,197)","size":16.666667938232422},{"label":"Hiroki Sakai","x":714.5648803710938,"y":462.325927734375,"id":"281","attributes":{"Eigenvector Centrality":"0.3477183857332478","Betweenness Centrality":"0.0032794346304893863","Appearances":"18","No":"21","Country":"Japan","Club Country":"Germany","Club":"Hannover 96","Weighted Degree":"24.0","Modularity Class":"27","Date of birth / Age":"12 April 1990 (aged 24)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(67,100,229)","size":12.666666984558105},{"label":"Mario Mandžukic","x":-149.63389587402344,"y":325.6033020019531,"id":"455","attributes":{"Eigenvector Centrality":"0.663406558743265","Betweenness Centrality":"0.010037273598114245","Appearances":"50","No":"17","Country":"Croatia","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"35.0","Modularity Class":"25","Date of birth / Age":"21 May 1986 (aged 28)","Degree":"35","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(132,67,229)","size":27.33333396911621},{"label":"Ashkan Dejagah","x":1842.160400390625,"y":978.629150390625,"id":"66","attributes":{"Eigenvector Centrality":"0.23463431563555487","Betweenness Centrality":"0.021760525958165706","Appearances":"14","No":"21","Country":"Iran","Club Country":"England","Club":"Fulham","Weighted Degree":"24.0","Modularity Class":"1","Date of birth / Age":"5 July 1986 (aged 27)","Degree":"24","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.2317880794701987"},"color":"rgb(67,197,229)","size":12.666666984558105},{"label":"Philippe Senderos","x":-84.25211334228516,"y":385.70135498046875,"id":"578","attributes":{"Eigenvector Centrality":"0.44557482377385943","Betweenness Centrality":"0.0032141732482156185","Appearances":"53","No":"4","Country":"Switzerland","Club Country":"Spain","Club":"Valencia","Weighted Degree":"26.0","Modularity Class":"0","Date of birth / Age":"14 February 1985 (aged 29)","Degree":"26","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31558608844997854"},"color":"rgb(164,229,67)","size":15.333333969116211},{"label":"Massimo Luongo","x":2135.375244140625,"y":-676.9358520507812,"id":"468","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"1","No":"21","Country":"Australia","Club Country":"England","Club":"Swindon Town","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"25 September 1992 (aged 21)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Ivan Franjic","x":2090.4951171875,"y":-571.4816284179688,"id":"298","attributes":{"Eigenvector Centrality":"0.22132294330055013","Betweenness Centrality":"0.0","Appearances":"9","No":"2","Country":"Australia","Club Country":"Australia","Club":"Brisbane Roar","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"10 September 1987 (aged 26)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Joël Matip","x":540.7796630859375,"y":139.5815887451172,"id":"337","attributes":{"Eigenvector Centrality":"0.4237417749913705","Betweenness Centrality":"0.007099320902674921","Appearances":"23","No":"21","Country":"Cameroon","Club Country":"Germany","Club":"Schalke \u002704","Weighted Degree":"28.0","Modularity Class":"17","Date of birth / Age":"8 August 1991 (aged 22)","Degree":"28","Position":"MF","Eccentricity":"4.0","Closeness Centrality":"0.3452325035227807"},"color":"rgb(67,132,229)","size":18.0},{"label":"Michael Bradley","x":721.9478759765625,"y":-1477.4307861328125,"id":"502","attributes":{"Eigenvector Centrality":"0.29057372512473595","Betweenness Centrality":"0.0021113417181140752","Appearances":"86","No":"4","Country":"United States","Club Country":"Canada","Club":"Toronto FC","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"31 July 1987 (aged 26)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.29829545454545453"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"Fredy GuarÃn","x":-787.8544311523438,"y":1018.7176513671875,"id":"234","attributes":{"Eigenvector Centrality":"0.44651895950904885","Betweenness Centrality":"0.006124835129264176","Appearances":"49","No":"13","Country":"Colombia","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"29.0","Modularity Class":"11","Date of birth / Age":"30 June 1986 (aged 27)","Degree":"29","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.32579787234042556"},"color":"rgb(67,67,229)","size":19.333332061767578},{"label":"Júlio César","x":-374.46234130859375,"y":-336.2733154296875,"id":"376","attributes":{"Eigenvector Centrality":"0.554070122482655","Betweenness Centrality":"0.002682419843539279","Appearances":"80","No":"12","Country":"Brazil","Club Country":"Canada","Club":"Toronto FC","Weighted Degree":"23.0","Modularity Class":"23","Date of birth / Age":"3 September 1979 (aged 34)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.32579787234042556"},"color":"rgb(229,67,197)","size":11.333333015441895},{"label":"Robin van Persie (c)","x":425.4057312011719,"y":-117.818603515625,"id":"606","attributes":{"Eigenvector Centrality":"0.6930127535568564","Betweenness Centrality":"0.016157179699501083","Appearances":"85","No":"9","Country":"Netherlands","Club Country":"England","Club":"Manchester United","Weighted Degree":"35.0","Modularity Class":"22","Date of birth / Age":"6 August 1983 (aged 30)","Degree":"35","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.349002849002849"},"color":"rgb(197,67,229)","size":27.33333396911621},{"label":"Mariano Andújar","x":-1186.145263671875,"y":246.04403686523438,"id":"451","attributes":{"Eigenvector Centrality":"0.47565077145164436","Betweenness Centrality":"0.0","Appearances":"10","No":"21","Country":"Argentina","Club Country":"Italy","Club":"Catania","Weighted Degree":"22.0","Modularity Class":"19","Date of birth / Age":"30 July 1983 (aged 30)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2930622009569378"},"color":"rgb(67,229,229)","size":10.0},{"label":"Lee Chung-yong","x":1146.0408935546875,"y":1647.960205078125,"id":"412","attributes":{"Eigenvector Centrality":"0.23152559498868786","Betweenness Centrality":"0.0","Appearances":"55","No":"17","Country":"South Korea","Club Country":"England","Club":"Bolton Wanderers","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"2 July 1988 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Andranik Teymourian","x":1940.65771484375,"y":1114.891357421875,"id":"41","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"79","No":"14","Country":"Iran","Club Country":"Iran","Club":"Esteghlal","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"6 March 1983 (aged 31)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Sammy Bossut","x":-665.6251831054688,"y":-835.4097900390625,"id":"625","attributes":{"Eigenvector Centrality":"0.5344280608201899","Betweenness Centrality":"0.001607259967508427","Appearances":"0","No":"13","Country":"Belgium","Club Country":"Belgium","Club":"Zulte Waregem","Weighted Degree":"23.0","Modularity Class":"28","Date of birth / Age":"11 August 1985 (aged 28)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3343949044585987"},"color":"rgb(67,229,132)","size":11.333333015441895},{"label":"Juan Mata","x":-837.1373291015625,"y":-428.5978088378906,"id":"371","attributes":{"Eigenvector Centrality":"1.0","Betweenness Centrality":"0.005194225936839837","Appearances":"33","No":"13","Country":"Spain","Club Country":"England","Club":"Manchester United","Weighted Degree":"34.0","Modularity Class":"23","Date of birth / Age":"28 April 1988 (aged 26)","Degree":"34","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3478466635115949"},"color":"rgb(229,67,197)","size":26.0},{"label":"Faouzi Ghoulam","x":-1163.78857421875,"y":887.729736328125,"id":"218","attributes":{"Eigenvector Centrality":"0.571120930615696","Betweenness Centrality":"0.011614602667759096","Appearances":"6","No":"3","Country":"Algeria","Club Country":"Italy","Club":"Napoli","Weighted Degree":"33.0","Modularity Class":"24","Date of birth / Age":"1 February 1991 (aged 23)","Degree":"33","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3282715497990174"},"color":"rgb(67,164,229)","size":24.666667938232422},{"label":"Kenneth Omeruo","x":-33.326751708984375,"y":-1484.3856201171875,"id":"383","attributes":{"Eigenvector Centrality":"0.3177111385028752","Betweenness Centrality":"0.0033306119897154834","Appearances":"17","No":"22","Country":"Nigeria","Club Country":"England","Club":"Middlesbrough","Weighted Degree":"23.0","Modularity Class":"14","Date of birth / Age":"17 October 1993 (aged 20)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30222039473684215"},"color":"rgb(67,229,100)","size":11.333333015441895},{"label":"Yann Sommer","x":110.02254486083984,"y":216.66073608398438,"id":"723","attributes":{"Eigenvector Centrality":"0.4279165187640593","Betweenness Centrality":"0.0017015426628181239","Appearances":"6","No":"12","Country":"Switzerland","Club Country":"Switzerland","Club":"Basel","Weighted Degree":"25.0","Modularity Class":"0","Date of birth / Age":"17 December 1988 (aged 25)","Degree":"25","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.31038851351351354"},"color":"rgb(164,229,67)","size":14.0},{"label":"Park Jong-woo","x":1236.085205078125,"y":1634.40380859375,"id":"560","attributes":{"Eigenvector Centrality":"0.2315255949886878","Betweenness Centrality":"0.0","Appearances":"10","No":"15","Country":"South Korea","Club Country":"China","Club":"Guangzhou R\u0026F","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"10 March 1989 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Arthur Boka","x":447.86834716796875,"y":-798.1806030273438,"id":"63","attributes":{"Eigenvector Centrality":"0.35099862946861243","Betweenness Centrality":"0.008388572053063042","Appearances":"78","No":"3","Country":"Ivory Coast","Club Country":"Germany","Club":"VfB Stuttgart","Weighted Degree":"25.0","Modularity Class":"9","Date of birth / Age":"2 April 1983 (aged 31)","Degree":"25","Position":"DF","Eccentricity":"4.0","Closeness Centrality":"0.32407407407407407"},"color":"rgb(164,67,229)","size":14.0},{"label":"Eiji Kawashima","x":599.2489624023438,"y":588.3504638671875,"id":"193","attributes":{"Eigenvector Centrality":"0.34852679481914073","Betweenness Centrality":"0.0021785252251571444","Appearances":"56","No":"1","Country":"Japan","Club Country":"Belgium","Club":"Standard Liège","Weighted Degree":"24.0","Modularity Class":"27","Date of birth / Age":"20 March 1983 (aged 31)","Degree":"24","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3249336870026525"},"color":"rgb(67,100,229)","size":12.666666984558105},{"label":"Javier Hernández","x":-1606.5635986328125,"y":123.67082214355469,"id":"318","attributes":{"Eigenvector Centrality":"0.6365445749365468","Betweenness Centrality":"0.02191152925089069","Appearances":"62","No":"14","Country":"Mexico","Club Country":"England","Club":"Manchester United","Weighted Degree":"35.0","Modularity Class":"21","Date of birth / Age":"1 June 1988 (aged 26)","Degree":"35","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.3211009174311927"},"color":"rgb(67,229,67)","size":27.33333396911621},{"label":"Terence Kongolo","x":966.4187622070312,"y":-4.162721157073975,"id":"673","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"1","No":"14","Country":"Netherlands","Club Country":"Netherlands","Club":"Feyenoord","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"14 February 1994 (aged 20)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"Fabian Johnson","x":879.2975463867188,"y":-1453.8760986328125,"id":"213","attributes":{"Eigenvector Centrality":"0.28349810265891734","Betweenness Centrality":"0.002395894042282543","Appearances":"22","No":"23","Country":"United States","Club Country":"Germany","Club":"1899 Hoffenheim","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"11 December 1987 (aged 26)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2973300970873787"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"Mehdi Mostefa","x":-1480.4698486328125,"y":1115.907470703125,"id":"494","attributes":{"Eigenvector Centrality":"0.30735480949810884","Betweenness Centrality":"0.001735065078748807","Appearances":"23","No":"22","Country":"Algeria","Club Country":"France","Club":"Ajaccio","Weighted Degree":"23.0","Modularity Class":"24","Date of birth / Age":"30 August 1983 (aged 30)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.29178245335450576"},"color":"rgb(67,164,229)","size":11.333333015441895},{"label":"Andrés Guardado","x":-1822.0682373046875,"y":449.0326232910156,"id":"49","attributes":{"Eigenvector Centrality":"0.2999622703453746","Betweenness Centrality":"0.009651872776145686","Appearances":"104","No":"18","Country":"Mexico","Club Country":"Germany","Club":"Bayer Leverkusen","Weighted Degree":"24.0","Modularity Class":"21","Date of birth / Age":"28 September 1986 (aged 27)","Degree":"24","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.28982649842271296"},"color":"rgb(67,229,67)","size":12.666666984558105},{"label":"Maksim Kanunnikov","x":-1315.3818359375,"y":-1323.4705810546875,"id":"439","attributes":{"Eigenvector Centrality":"0.2784495406871368","Betweenness Centrality":"0.0019868644316807485","Appearances":"2","No":"6","Country":"Russia","Club Country":"Russia","Club":"Rubin Kazan","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"14 July 1991 (aged 22)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.256186824677588"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Edin ViÅ¡ca","x":1198.7845458984375,"y":-465.6673889160156,"id":"184","attributes":{"Eigenvector Centrality":"0.28396954172011374","Betweenness Centrality":"0.0","Appearances":"10","No":"19","Country":"Bosnia and Herzegovina","Club Country":"Turkey","Club":"?stanbul Ba?ak?ehir","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"17 February 1990 (aged 24)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Pablo Armero","x":-854.2186889648438,"y":1249.3016357421875,"id":"554","attributes":{"Eigenvector Centrality":"0.31394925107891597","Betweenness Centrality":"0.0","Appearances":"53","No":"7","Country":"Colombia","Club Country":"England","Club":"West Ham United","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"2 November 1986 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"Dario VidoÅ¡ic","x":2016.283203125,"y":-666.3252563476562,"id":"148","attributes":{"Eigenvector Centrality":"0.22132294330055013","Betweenness Centrality":"0.0","Appearances":"23","No":"20","Country":"Australia","Club Country":"Switzerland","Club":"Sion","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"8 April 1987 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Theofanis Gekas","x":1527.901123046875,"y":552.6124267578125,"id":"674","attributes":{"Eigenvector Centrality":"0.27085145055391363","Betweenness Centrality":"0.002908370966594667","Appearances":"72","No":"17","Country":"Greece","Club Country":"Turkey","Club":"Konyaspor","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"23 May 1980 (aged 34)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2961321514907333"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Paul Aguilar","x":-2114.9287109375,"y":482.1558532714844,"id":"564","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"30","No":"22","Country":"Mexico","Club Country":"Mexico","Club":"América","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"6 March 1986 (aged 28)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Karim Benzema","x":-255.21575927734375,"y":-165.30316162109375,"id":"381","attributes":{"Eigenvector Centrality":"0.7424885429812043","Betweenness Centrality":"0.0035273454232103265","Appearances":"66","No":"10","Country":"France","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"32.0","Modularity Class":"16","Date of birth / Age":"19 December 1987 (aged 26)","Degree":"32","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.33576975788031066"},"color":"rgb(229,67,229)","size":23.33333396911621},{"label":"Vedad IbiÅ¡evic","x":1011.349853515625,"y":-507.7367248535156,"id":"697","attributes":{"Eigenvector Centrality":"0.32601187536143794","Betweenness Centrality":"0.009130368482483735","Appearances":"55","No":"9","Country":"Bosnia and Herzegovina","Club Country":"Germany","Club":"VfB Stuttgart","Weighted Degree":"25.0","Modularity Class":"20","Date of birth / Age":"6 August 1984 (aged 29)","Degree":"25","Position":"FW","Eccentricity":"4.0","Closeness Centrality":"0.3321283325802079"},"color":"rgb(132,229,67)","size":14.0},{"label":"Jefferson Montero","x":-1599.2291259765625,"y":-622.9718627929688,"id":"324","attributes":{"Eigenvector Centrality":"0.37658875098697026","Betweenness Centrality":"0.0026941239537997667","Appearances":"40","No":"7","Country":"Ecuador","Club Country":"Mexico","Club":"Morelia","Weighted Degree":"23.0","Modularity Class":"4","Date of birth / Age":"1 September 1989 (aged 24)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30110610405571486"},"color":"rgb(229,67,132)","size":11.333333015441895},{"label":"Marco Parolo","x":223.34402465820312,"y":798.16845703125,"id":"447","attributes":{"Eigenvector Centrality":"0.44952910121457834","Betweenness Centrality":"4.3533065978638123E-4","Appearances":"4","No":"18","Country":"Italy","Club Country":"Italy","Club":"Parma","Weighted Degree":"24.0","Modularity Class":"3","Date of birth / Age":"25 January 1985 (aged 29)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30714584203928125"},"color":"rgb(197,229,67)","size":12.666666984558105},{"label":"José Rojas","x":-307.82147216796875,"y":1544.14697265625,"id":"362","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"19","No":"13","Country":"Chile","Club Country":"Chile","Club":"Universidad de Chile","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"3 June 1983 (aged 31)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Thiago Motta","x":60.09503936767578,"y":671.3873291015625,"id":"675","attributes":{"Eigenvector Centrality":"0.5779444332967031","Betweenness Centrality":"0.001710601263663759","Appearances":"20","No":"5","Country":"Italy","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"29.0","Modularity Class":"3","Date of birth / Age":"28 August 1982 (aged 31)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3166738474795347"},"color":"rgb(197,229,67)","size":19.333332061767578},{"label":"Masahiko Inoha","x":730.9411010742188,"y":583.111083984375,"id":"465","attributes":{"Eigenvector Centrality":"0.3171815377783478","Betweenness Centrality":"0.0","Appearances":"21","No":"19","Country":"Japan","Club Country":"Japan","Club":"Jubilo Iwata","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"28 August 1983 (aged 30)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Dani Alves","x":-742.1677856445312,"y":-271.697998046875,"id":"135","attributes":{"Eigenvector Centrality":"0.947563971570452","Betweenness Centrality":"0.005368122690024312","Appearances":"75","No":"2","Country":"Brazil","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"36.0","Modularity Class":"23","Date of birth / Age":"6 May 1983 (aged 31)","Degree":"36","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.34249767008387694"},"color":"rgb(229,67,197)","size":28.66666603088379},{"label":"Ryan McGowan","x":2185.520263671875,"y":-671.7802124023438,"id":"620","attributes":{"Eigenvector Centrality":"0.22132294330055013","Betweenness Centrality":"0.0","Appearances":"9","No":"19","Country":"Australia","Club Country":"China","Club":"Shandong Luneng Taishan","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"15 August 1989 (aged 24)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Lee Yong","x":1208.6063232421875,"y":1598.1090087890625,"id":"414","attributes":{"Eigenvector Centrality":"0.23152559498868786","Betweenness Centrality":"0.0","Appearances":"12","No":"12","Country":"South Korea","Club Country":"South Korea","Club":"Ulsan Hyundai","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"24 December 1986 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Antonio Candreva","x":180.96414184570312,"y":574.769287109375,"id":"58","attributes":{"Eigenvector Centrality":"0.5275205103981985","Betweenness Centrality":"0.00895640114460652","Appearances":"20","No":"6","Country":"Italy","Club Country":"Italy","Club":"Lazio","Weighted Degree":"28.0","Modularity Class":"3","Date of birth / Age":"28 February 1987 (aged 27)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33424283765347884"},"color":"rgb(197,229,67)","size":18.0},{"label":"Walter Gargano","x":-40.0959358215332,"y":145.01853942871094,"id":"711","attributes":{"Eigenvector Centrality":"0.4378381017420734","Betweenness Centrality":"0.0029785823951134294","Appearances":"63","No":"5","Country":"Uruguay","Club Country":"Italy","Club":"Parma","Weighted Degree":"26.0","Modularity Class":"6","Date of birth / Age":"23 July 1984 (aged 29)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3204010462074978"},"color":"rgb(229,197,67)","size":15.333333969116211},{"label":"Steven Defour","x":-855.4899291992188,"y":-553.7450561523438,"id":"667","attributes":{"Eigenvector Centrality":"0.6646783589767196","Betweenness Centrality":"0.008614529247819509","Appearances":"43","No":"16","Country":"Belgium","Club Country":"Portugal","Club":"Porto","Weighted Degree":"30.0","Modularity Class":"28","Date of birth / Age":"15 April 1988 (aged 26)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.35083532219570407"},"color":"rgb(67,229,132)","size":20.666667938232422},{"label":"Maxi RodrÃguez","x":-1193.765625,"y":294.735595703125,"id":"487","attributes":{"Eigenvector Centrality":"0.47565077145164436","Betweenness Centrality":"0.0","Appearances":"55","No":"11","Country":"Argentina","Club Country":"Argentina","Club":"Newell\u0027s Old Boys","Weighted Degree":"22.0","Modularity Class":"19","Date of birth / Age":"2 January 1981 (aged 33)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2930622009569378"},"color":"rgb(67,229,229)","size":10.0},{"label":"Tranquillo Barnetta","x":73.72463989257812,"y":117.78337097167969,"id":"690","attributes":{"Eigenvector Centrality":"0.3971021212364907","Betweenness Centrality":"9.117937878248679E-4","Appearances":"74","No":"7","Country":"Switzerland","Club Country":"Germany","Club":"Eintracht Frankfurt","Weighted Degree":"23.0","Modularity Class":"0","Date of birth / Age":"22 May 1985 (aged 29)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3053593685085168"},"color":"rgb(164,229,67)","size":11.333333015441895},{"label":"Constant Djakpa","x":513.1433715820312,"y":-809.9959106445312,"id":"127","attributes":{"Eigenvector Centrality":"0.32415574535906994","Betweenness Centrality":"8.776465884449839E-4","Appearances":"5","No":"18","Country":"Ivory Coast","Club Country":"Germany","Club":"Eintracht Frankfurt","Weighted Degree":"23.0","Modularity Class":"9","Date of birth / Age":"17 October 1986 (aged 27)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30523255813953487"},"color":"rgb(164,67,229)","size":11.333333015441895},{"label":"Carlos Carbonero","x":-742.2178344726562,"y":1199.126220703125,"id":"100","attributes":{"Eigenvector Centrality":"0.3139492510789159","Betweenness Centrality":"0.0","Appearances":"1","No":"5","Country":"Colombia","Club Country":"Argentina","Club":"River Plate","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"25 July 1990 (aged 23)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"Thiago Silva (c)","x":-361.4657287597656,"y":-169.6861114501953,"id":"676","attributes":{"Eigenvector Centrality":"0.7136149540335622","Betweenness Centrality":"0.0035076449501830744","Appearances":"46","No":"3","Country":"Brazil","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"30.0","Modularity Class":"23","Date of birth / Age":"22 September 1984 (aged 29)","Degree":"30","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3336359509759419"},"color":"rgb(229,67,197)","size":20.666667938232422},{"label":"Miroslav Klose","x":293.1423645019531,"y":-267.2074890136719,"id":"517","attributes":{"Eigenvector Centrality":"0.5811899312198234","Betweenness Centrality":"0.010562454139187511","Appearances":"132","No":"11","Country":"Germany","Club Country":"Italy","Club":"Lazio","Weighted Degree":"28.0","Modularity Class":"13","Date of birth / Age":"9 June 1978 (aged 36)","Degree":"28","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.33746556473829203"},"color":"rgb(67,229,164)","size":18.0},{"label":"Xherdan Shaqiri","x":141.72509765625,"y":12.289528846740723,"id":"721","attributes":{"Eigenvector Centrality":"0.7024966189465659","Betweenness Centrality":"0.009639109401232904","Appearances":"33","No":"23","Country":"Switzerland","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"35.0","Modularity Class":"0","Date of birth / Age":"10 October 1991 (aged 22)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3383977900552486"},"color":"rgb(164,229,67)","size":27.33333396911621},{"label":"Roman Weidenfeller","x":605.18408203125,"y":-360.4881896972656,"id":"611","attributes":{"Eigenvector Centrality":"0.5006809860242267","Betweenness Centrality":"0.008472576600609625","Appearances":"3","No":"22","Country":"Germany","Club Country":"Germany","Club":"Borussia Dortmund","Weighted Degree":"24.0","Modularity Class":"13","Date of birth / Age":"6 August 1980 (aged 33)","Degree":"24","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.310126582278481"},"color":"rgb(67,229,164)","size":12.666666984558105},{"label":"Javier Mascherano","x":-1221.532470703125,"y":91.2391586303711,"id":"319","attributes":{"Eigenvector Centrality":"0.884141666517999","Betweenness Centrality":"0.004626645517321425","Appearances":"98","No":"14","Country":"Argentina","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"36.0","Modularity Class":"19","Date of birth / Age":"8 June 1984 (aged 30)","Degree":"36","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3273942093541203"},"color":"rgb(67,229,229)","size":28.66666603088379},{"label":"Carlos Carmona","x":-345.68072509765625,"y":1473.065185546875,"id":"101","attributes":{"Eigenvector Centrality":"0.3286711953683635","Betweenness Centrality":"0.0016022418362757356","Appearances":"44","No":"6","Country":"Chile","Club Country":"Italy","Club":"Atalanta","Weighted Degree":"23.0","Modularity Class":"18","Date of birth / Age":"21 February 1987 (aged 27)","Degree":"23","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2854368932038835"},"color":"rgb(229,132,67)","size":11.333333015441895},{"label":"Liassine Cadamuro-Bentaïba","x":-1424.95849609375,"y":1185.5799560546875,"id":"418","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"7","No":"17","Country":"Algeria","Club Country":"Spain","Club":"Mallorca","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"5 March 1988 (aged 26)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Alex Oxlade-Chamberlain","x":-56.5023193359375,"y":-825.344482421875,"id":"27","attributes":{"Eigenvector Centrality":"0.706323984260769","Betweenness Centrality":"0.001711566637513174","Appearances":"15","No":"15","Country":"England","Club Country":"England","Club":"Arsenal","Weighted Degree":"30.0","Modularity Class":"28","Date of birth / Age":"15 August 1993 (aged 20)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3199825859817153"},"color":"rgb(67,229,132)","size":20.666667938232422},{"label":"Jalal Hosseini","x":2076.03515625,"y":1075.61083984375,"id":"306","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"85","No":"4","Country":"Iran","Club Country":"Iran","Club":"Persepolis","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"3 February 1982 (aged 32)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Johnny Herrera","x":-225.40228271484375,"y":1509.60302734375,"id":"344","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"8","No":"23","Country":"Chile","Club Country":"Chile","Club":"Universidad de Chile","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"9 May 1981 (aged 33)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Rafik Halliche","x":-1426.09912109375,"y":1266.290771484375,"id":"582","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"29","No":"5","Country":"Algeria","Club Country":"Portugal","Club":"Académica","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"2 September 1986 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Kim Seung-gyu","x":1189.895751953125,"y":1559.8544921875,"id":"393","attributes":{"Eigenvector Centrality":"0.23152559498868777","Betweenness Centrality":"0.0","Appearances":"5","No":"21","Country":"South Korea","Club Country":"South Korea","Club":"Ulsan Hyundai","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"30 September 1990 (aged 23)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"William Carvalho","x":-772.361083984375,"y":375.0953674316406,"id":"716","attributes":{"Eigenvector Centrality":"0.4410475661612916","Betweenness Centrality":"0.001075874410151188","Appearances":"4","No":"6","Country":"Portugal","Club Country":"Portugal","Club":"Sporting CP","Weighted Degree":"24.0","Modularity Class":"8","Date of birth / Age":"7 April 1992 (aged 22)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3185955786736021"},"color":"rgb(229,164,67)","size":12.666666984558105},{"label":"Gabriel Paletta","x":206.93821716308594,"y":845.000732421875,"id":"237","attributes":{"Eigenvector Centrality":"0.4495291012145782","Betweenness Centrality":"4.3533065978638123E-4","Appearances":"2","No":"20","Country":"Italy","Club Country":"Italy","Club":"Parma","Weighted Degree":"24.0","Modularity Class":"3","Date of birth / Age":"15 February 1986 (aged 28)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30714584203928125"},"color":"rgb(197,229,67)","size":12.666666984558105},{"label":"Keylor Navas","x":2179.6376953125,"y":330.6126708984375,"id":"388","attributes":{"Eigenvector Centrality":"0.24591596591658982","Betweenness Centrality":"0.0020809246802811297","Appearances":"53","No":"1","Country":"Costa Rica","Club Country":"Spain","Club":"Levante","Weighted Degree":"23.0","Modularity Class":"29","Date of birth / Age":"15 December 1986 (aged 27)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.26844411979547117"},"color":"rgb(229,229,67)","size":11.333333015441895},{"label":"MartÃn Silva","x":-0.6348667740821838,"y":1.9825427532196045,"id":"463","attributes":{"Eigenvector Centrality":"0.37564528732258246","Betweenness Centrality":"0.0","Appearances":"4","No":"23","Country":"Uruguay","Club Country":"Brazil","Club":"Vasco da Gama","Weighted Degree":"22.0","Modularity Class":"6","Date of birth / Age":"25 March 1983 (aged 31)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3121019108280255"},"color":"rgb(229,197,67)","size":10.0},{"label":"Mathieu Valbuena","x":44.39426040649414,"y":-119.34598541259766,"id":"473","attributes":{"Eigenvector Centrality":"0.5095573508334031","Betweenness Centrality":"0.0046278408281149215","Appearances":"34","No":"8","Country":"France","Club Country":"France","Club":"Marseille","Weighted Degree":"24.0","Modularity Class":"16","Date of birth / Age":"28 September 1984 (aged 29)","Degree":"24","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3247901016349978"},"color":"rgb(229,67,229)","size":12.666666984558105},{"label":"Ante Rebic","x":-308.12176513671875,"y":744.3989868164062,"id":"55","attributes":{"Eigenvector Centrality":"0.37367251459016204","Betweenness Centrality":"0.002289273069692677","Appearances":"5","No":"16","Country":"Croatia","Club Country":"Italy","Club":"Fiorentina","Weighted Degree":"24.0","Modularity Class":"25","Date of birth / Age":"21 September 1993 (aged 20)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3125"},"color":"rgb(132,67,229)","size":12.666666984558105},{"label":"Danijel Pranjic","x":-193.00035095214844,"y":612.0997924804688,"id":"142","attributes":{"Eigenvector Centrality":"0.35596191653510817","Betweenness Centrality":"0.00248185018192758","Appearances":"50","No":"3","Country":"Croatia","Club Country":"Greece","Club":"Panathinaikos","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"2 December 1981 (aged 32)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30676126878130217"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Andrey Yeshchenko","x":-1412.1168212890625,"y":-1477.236083984375,"id":"51","attributes":{"Eigenvector Centrality":"0.2656930429181982","Betweenness Centrality":"0.0","Appearances":"12","No":"22","Country":"Russia","Club Country":"Russia","Club":"Anzhi Makhachkala","Weighted Degree":"22.0","Modularity Class":"2","Date of birth / Age":"9 February 1984 (aged 30)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.23244781783681215"},"color":"rgb(229,67,67)","size":10.0},{"label":"Atsuto Uchida","x":789.1749877929688,"y":479.1142272949219,"id":"69","attributes":{"Eigenvector Centrality":"0.4182713819100073","Betweenness Centrality":"0.00731168207978959","Appearances":"68","No":"2","Country":"Japan","Club Country":"Germany","Club":"Schalke \u002704","Weighted Degree":"28.0","Modularity Class":"27","Date of birth / Age":"27 March 1988 (aged 26)","Degree":"28","Position":"DF","Eccentricity":"4.0","Closeness Centrality":"0.34329752452125173"},"color":"rgb(67,100,229)","size":18.0},{"label":"Thibaut Courtois","x":-784.1881713867188,"y":-694.4415893554688,"id":"677","attributes":{"Eigenvector Centrality":"0.6799862056462357","Betweenness Centrality":"0.0018763771735177332","Appearances":"17","No":"1","Country":"Belgium","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"29.0","Modularity Class":"28","Date of birth / Age":"11 May 1992 (aged 22)","Degree":"29","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3313796212804328"},"color":"rgb(67,229,132)","size":19.333332061767578},{"label":"John Boye","x":493.59832763671875,"y":1298.4100341796875,"id":"340","attributes":{"Eigenvector Centrality":"0.30301525489271036","Betweenness Centrality":"0.0013356812076157393","Appearances":"30","No":"21","Country":"Ghana","Club Country":"France","Club":"Rennes","Weighted Degree":"23.0","Modularity Class":"5","Date of birth / Age":"23 April 1987 (aged 27)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2984165651644336"},"color":"rgb(67,229,197)","size":11.333333015441895},{"label":"Lionel Messi (c)","x":-1133.2008056640625,"y":55.981807708740234,"id":"419","attributes":{"Eigenvector Centrality":"0.884141666517999","Betweenness Centrality":"0.004626645517321425","Appearances":"86","No":"10","Country":"Argentina","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"36.0","Modularity Class":"19","Date of birth / Age":"24 June 1987 (aged 26)","Degree":"36","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3273942093541203"},"color":"rgb(67,229,229)","size":28.66666603088379},{"label":"Mathieu Debuchy","x":14.882935523986816,"y":-313.2035827636719,"id":"472","attributes":{"Eigenvector Centrality":"0.5292224497836601","Betweenness Centrality":"0.0019647591823339743","Appearances":"21","No":"2","Country":"France","Club Country":"England","Club":"Newcastle United","Weighted Degree":"25.0","Modularity Class":"16","Date of birth / Age":"28 July 1985 (aged 28)","Degree":"25","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3315290933694181"},"color":"rgb(229,67,229)","size":14.0},{"label":"Blaise Matuidi","x":-108.93384552001953,"y":-90.56800842285156,"id":"87","attributes":{"Eigenvector Centrality":"0.6370473545952838","Betweenness Centrality":"0.001865102966313942","Appearances":"23","No":"14","Country":"France","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"29.0","Modularity Class":"16","Date of birth / Age":"9 April 1987 (aged 27)","Degree":"29","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(229,67,229)","size":19.333332061767578},{"label":"Lorenzo Insigne","x":-68.64961242675781,"y":680.9847412109375,"id":"422","attributes":{"Eigenvector Centrality":"0.6915881955717977","Betweenness Centrality":"0.008719166745740005","Appearances":"5","No":"22","Country":"Italy","Club Country":"Italy","Club":"Napoli","Weighted Degree":"33.0","Modularity Class":"3","Date of birth / Age":"4 June 1991 (aged 23)","Degree":"33","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3322784810126582"},"color":"rgb(197,229,67)","size":24.666667938232422},{"label":"Diego Calvo","x":2308.55810546875,"y":341.5826416015625,"id":"163","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"10","No":"20","Country":"Costa Rica","Club Country":"Norway","Club":"VÃ¥lerenga","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"25 March 1991 (aged 23)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Hiroshi Kiyotake","x":729.6253662109375,"y":516.7271728515625,"id":"282","attributes":{"Eigenvector Centrality":"0.34512034913799255","Betweenness Centrality":"0.003186055679065411","Appearances":"25","No":"8","Country":"Japan","Club Country":"Germany","Club":"1. FC Nürnberg","Weighted Degree":"24.0","Modularity Class":"27","Date of birth / Age":"12 November 1989 (aged 24)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3237885462555066"},"color":"rgb(67,100,229)","size":12.666666984558105},{"label":"Renato Ibarra","x":-1613.8062744140625,"y":-545.0514526367188,"id":"595","attributes":{"Eigenvector Centrality":"0.3742367393926188","Betweenness Centrality":"0.003419150984977221","Appearances":"18","No":"5","Country":"Ecuador","Club Country":"Netherlands","Club":"Vitesse","Weighted Degree":"23.0","Modularity Class":"4","Date of birth / Age":"20 January 1991 (aged 23)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3"},"color":"rgb(229,67,132)","size":11.333333015441895},{"label":"Miralem Pjanic","x":1103.220947265625,"y":-385.4655456542969,"id":"516","attributes":{"Eigenvector Centrality":"0.3489363879046361","Betweenness Centrality":"0.008708846173341396","Appearances":"48","No":"8","Country":"Bosnia and Herzegovina","Club Country":"Italy","Club":"Roma","Weighted Degree":"26.0","Modularity Class":"20","Date of birth / Age":"2 April 1990 (aged 24)","Degree":"26","Position":"MF","Eccentricity":"4.0","Closeness Centrality":"0.3385536619069553"},"color":"rgb(132,229,67)","size":15.333333969116211},{"label":"Charles Aránguiz","x":-251.59664916992188,"y":1476.45458984375,"id":"112","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"21","No":"20","Country":"Chile","Club Country":"Brazil","Club":"Internacional","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"17 April 1989 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"César Azpilicueta","x":-780.8587646484375,"y":-518.6594848632812,"id":"110","attributes":{"Eigenvector Centrality":"0.9333483233206638","Betweenness Centrality":"0.002581134642452991","Appearances":"6","No":"22","Country":"Spain","Club Country":"England","Club":"Chelsea","Weighted Degree":"32.0","Modularity Class":"23","Date of birth / Age":"28 August 1989 (aged 24)","Degree":"32","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.34186046511627904"},"color":"rgb(229,67,197)","size":23.33333396911621},{"label":"Rémy Cabella","x":-28.49822998046875,"y":-252.28802490234375,"id":"594","attributes":{"Eigenvector Centrality":"0.48363975992492747","Betweenness Centrality":"0.0","Appearances":"1","No":"7","Country":"France","Club Country":"France","Club":"Montpellier","Weighted Degree":"22.0","Modularity Class":"16","Date of birth / Age":"8 March 1990 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.3037190082644628"},"color":"rgb(229,67,229)","size":10.0},{"label":"Aleksei Ionov","x":-1428.007080078125,"y":-1427.2176513671875,"id":"24","attributes":{"Eigenvector Centrality":"0.2816622746350613","Betweenness Centrality":"6.368705012250895E-4","Appearances":"5","No":"21","Country":"Russia","Club Country":"Russia","Club":"Dynamo Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"18 February 1989 (aged 25)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.25538568450312715"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Vieirinha","x":-584.5398559570312,"y":300.7301940917969,"id":"703","attributes":{"Eigenvector Centrality":"0.5206064074642943","Betweenness Centrality":"0.0029301281450007945","Appearances":"9","No":"10","Country":"Portugal","Club Country":"Germany","Club":"VfL Wolfsburg","Weighted Degree":"28.0","Modularity Class":"8","Date of birth / Age":"24 January 1986 (aged 28)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.32565352237483386"},"color":"rgb(229,164,67)","size":18.0},{"label":"Joel Campbell","x":2111.1640625,"y":365.17755126953125,"id":"336","attributes":{"Eigenvector Centrality":"0.2789506377156212","Betweenness Centrality":"0.00832814736706791","Appearances":"33","No":"9","Country":"Costa Rica","Club Country":"Greece","Club":"Olympiacos","Weighted Degree":"26.0","Modularity Class":"29","Date of birth / Age":"26 June 1992 (aged 21)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2687385740402194"},"color":"rgb(229,229,67)","size":15.333333969116211},{"label":"Carlos Salcido","x":-2011.8602294921875,"y":347.6936340332031,"id":"104","attributes":{"Eigenvector Centrality":"0.2771264523867947","Betweenness Centrality":"0.0","Appearances":"122","No":"3","Country":"Mexico","Club Country":"Mexico","Club":"UANL","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"2 April 1980 (aged 34)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Mathew Ryan","x":2056.780517578125,"y":-519.5844116210938,"id":"471","attributes":{"Eigenvector Centrality":"0.2315995769978225","Betweenness Centrality":"0.0038336165219305914","Appearances":"7","No":"1","Country":"Australia","Club Country":"Belgium","Club":"Club Brugge","Weighted Degree":"23.0","Modularity Class":"12","Date of birth / Age":"8 April 1992 (aged 22)","Degree":"23","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.23535062439961577"},"color":"rgb(229,100,67)","size":11.333333015441895},{"label":"Samuel Inkoom","x":406.61175537109375,"y":1441.41943359375,"id":"628","attributes":{"Eigenvector Centrality":"0.29027436907278803","Betweenness Centrality":"0.0","Appearances":"46","No":"2","Country":"Ghana","Club Country":"Greece","Club":"Platanias","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"1 June 1989 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Granit Xhaka","x":60.45975875854492,"y":205.4804229736328,"id":"266","attributes":{"Eigenvector Centrality":"0.4016189697530195","Betweenness Centrality":"6.451424399991758E-4","Appearances":"26","No":"10","Country":"Switzerland","Club Country":"Germany","Club":"Borussia Mönchengladbach","Weighted Degree":"23.0","Modularity Class":"0","Date of birth / Age":"27 September 1992 (aged 21)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30222039473684215"},"color":"rgb(164,229,67)","size":11.333333015441895},{"label":"Carl Medjani","x":-1275.965087890625,"y":1205.1011962890625,"id":"97","attributes":{"Eigenvector Centrality":"0.30778242364802144","Betweenness Centrality":"0.002125132721118146","Appearances":"26","No":"12","Country":"Algeria","Club Country":"France","Club":"Valenciennes","Weighted Degree":"23.0","Modularity Class":"24","Date of birth / Age":"15 May 1985 (aged 29)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2980535279805353"},"color":"rgb(67,164,229)","size":11.333333015441895},{"label":"Ramon Azeez","x":-83.1539077758789,"y":-1703.900634765625,"id":"587","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"2","No":"15","Country":"Nigeria","Club Country":"Spain","Club":"AlmerÃa","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"12 December 1992 (aged 21)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Didier Zokora","x":526.2356567382812,"y":-881.0933227539062,"id":"161","attributes":{"Eigenvector Centrality":"0.30966117600400694","Betweenness Centrality":"0.0","Appearances":"119","No":"5","Country":"Ivory Coast","Club Country":"Turkey","Club":"Trabzonspor","Weighted Degree":"22.0","Modularity Class":"9","Date of birth / Age":"14 December 1980 (aged 33)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2929453965723396"},"color":"rgb(164,67,229)","size":10.0},{"label":"Yasuyuki Konno","x":772.3632202148438,"y":672.5744018554688,"id":"725","attributes":{"Eigenvector Centrality":"0.31718153777834784","Betweenness Centrality":"0.0","Appearances":"81","No":"15","Country":"Japan","Club Country":"Japan","Club":"Gamba Osaka","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"25 January 1983 (aged 31)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Phil Jagielka","x":-210.36138916015625,"y":-1046.0340576171875,"id":"575","attributes":{"Eigenvector Centrality":"0.5738583419916762","Betweenness Centrality":"0.0013664563333722465","Appearances":"26","No":"6","Country":"England","Club Country":"England","Club":"Everton","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"17 August 1982 (aged 31)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31183708103521424"},"color":"rgb(67,229,132)","size":14.0},{"label":"Michael Uchebo","x":-95.68781280517578,"y":-1656.3585205078125,"id":"505","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"4","No":"20","Country":"Nigeria","Club Country":"Belgium","Club":"Cercle Brugge","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"2 February 1990 (aged 24)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Andreas Samaris","x":1692.9754638671875,"y":475.92816162109375,"id":"47","attributes":{"Eigenvector Centrality":"0.2697590097502519","Betweenness Centrality":"0.0018881692306353887","Appearances":"4","No":"22","Country":"Greece","Club Country":"Greece","Club":"Olympiacos","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"13 June 1989 (aged 24)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2878965922444183"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Emmanuel Agyemang-Badu","x":311.23797607421875,"y":1367.975341796875,"id":"199","attributes":{"Eigenvector Centrality":"0.30228653977349984","Betweenness Centrality":"0.002131225990650736","Appearances":"49","No":"8","Country":"Ghana","Club Country":"Italy","Club":"Udinese","Weighted Degree":"23.0","Modularity Class":"5","Date of birth / Age":"2 December 1990 (aged 23)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.29708973322554566"},"color":"rgb(67,229,197)","size":11.333333015441895},{"label":"Michael Lang","x":29.4794864654541,"y":282.8443908691406,"id":"504","attributes":{"Eigenvector Centrality":"0.3846161602156529","Betweenness Centrality":"0.0","Appearances":"6","No":"6","Country":"Switzerland","Club Country":"Switzerland","Club":"Grasshopper","Weighted Degree":"22.0","Modularity Class":"0","Date of birth / Age":"8 February 1991 (aged 23)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2922465208747515"},"color":"rgb(164,229,67)","size":10.0},{"label":"Shuichi Gonda","x":757.8242797851562,"y":624.099853515625,"id":"650","attributes":{"Eigenvector Centrality":"0.31718153777834773","Betweenness Centrality":"0.0","Appearances":"2","No":"23","Country":"Japan","Club Country":"Japan","Club":"F.C. Tokyo","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"3 March 1989 (aged 25)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Celso Borges","x":2214.53955078125,"y":283.7978820800781,"id":"109","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"63","No":"5","Country":"Costa Rica","Club Country":"Sweden","Club":"AIK","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"27 May 1988 (aged 26)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Javi MartÃnez","x":-549.7433471679688,"y":-388.08502197265625,"id":"316","attributes":{"Eigenvector Centrality":"0.9931923382141185","Betweenness Centrality":"0.008269325861106165","Appearances":"17","No":"4","Country":"Spain","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"35.0","Modularity Class":"23","Date of birth / Age":"2 September 1988 (aged 25)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34653465346534656"},"color":"rgb(229,67,197)","size":27.33333396911621},{"label":"Sylvain Gbohouo","x":531.5452880859375,"y":-936.862060546875,"id":"671","attributes":{"Eigenvector Centrality":"0.30966117600400694","Betweenness Centrality":"0.0","Appearances":"2","No":"16","Country":"Ivory Coast","Club Country":"Ivory Coast","Club":"Séwé Sport","Weighted Degree":"22.0","Modularity Class":"9","Date of birth / Age":"29 October 1988 (aged 25)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2929453965723396"},"color":"rgb(164,67,229)","size":10.0},{"label":"Sead KolaÅ¡inac","x":1107.5244140625,"y":-303.2990417480469,"id":"633","attributes":{"Eigenvector Centrality":"0.3859570622009839","Betweenness Centrality":"0.013926412977704486","Appearances":"4","No":"5","Country":"Bosnia and Herzegovina","Club Country":"Germany","Club":"Schalke \u002704","Weighted Degree":"28.0","Modularity Class":"20","Date of birth / Age":"20 June 1993 (aged 20)","Degree":"28","Position":"DF","Eccentricity":"4.0","Closeness Centrality":"0.34090909090909094"},"color":"rgb(132,229,67)","size":18.0},{"label":"Vangelis Moras","x":1602.7227783203125,"y":488.2573547363281,"id":"694","attributes":{"Eigenvector Centrality":"0.25813336963416805","Betweenness Centrality":"0.0","Appearances":"19","No":"5","Country":"Greece","Club Country":"Italy","Club":"Verona","Weighted Degree":"22.0","Modularity Class":"15","Date of birth / Age":"26 August 1981 (aged 32)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2760045061960195"},"color":"rgb(229,67,100)","size":10.0},{"label":"Mesut Özil","x":266.2100524902344,"y":-466.7005310058594,"id":"498","attributes":{"Eigenvector Centrality":"0.6437896004097903","Betweenness Centrality":"0.002673471053911242","Appearances":"55","No":"8","Country":"Germany","Club Country":"England","Club":"Arsenal","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"15 October 1988 (aged 25)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3219448094612352"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Daniel Cambronero","x":2228.9765625,"y":327.57440185546875,"id":"136","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"4","No":"23","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Herediano","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"8 January 1986 (aged 28)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Alberto Aquilani","x":51.16946029663086,"y":883.6702880859375,"id":"19","attributes":{"Eigenvector Centrality":"0.446913802610424","Betweenness Centrality":"0.00214616718692594","Appearances":"35","No":"14","Country":"Italy","Club Country":"Italy","Club":"Fiorentina","Weighted Degree":"24.0","Modularity Class":"3","Date of birth / Age":"7 July 1984 (aged 29)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.310126582278481"},"color":"rgb(197,229,67)","size":12.666666984558105},{"label":"Matthew Å piranovic","x":2061.166748046875,"y":-656.2603149414062,"id":"479","attributes":{"Eigenvector Centrality":"0.2213229433005502","Betweenness Centrality":"0.0","Appearances":"18","No":"6","Country":"Australia","Club Country":"Australia","Club":"Western Sydney Wanderers","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"27 June 1988 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Thomas Müller","x":396.2323913574219,"y":-434.3363952636719,"id":"678","attributes":{"Eigenvector Centrality":"0.6585766805388439","Betweenness Centrality":"0.0026429368589338613","Appearances":"49","No":"13","Country":"Germany","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"13 September 1989 (aged 24)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3390221402214022"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Riyad Mahrez","x":-1375.4896240234375,"y":1263.62109375,"id":"605","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"2","No":"21","Country":"Algeria","Club Country":"England","Club":"Leicester City","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"21 February 1991 (aged 23)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Alireza Jahanbakhsh","x":1942.0732421875,"y":1034.900146484375,"id":"36","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"7","No":"9","Country":"Iran","Club Country":"Netherlands","Club":"NEC","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"11 August 1993 (aged 20)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Hotaru Yamaguchi","x":665.15576171875,"y":571.1557006835938,"id":"285","attributes":{"Eigenvector Centrality":"0.33192039229134085","Betweenness Centrality":"0.0010231003820519223","Appearances":"12","No":"16","Country":"Japan","Club Country":"Japan","Club":"Cerezo Osaka","Weighted Degree":"23.0","Modularity Class":"27","Date of birth / Age":"6 October 1990 (aged 23)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3190104166666667"},"color":"rgb(67,100,229)","size":11.333333015441895},{"label":"Hugo Campagnaro","x":-1030.6343994140625,"y":363.070556640625,"id":"287","attributes":{"Eigenvector Centrality":"0.5658107599692684","Betweenness Centrality":"0.0025393109943757006","Appearances":"15","No":"3","Country":"Argentina","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"27.0","Modularity Class":"19","Date of birth / Age":"27 June 1980 (aged 33)","Degree":"27","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3272484416740873"},"color":"rgb(67,229,229)","size":16.666667938232422},{"label":"Diego GodÃn","x":-229.68458557128906,"y":-28.488847732543945,"id":"166","attributes":{"Eigenvector Centrality":"0.5243629945948549","Betweenness Centrality":"0.0015151368839237088","Appearances":"77","No":"3","Country":"Uruguay","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"28.0","Modularity Class":"6","Date of birth / Age":"16 February 1986 (aged 28)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3236459709379128"},"color":"rgb(229,197,67)","size":18.0},{"label":"Roman Bürki","x":84.80470275878906,"y":279.10205078125,"id":"610","attributes":{"Eigenvector Centrality":"0.3846161602156529","Betweenness Centrality":"0.0","Appearances":"0","No":"21","Country":"Switzerland","Club Country":"Switzerland","Club":"Grasshopper","Weighted Degree":"22.0","Modularity Class":"0","Date of birth / Age":"14 November 1990 (aged 23)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2922465208747515"},"color":"rgb(164,229,67)","size":10.0},{"label":"Didier Drogba (c)","x":598.4851684570312,"y":-735.1734008789062,"id":"159","attributes":{"Eigenvector Centrality":"0.3683202285259076","Betweenness Centrality":"0.006250022365764094","Appearances":"101","No":"11","Country":"Ivory Coast","Club Country":"Turkey","Club":"Galatasaray","Weighted Degree":"26.0","Modularity Class":"9","Date of birth / Age":"11 March 1978 (aged 36)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3276861346411057"},"color":"rgb(164,67,229)","size":15.333333969116211},{"label":"Sejad Salihovic","x":1178.591064453125,"y":-598.7509765625,"id":"635","attributes":{"Eigenvector Centrality":"0.29529844322499244","Betweenness Centrality":"0.0028150615386489113","Appearances":"42","No":"23","Country":"Bosnia and Herzegovina","Club Country":"Germany","Club":"1899 Hoffenheim","Weighted Degree":"23.0","Modularity Class":"20","Date of birth / Age":"8 October 1984 (aged 29)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31518010291595194"},"color":"rgb(132,229,67)","size":11.333333015441895},{"label":"Christian Bolaños","x":2234.70166015625,"y":376.90460205078125,"id":"119","attributes":{"Eigenvector Centrality":"0.23496944760866384","Betweenness Centrality":"0.0","Appearances":"55","No":"7","Country":"Costa Rica","Club Country":"Denmark","Club":"Copenhagen","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"17 May 1984 (aged 30)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Carlos Peña","x":-2037.2489013671875,"y":386.7759704589844,"id":"103","attributes":{"Eigenvector Centrality":"0.2771264523867947","Betweenness Centrality":"0.0","Appearances":"16","No":"21","Country":"Mexico","Club Country":"Mexico","Club":"León","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"29 March 1990 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Izet Hajrovic","x":1073.4324951171875,"y":-468.6595458984375,"id":"302","attributes":{"Eigenvector Centrality":"0.3433334744187318","Betweenness Centrality":"0.0069532743678391755","Appearances":"7","No":"20","Country":"Bosnia and Herzegovina","Club Country":"Turkey","Club":"Galatasaray","Weighted Degree":"26.0","Modularity Class":"20","Date of birth / Age":"4 August 1991 (aged 22)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3359232175502742"},"color":"rgb(132,229,67)","size":15.333333969116211},{"label":"Joël Veltman","x":921.6832885742188,"y":59.57893753051758,"id":"338","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"2","No":"13","Country":"Netherlands","Club Country":"Netherlands","Club":"Ajax","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"15 January 1992 (aged 22)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"David Silva","x":-782.8482666015625,"y":-359.30230712890625,"id":"154","attributes":{"Eigenvector Centrality":"0.8845575771108349","Betweenness Centrality":"0.006629652754318272","Appearances":"80","No":"21","Country":"Spain","Club Country":"England","Club":"Manchester City","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"8 January 1986 (aged 28)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3407510431154381"},"color":"rgb(229,67,197)","size":22.0},{"label":"Manuel Neuer","x":362.2953186035156,"y":-299.9522399902344,"id":"442","attributes":{"Eigenvector Centrality":"0.6585766805388434","Betweenness Centrality":"0.0026429368589338613","Appearances":"45","No":"1","Country":"Germany","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"27 March 1986 (aged 28)","Degree":"29","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3390221402214022"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Kim Bo-kyung","x":1094.657470703125,"y":1613.0086669921875,"id":"391","attributes":{"Eigenvector Centrality":"0.24403600463458192","Betweenness Centrality":"0.006087158361550197","Appearances":"28","No":"7","Country":"South Korea","Club Country":"Wales","Club":"Cardiff City","Weighted Degree":"23.0","Modularity Class":"10","Date of birth / Age":"6 October 1989 (aged 24)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.26785714285714285"},"color":"rgb(229,67,164)","size":11.333333015441895},{"label":"Eugene Galekovic","x":2152.16015625,"y":-634.9464721679688,"id":"208","attributes":{"Eigenvector Centrality":"0.22132294330055013","Betweenness Centrality":"0.0","Appearances":"8","No":"18","Country":"Australia","Club Country":"Australia","Club":"Adelaide United","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"12 June 1981 (aged 33)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Emmanuel Emenike","x":-64.24840545654297,"y":-1362.014404296875,"id":"200","attributes":{"Eigenvector Centrality":"0.36794115334947153","Betweenness Centrality":"0.005599744925127154","Appearances":"23","No":"9","Country":"Nigeria","Club Country":"Turkey","Club":"Fenerbahçe","Weighted Degree":"26.0","Modularity Class":"14","Date of birth / Age":"10 May 1987 (aged 27)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3168103448275862"},"color":"rgb(67,229,100)","size":15.333333969116211},{"label":"Wesley Sneijder","x":805.6671752929688,"y":-40.13237762451172,"id":"714","attributes":{"Eigenvector Centrality":"0.39319035954961806","Betweenness Centrality":"0.006544290321462833","Appearances":"99","No":"10","Country":"Netherlands","Club Country":"Turkey","Club":"Galatasaray","Weighted Degree":"26.0","Modularity Class":"22","Date of birth / Age":"9 June 1984 (aged 30)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.337620578778135"},"color":"rgb(197,67,229)","size":15.333333969116211},{"label":"Walter AyovÃ","x":-1792.04833984375,"y":-657.5009155273438,"id":"710","attributes":{"Eigenvector Centrality":"0.36230621820682135","Betweenness Centrality":"0.0","Appearances":"90","No":"10","Country":"Ecuador","Club Country":"Mexico","Club":"Pachuca","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"11 August 1979 (aged 34)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Valentin Stocker","x":93.9429931640625,"y":165.77862548828125,"id":"692","attributes":{"Eigenvector Centrality":"0.4279165187640592","Betweenness Centrality":"0.0017015426628181239","Appearances":"24","No":"14","Country":"Switzerland","Club Country":"Switzerland","Club":"Basel","Weighted Degree":"25.0","Modularity Class":"0","Date of birth / Age":"12 April 1989 (aged 25)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31038851351351354"},"color":"rgb(164,229,67)","size":14.0},{"label":"David Villa","x":-854.8253784179688,"y":-313.9442443847656,"id":"155","attributes":{"Eigenvector Centrality":"0.7852248920099724","Betweenness Centrality":"7.220203040676876E-4","Appearances":"96","No":"7","Country":"Spain","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"27.0","Modularity Class":"23","Date of birth / Age":"3 December 1981 (aged 32)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3215223097112861"},"color":"rgb(229,67,197)","size":16.666667938232422},{"label":"Sergio Agüero","x":-986.2796630859375,"y":70.57652282714844,"id":"642","attributes":{"Eigenvector Centrality":"0.6398902783818313","Betweenness Centrality":"0.003598075368399343","Appearances":"51","No":"20","Country":"Argentina","Club Country":"England","Club":"Manchester City","Weighted Degree":"29.0","Modularity Class":"19","Date of birth / Age":"2 June 1988 (aged 26)","Degree":"29","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3316787003610108"},"color":"rgb(67,229,229)","size":19.333332061767578},{"label":"Kim Young-gwon","x":1284.3221435546875,"y":1556.894775390625,"id":"395","attributes":{"Eigenvector Centrality":"0.23152559498868786","Betweenness Centrality":"0.0","Appearances":"21","No":"5","Country":"South Korea","Club Country":"China","Club":"Guangzhou Evergrande","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"27 February 1990 (aged 24)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Adrián Bone","x":-1657.1593017578125,"y":-645.242919921875,"id":"9","attributes":{"Eigenvector Centrality":"0.36230621820682135","Betweenness Centrality":"0.0","Appearances":"3","No":"12","Country":"Ecuador","Club Country":"Ecuador","Club":"El Nacional","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"8 September 1988 (aged 25)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Benoît Assou-Ekotto","x":484.17120361328125,"y":273.5126953125,"id":"84","attributes":{"Eigenvector Centrality":"0.3330106718881068","Betweenness Centrality":"0.0036584595528713027","Appearances":"22","No":"2","Country":"Cameroon","Club Country":"England","Club":"Queens Park Rangers","Weighted Degree":"23.0","Modularity Class":"17","Date of birth / Age":"24 March 1984 (aged 30)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3190104166666667"},"color":"rgb(67,132,229)","size":11.333333015441895},{"label":"Efe Ambrose","x":91.53675842285156,"y":-1502.422119140625,"id":"190","attributes":{"Eigenvector Centrality":"0.3486435360657821","Betweenness Centrality":"0.008270857775066283","Appearances":"37","No":"5","Country":"Nigeria","Club Country":"Scotland","Club":"Celtic","Weighted Degree":"25.0","Modularity Class":"14","Date of birth / Age":"18 October 1988 (aged 25)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31518010291595194"},"color":"rgb(67,229,100)","size":14.0},{"label":"Oliver Bozanic","x":2198.375732421875,"y":-627.1802368164062,"id":"541","attributes":{"Eigenvector Centrality":"0.22132294330055013","Betweenness Centrality":"0.0","Appearances":"3","No":"13","Country":"Australia","Club Country":"Switzerland","Club":"Luzern","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"8 January 1989 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Eduardo Vargas","x":-348.89111328125,"y":1339.4359130859375,"id":"189","attributes":{"Eigenvector Centrality":"0.3789565490107093","Betweenness Centrality":"0.006733824897676562","Appearances":"30","No":"11","Country":"Chile","Club Country":"Spain","Club":"Valencia","Weighted Degree":"26.0","Modularity Class":"18","Date of birth / Age":"20 November 1989 (aged 24)","Degree":"26","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.30359355638166047"},"color":"rgb(229,132,67)","size":15.333333969116211},{"label":"Azubuike Egwuekwe","x":-40.1948127746582,"y":-1612.722900390625,"id":"75","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"31","No":"6","Country":"Nigeria","Club Country":"Nigeria","Club":"Warri Wolves","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"16 July 1989 (aged 24)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Giannis Maniatis","x":1675.661376953125,"y":562.7532958984375,"id":"251","attributes":{"Eigenvector Centrality":"0.269759009750252","Betweenness Centrality":"0.0018881692306353887","Appearances":"30","No":"2","Country":"Greece","Club Country":"Greece","Club":"Olympiacos","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"12 October 1986 (aged 27)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2878965922444183"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"VÃctor Bernárdez","x":1542.3271484375,"y":-1230.5048828125,"id":"700","attributes":{"Eigenvector Centrality":"0.24794367045748958","Betweenness Centrality":"0.0014579941476906906","Appearances":"78","No":"5","Country":"Honduras","Club Country":"United States","Club":"San Jose Earthquakes","Weighted Degree":"23.0","Modularity Class":"7","Date of birth / Age":"24 May 1982 (aged 32)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2750748502994012"},"color":"rgb(100,67,229)","size":11.333333015441895},{"label":"Asmir Avdukic","x":1126.556396484375,"y":-529.686279296875,"id":"67","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"3","No":"22","Country":"Bosnia and Herzegovina","Club Country":"Bosnia and Herzegovina","Club":"Borac Banja Luka","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"13 May 1981 (aged 33)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Avdija VrÅ¡ajevic","x":1155.9981689453125,"y":-446.0126647949219,"id":"73","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"13","No":"2","Country":"Bosnia and Herzegovina","Club Country":"Croatia","Club":"Hajduk Split","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"6 March 1986 (aged 28)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Carlos Sánchez","x":-775.6780395507812,"y":1232.408935546875,"id":"105","attributes":{"Eigenvector Centrality":"0.31394925107891597","Betweenness Centrality":"0.0","Appearances":"44","No":"6","Country":"Colombia","Club Country":"Spain","Club":"Elche","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"6 February 1986 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"Diego Reyes","x":-1751.081298828125,"y":432.3384704589844,"id":"169","attributes":{"Eigenvector Centrality":"0.41168852553130064","Betweenness Centrality":"0.009305549137125925","Appearances":"14","No":"5","Country":"Mexico","Club Country":"Portugal","Club":"Porto","Weighted Degree":"29.0","Modularity Class":"21","Date of birth / Age":"19 September 1992 (aged 21)","Degree":"29","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3128991060025543"},"color":"rgb(67,229,67)","size":19.333332061767578},{"label":"Serge Aurier","x":471.92193603515625,"y":-746.9190673828125,"id":"639","attributes":{"Eigenvector Centrality":"0.3226876976851504","Betweenness Centrality":"0.002014868000803819","Appearances":"8","No":"17","Country":"Ivory Coast","Club Country":"France","Club":"Toulouse","Weighted Degree":"23.0","Modularity Class":"9","Date of birth / Age":"24 December 1992 (aged 21)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30817610062893086"},"color":"rgb(164,67,229)","size":11.333333015441895},{"label":"Juan Fernando Quintero","x":-908.9094848632812,"y":1006.1945190429688,"id":"369","attributes":{"Eigenvector Centrality":"0.446466126398784","Betweenness Centrality":"0.007655587436909223","Appearances":"4","No":"20","Country":"Colombia","Club Country":"Portugal","Club":"Porto","Weighted Degree":"29.0","Modularity Class":"11","Date of birth / Age":"18 January 1993 (aged 21)","Degree":"29","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3315290933694181"},"color":"rgb(67,67,229)","size":19.333332061767578},{"label":"Vasili Berezutski (c)","x":-1323.1439208984375,"y":-1494.270751953125,"id":"695","attributes":{"Eigenvector Centrality":"0.2797530450294211","Betweenness Centrality":"8.329697214751982E-4","Appearances":"78","No":"14","Country":"Russia","Club Country":"Russia","Club":"CSKA Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"20 June 1982 (aged 31)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.2544132917964694"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Patrick Pemberton","x":2230.439208984375,"y":179.53189086914062,"id":"563","attributes":{"Eigenvector Centrality":"0.24571486118323413","Betweenness Centrality":"0.003463283566079935","Appearances":"21","No":"18","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Alajuelense","Weighted Degree":"23.0","Modularity Class":"29","Date of birth / Age":"24 April 1982 (aged 32)","Degree":"23","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.26601520086862107"},"color":"rgb(229,229,67)","size":11.333333015441895},{"label":"Alessio Cerci","x":276.6270751953125,"y":826.5160522460938,"id":"26","attributes":{"Eigenvector Centrality":"0.4319605441926736","Betweenness Centrality":"0.0018820457212751422","Appearances":"12","No":"11","Country":"Italy","Club Country":"Italy","Club":"Torino","Weighted Degree":"23.0","Modularity Class":"3","Date of birth / Age":"23 July 1987 (aged 26)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30497925311203317"},"color":"rgb(197,229,67)","size":11.333333015441895},{"label":"Hulk","x":-676.1294555664062,"y":-547.0525512695312,"id":"289","attributes":{"Eigenvector Centrality":"0.6585476210563139","Betweenness Centrality":"0.00902132999561875","Appearances":"35","No":"7","Country":"Brazil","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"29.0","Modularity Class":"23","Date of birth / Age":"25 July 1986 (aged 27)","Degree":"29","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.33018867924528306"},"color":"rgb(229,67,197)","size":19.333332061767578},{"label":"Juan Carlos GarcÃa","x":1576.5137939453125,"y":-1044.39697265625,"id":"367","attributes":{"Eigenvector Centrality":"0.2495870836760396","Betweenness Centrality":"0.00224748146417088","Appearances":"34","No":"6","Country":"Honduras","Club Country":"England","Club":"Wigan Athletic","Weighted Degree":"23.0","Modularity Class":"7","Date of birth / Age":"8 March 1988 (aged 26)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,67,229)","size":11.333333015441895},{"label":"Miguel Layún","x":-2150.14892578125,"y":351.6337890625,"id":"510","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"15","No":"7","Country":"Mexico","Club Country":"Mexico","Club":"América","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"25 June 1988 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Kwak Tae-hwi","x":1276.581298828125,"y":1652.844970703125,"id":"405","attributes":{"Eigenvector Centrality":"0.23152559498868777","Betweenness Centrality":"0.0","Appearances":"35","No":"4","Country":"South Korea","Club Country":"Saudi Arabia","Club":"Al-Hilal","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"8 July 1981 (aged 32)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Graham Zusi","x":821.1793823242188,"y":-1568.8907470703125,"id":"265","attributes":{"Eigenvector Centrality":"0.2718151842935107","Betweenness Centrality":"0.0","Appearances":"23","No":"19","Country":"United States","Club Country":"United States","Club":"Sporting Kansas City","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"18 August 1986 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Gastón RamÃrez","x":-52.539005279541016,"y":-56.3730354309082,"id":"240","attributes":{"Eigenvector Centrality":"0.49007679600185783","Betweenness Centrality":"0.004586755672605624","Appearances":"29","No":"18","Country":"Uruguay","Club Country":"England","Club":"Southampton","Weighted Degree":"28.0","Modularity Class":"6","Date of birth / Age":"2 December 1990 (aged 23)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3339391185824625"},"color":"rgb(229,197,67)","size":18.0},{"label":"Gerard Piqué","x":-1126.433837890625,"y":-326.654052734375,"id":"245","attributes":{"Eigenvector Centrality":"0.9370904429273632","Betweenness Centrality":"0.0017384725186443504","Appearances":"60","No":"3","Country":"Spain","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"2 February 1987 (aged 27)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(229,67,197)","size":22.0},{"label":"Bailey Wright","x":2074.923095703125,"y":-613.9719848632812,"id":"77","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"0","No":"8","Country":"Australia","Club Country":"England","Club":"Preston North End","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"28 July 1992 (aged 21)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Toni Å unjic","x":1221.8553466796875,"y":-554.8410034179688,"id":"688","attributes":{"Eigenvector Centrality":"0.28396954172011374","Betweenness Centrality":"0.0","Appearances":"8","No":"15","Country":"Bosnia and Herzegovina","Club Country":"Ukraine","Club":"Zorya Luhansk","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"15 December 1988 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Sergio Romero","x":-1110.6038818359375,"y":391.8827819824219,"id":"645","attributes":{"Eigenvector Centrality":"0.52052076818968","Betweenness Centrality":"0.00163007937425408","Appearances":"47","No":"1","Country":"Argentina","Club Country":"France","Club":"AS Monaco","Weighted Degree":"25.0","Modularity Class":"19","Date of birth / Age":"22 February 1987 (aged 27)","Degree":"25","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3168103448275862"},"color":"rgb(67,229,229)","size":14.0},{"label":"David Luiz","x":-401.1297607421875,"y":-483.5873107910156,"id":"151","attributes":{"Eigenvector Centrality":"0.7525362816963485","Betweenness Centrality":"0.002196566654268722","Appearances":"36","No":"4","Country":"Brazil","Club Country":"England","Club":"Chelsea","Weighted Degree":"30.0","Modularity Class":"23","Date of birth / Age":"22 April 1987 (aged 27)","Degree":"30","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3471894189891356"},"color":"rgb(229,67,197)","size":20.666667938232422},{"label":"Sulley Muntari","x":435.7590026855469,"y":1263.3812255859375,"id":"670","attributes":{"Eigenvector Centrality":"0.39414902919139266","Betweenness Centrality":"0.004358888803155806","Appearances":"82","No":"11","Country":"Ghana","Club Country":"Italy","Club":"Milan","Weighted Degree":"28.0","Modularity Class":"5","Date of birth / Age":"27 August 1984 (aged 29)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31223449447748514"},"color":"rgb(67,229,197)","size":18.0},{"label":"Yoshito Okubo","x":717.3280639648438,"y":699.9623413085938,"id":"730","attributes":{"Eigenvector Centrality":"0.31718153777834784","Betweenness Centrality":"0.0","Appearances":"57","No":"13","Country":"Japan","Club Country":"Japan","Club":"Kawasaki Frontale","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"9 June 1982 (aged 32)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Francisco Javier RodrÃguez","x":-2058.64453125,"y":342.1274719238281,"id":"229","attributes":{"Eigenvector Centrality":"0.2771264523867947","Betweenness Centrality":"0.0","Appearances":"95","No":"2","Country":"Mexico","Club Country":"Mexico","Club":"América","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"20 October 1981 (aged 32)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Tim Howard","x":597.1010131835938,"y":-1458.6304931640625,"id":"681","attributes":{"Eigenvector Centrality":"0.37125489722394445","Betweenness Centrality":"0.007200099994456211","Appearances":"100","No":"1","Country":"United States","Club Country":"England","Club":"Everton","Weighted Degree":"27.0","Modularity Class":"26","Date of birth / Age":"6 March 1979 (aged 35)","Degree":"27","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.30359355638166047"},"color":"rgb(100,229,67)","size":16.666667938232422},{"label":"Kim Chang-soo","x":1182.64794921875,"y":1681.892333984375,"id":"392","attributes":{"Eigenvector Centrality":"0.23152559498868777","Betweenness Centrality":"0.0","Appearances":"9","No":"2","Country":"South Korea","Club Country":"Japan","Club":"Kashiwa Reysol","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"12 September 1985 (aged 28)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Igor Akinfeev","x":-1278.8709716796875,"y":-1521.6795654296875,"id":"292","attributes":{"Eigenvector Centrality":"0.27975304502942094","Betweenness Centrality":"8.329697214751982E-4","Appearances":"68","No":"1","Country":"Russia","Club Country":"Russia","Club":"CSKA Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"8 April 1986 (aged 28)","Degree":"23","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.2544132917964694"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Anel Hadžic","x":1149.517822265625,"y":-490.4151306152344,"id":"53","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"2","No":"21","Country":"Bosnia and Herzegovina","Club Country":"Austria","Club":"Sturm Graz","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"16 August 1989 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Jordi Alba","x":-1139.678955078125,"y":-237.86505126953125,"id":"349","attributes":{"Eigenvector Centrality":"0.9370904429273634","Betweenness Centrality":"0.0017384725186443504","Appearances":"26","No":"18","Country":"Spain","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"21 March 1989 (aged 25)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33777573529411764"},"color":"rgb(229,67,197)","size":22.0},{"label":"Teófilo Gutiérrez","x":-811.0554809570312,"y":1271.3983154296875,"id":"672","attributes":{"Eigenvector Centrality":"0.31394925107891597","Betweenness Centrality":"0.0","Appearances":"30","No":"9","Country":"Colombia","Club Country":"Argentina","Club":"River Plate","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"17 May 1985 (aged 29)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"Daniel Davari","x":1905.60986328125,"y":955.88916015625,"id":"137","attributes":{"Eigenvector Centrality":"0.22438444470902533","Betweenness Centrality":"0.034852343427392886","Appearances":"4","No":"22","Country":"Iran","Club Country":"Germany","Club":"Eintracht Braunschweig","Weighted Degree":"23.0","Modularity Class":"1","Date of birth / Age":"6 January 1988 (aged 26)","Degree":"23","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.24739145069000334"},"color":"rgb(67,197,229)","size":11.333333015441895},{"label":"Serey Die","x":467.3825988769531,"y":-653.703857421875,"id":"638","attributes":{"Eigenvector Centrality":"0.37146876286160685","Betweenness Centrality":"0.004611725554141086","Appearances":"7","No":"20","Country":"Ivory Coast","Club Country":"Switzerland","Club":"Basel","Weighted Degree":"26.0","Modularity Class":"9","Date of birth / Age":"7 November 1984 (aged 29)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(164,67,229)","size":15.333333969116211},{"label":"Yun Suk-young","x":1131.668212890625,"y":1494.437255859375,"id":"731","attributes":{"Eigenvector Centrality":"0.2442236139118131","Betweenness Centrality":"0.002477907299557519","Appearances":"4","No":"3","Country":"South Korea","Club Country":"England","Club":"Queens Park Rangers","Weighted Degree":"23.0","Modularity Class":"10","Date of birth / Age":"13 February 1990 (aged 24)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.27242401779095626"},"color":"rgb(229,67,164)","size":11.333333015441895},{"label":"Wilson Palacios","x":1475.9537353515625,"y":-1233.8828125,"id":"718","attributes":{"Eigenvector Centrality":"0.2749352578108993","Betweenness Centrality":"0.008565859408081519","Appearances":"95","No":"8","Country":"Honduras","Club Country":"England","Club":"Stoke City","Weighted Degree":"25.0","Modularity Class":"7","Date of birth / Age":"29 July 1984 (aged 29)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.29672991522002423"},"color":"rgb(100,67,229)","size":14.0},{"label":"Steven Beitashour","x":1978.978515625,"y":1007.80078125,"id":"666","attributes":{"Eigenvector Centrality":"0.21274429344229642","Betweenness Centrality":"0.0","Appearances":"6","No":"20","Country":"Iran","Club Country":"Canada","Club":"Vancouver Whitecaps FC","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"1 February 1987 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Nicolas Lombaerts","x":-803.9263916015625,"y":-951.1397705078125,"id":"532","attributes":{"Eigenvector Centrality":"0.6174086302888655","Betweenness Centrality":"0.006770928561410678","Appearances":"25","No":"18","Country":"Belgium","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"28.0","Modularity Class":"28","Date of birth / Age":"20 March 1985 (aged 29)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3343949044585987"},"color":"rgb(67,229,132)","size":18.0},{"label":"Victor","x":-504.1156921386719,"y":-310.5911865234375,"id":"699","attributes":{"Eigenvector Centrality":"0.5425650576268322","Betweenness Centrality":"0.0","Appearances":"6","No":"22","Country":"Brazil","Club Country":"Brazil","Club":"Atlético Mineiro","Weighted Degree":"22.0","Modularity Class":"23","Date of birth / Age":"21 January 1983 (aged 31)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3158573270305114"},"color":"rgb(229,67,197)","size":10.0},{"label":"Mikkel Diskerud","x":941.4994506835938,"y":-1436.3448486328125,"id":"513","attributes":{"Eigenvector Centrality":"0.2821282119717931","Betweenness Centrality":"0.00491295354819868","Appearances":"20","No":"10","Country":"United States","Club Country":"Norway","Club":"Rosenborg","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"2 October 1990 (aged 23)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28857479387514723"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"Dante","x":-212.989501953125,"y":-416.6596374511719,"id":"145","attributes":{"Eigenvector Centrality":"0.856259545753813","Betweenness Centrality":"0.008027278474858441","Appearances":"12","No":"13","Country":"Brazil","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"35.0","Modularity Class":"23","Date of birth / Age":"18 October 1983 (aged 30)","Degree":"35","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3510028653295129"},"color":"rgb(229,67,197)","size":27.33333396911621},{"label":"Emir Spahic (c)","x":1039.750244140625,"y":-336.38665771484375,"id":"198","attributes":{"Eigenvector Centrality":"0.30657356383479545","Betweenness Centrality":"0.01353674285470377","Appearances":"74","No":"4","Country":"Bosnia and Herzegovina","Club Country":"Germany","Club":"Bayer Leverkusen","Weighted Degree":"24.0","Modularity Class":"20","Date of birth / Age":"18 August 1980 (aged 33)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3225098727512067"},"color":"rgb(132,229,67)","size":12.666666984558105},{"label":"Tim Krul","x":749.574951171875,"y":-122.82310485839844,"id":"682","attributes":{"Eigenvector Centrality":"0.42046095610267226","Betweenness Centrality":"0.005581921144737077","Appearances":"5","No":"23","Country":"Netherlands","Club Country":"England","Club":"Newcastle United","Weighted Degree":"27.0","Modularity Class":"22","Date of birth / Age":"3 April 1988 (aged 26)","Degree":"27","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3313796212804328"},"color":"rgb(197,67,229)","size":16.666667938232422},{"label":"Edder Delgado","x":1622.098388671875,"y":-1283.4814453125,"id":"178","attributes":{"Eigenvector Centrality":"0.23664887946331803","Betweenness Centrality":"0.0","Appearances":"26","No":"12","Country":"Honduras","Club Country":"Honduras","Club":"Real España","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"20 November 1986 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Chris Wondolowski","x":915.552978515625,"y":-1512.6751708984375,"id":"117","attributes":{"Eigenvector Centrality":"0.282163463180194","Betweenness Centrality":"0.0017638995236230008","Appearances":"21","No":"18","Country":"United States","Club Country":"United States","Club":"San Jose Earthquakes","Weighted Degree":"23.0","Modularity Class":"26","Date of birth / Age":"28 January 1983 (aged 31)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2877838684416601"},"color":"rgb(100,229,67)","size":11.333333015441895},{"label":"Memphis Depay","x":929.3518676757812,"y":119.25907897949219,"id":"496","attributes":{"Eigenvector Centrality":"0.36016990192205894","Betweenness Centrality":"0.005645297467686556","Appearances":"6","No":"21","Country":"Netherlands","Club Country":"Netherlands","Club":"PSV","Weighted Degree":"24.0","Modularity Class":"22","Date of birth / Age":"13 February 1994 (aged 20)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3273942093541203"},"color":"rgb(197,67,229)","size":12.666666984558105},{"label":"Jérôme Boateng","x":313.90338134765625,"y":-414.4244689941406,"id":"327","attributes":{"Eigenvector Centrality":"0.6585766805388437","Betweenness Centrality":"0.0026429368589338613","Appearances":"39","No":"20","Country":"Germany","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"3 September 1988 (aged 25)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3390221402214022"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Nani","x":-646.500244140625,"y":40.37836456298828,"id":"528","attributes":{"Eigenvector Centrality":"0.7654159805026451","Betweenness Centrality":"0.010494679938814755","Appearances":"75","No":"17","Country":"Portugal","Club Country":"England","Club":"Manchester United","Weighted Degree":"35.0","Modularity Class":"8","Date of birth / Age":"17 November 1986 (aged 27)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34702549575070823"},"color":"rgb(229,164,67)","size":27.33333396911621},{"label":"Michael Barrantes","x":2300.956298828125,"y":256.1389465332031,"id":"501","attributes":{"Eigenvector Centrality":"0.23496944760866373","Betweenness Centrality":"0.0","Appearances":"50","No":"11","Country":"Costa Rica","Club Country":"Norway","Club":"Aalesund","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"4 October 1983 (aged 30)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Gelson Fernandes","x":151.718017578125,"y":158.9506072998047,"id":"241","attributes":{"Eigenvector Centrality":"0.41564407300864686","Betweenness Centrality":"0.0029131326818128433","Appearances":"47","No":"16","Country":"Switzerland","Club Country":"Germany","Club":"SC Freiburg","Weighted Degree":"24.0","Modularity Class":"0","Date of birth / Age":"2 September 1986 (aged 27)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3150450064294899"},"color":"rgb(164,229,67)","size":12.666666984558105},{"label":"Oscar","x":-364.28692626953125,"y":-412.46795654296875,"id":"547","attributes":{"Eigenvector Centrality":"0.7525362816963487","Betweenness Centrality":"0.002196566654268722","Appearances":"31","No":"11","Country":"Brazil","Club Country":"England","Club":"Chelsea","Weighted Degree":"30.0","Modularity Class":"23","Date of birth / Age":"9 September 1991 (aged 22)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3471894189891356"},"color":"rgb(229,67,197)","size":20.666667938232422},{"label":"El Arbi Hillel Soudani","x":-1331.9407958984375,"y":1124.369873046875,"id":"195","attributes":{"Eigenvector Centrality":"0.3092624835205678","Betweenness Centrality":"0.0011823348492373815","Appearances":"22","No":"15","Country":"Algeria","Club Country":"Croatia","Club":"Dinamo Zagreb","Weighted Degree":"23.0","Modularity Class":"24","Date of birth / Age":"25 November 1987 (aged 26)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2950622240064231"},"color":"rgb(67,164,229)","size":11.333333015441895},{"label":"Vincent Aboubakar","x":458.3448486328125,"y":202.27162170410156,"id":"705","attributes":{"Eigenvector Centrality":"0.32277187794408035","Betweenness Centrality":"0.0","Appearances":"24","No":"10","Country":"Cameroon","Club Country":"France","Club":"Lorient","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"22 January 1992 (aged 22)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"Paul Pogba","x":8.138252258300781,"y":94.41950225830078,"id":"565","attributes":{"Eigenvector Centrality":"0.7020295109364902","Betweenness Centrality":"0.00827672737020524","Appearances":"11","No":"19","Country":"France","Club Country":"Italy","Club":"Juventus","Weighted Degree":"33.0","Modularity Class":"16","Date of birth / Age":"15 March 1993 (aged 21)","Degree":"33","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.33424283765347884"},"color":"rgb(229,67,229)","size":24.666667938232422},{"label":"Alejandro Bedoya","x":784.4288940429688,"y":-1547.6514892578125,"id":"20","attributes":{"Eigenvector Centrality":"0.27181518429351065","Betweenness Centrality":"0.0","Appearances":"28","No":"11","Country":"United States","Club Country":"France","Club":"Nantes","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"29 April 1987 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Hossein Mahini","x":1969.51806640625,"y":1144.54345703125,"id":"284","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"22","No":"13","Country":"Iran","Club Country":"Iran","Club":"Persepolis","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"16 September 1986 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Aleksandr Kerzhakov","x":-1228.88916015625,"y":-1267.0670166015625,"id":"21","attributes":{"Eigenvector Centrality":"0.3498246554244825","Betweenness Centrality":"0.004583905120882726","Appearances":"80","No":"11","Country":"Russia","Club Country":"Russia","Club":"Zenit Saint Petersburg","Weighted Degree":"26.0","Modularity Class":"2","Date of birth / Age":"27 November 1982 (aged 31)","Degree":"26","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.27904328018223234"},"color":"rgb(229,67,67)","size":15.333333969116211},{"label":"Frickson Erazo","x":-1740.312255859375,"y":-668.1109619140625,"id":"235","attributes":{"Eigenvector Centrality":"0.3623062182068215","Betweenness Centrality":"0.0","Appearances":"37","No":"3","Country":"Ecuador","Club Country":"Brazil","Club":"Flamengo","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"5 May 1988 (aged 26)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Ousmane Viera","x":474.08282470703125,"y":-965.5185546875,"id":"553","attributes":{"Eigenvector Centrality":"0.3219703768914536","Betweenness Centrality":"0.0013416368447328885","Appearances":"1","No":"2","Country":"Ivory Coast","Club Country":"Turkey","Club":"Çaykur Rizespor","Weighted Degree":"23.0","Modularity Class":"9","Date of birth / Age":"21 December 1986 (aged 27)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30334296326867516"},"color":"rgb(164,67,229)","size":11.333333015441895},{"label":"Shusaku Nishikawa","x":727.420166015625,"y":656.2659301757812,"id":"651","attributes":{"Eigenvector Centrality":"0.31718153777834773","Betweenness Centrality":"0.0","Appearances":"13","No":"12","Country":"Japan","Club Country":"Japan","Club":"Urawa Red Diamonds","Weighted Degree":"22.0","Modularity Class":"27","Date of birth / Age":"18 June 1986 (aged 27)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3107822410147992"},"color":"rgb(67,100,229)","size":10.0},{"label":"Andrea Barzagli","x":109.97048950195312,"y":937.1626586914062,"id":"45","attributes":{"Eigenvector Centrality":"0.5455496050511397","Betweenness Centrality":"0.0016215443882875223","Appearances":"47","No":"15","Country":"Italy","Club Country":"Italy","Club":"Juventus","Weighted Degree":"28.0","Modularity Class":"3","Date of birth / Age":"8 May 1981 (aged 33)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(197,229,67)","size":18.0},{"label":"Oliver Zelenika","x":-310.13934326171875,"y":653.3941040039062,"id":"542","attributes":{"Eigenvector Centrality":"0.34443939620173625","Betweenness Centrality":"0.0","Appearances":"0","No":"12","Country":"Croatia","Club Country":"Croatia","Club":"Lokomotiva","Weighted Degree":"22.0","Modularity Class":"25","Date of birth / Age":"14 May 1993 (aged 21)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.29178245335450576"},"color":"rgb(132,67,229)","size":10.0},{"label":"Alan Pulido","x":-2016.3092041015625,"y":442.1366271972656,"id":"17","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"6","No":"11","Country":"Mexico","Club Country":"Mexico","Club":"UANL","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"8 March 1991 (aged 23)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Ivica Olic","x":-356.2250061035156,"y":503.7689208984375,"id":"301","attributes":{"Eigenvector Centrality":"0.4414842289662269","Betweenness Centrality":"0.0021210911790253153","Appearances":"92","No":"18","Country":"Croatia","Club Country":"Germany","Club":"VfL Wolfsburg","Weighted Degree":"27.0","Modularity Class":"25","Date of birth / Age":"14 September 1979 (aged 34)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.317083692838654"},"color":"rgb(132,67,229)","size":16.666667938232422},{"label":"Divock Origi","x":-634.9317016601562,"y":-895.1273803710938,"id":"172","attributes":{"Eigenvector Centrality":"0.567406470826805","Betweenness Centrality":"0.002778667740909008","Appearances":"2","No":"17","Country":"Belgium","Club Country":"France","Club":"Lille","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"18 April 1995 (aged 19)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3383977900552486"},"color":"rgb(67,229,132)","size":14.0},{"label":"Han Kook-young","x":1158.830810546875,"y":1599.3704833984375,"id":"269","attributes":{"Eigenvector Centrality":"0.2315255949886878","Betweenness Centrality":"0.0","Appearances":"10","No":"14","Country":"South Korea","Club Country":"Japan","Club":"Kashiwa Reysol","Weighted Degree":"22.0","Modularity Class":"10","Date of birth / Age":"19 April 1990 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.24614869390488947"},"color":"rgb(229,67,164)","size":10.0},{"label":"Tommy Oar","x":2165.022705078125,"y":-713.5425415039062,"id":"686","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"15","No":"11","Country":"Australia","Club Country":"Netherlands","Club":"Utrecht","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"10 December 1991 (aged 22)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Raúl Jiménez","x":-2167.43408203125,"y":400.8553161621094,"id":"592","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"25","No":"9","Country":"Mexico","Club Country":"Mexico","Club":"América","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"5 May 1991 (aged 23)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Luka Modric","x":-410.41796875,"y":416.6111145019531,"id":"432","attributes":{"Eigenvector Centrality":"0.6315855500081669","Betweenness Centrality":"0.005842271062684167","Appearances":"75","No":"10","Country":"Croatia","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"33.0","Modularity Class":"25","Date of birth / Age":"9 September 1985 (aged 28)","Degree":"33","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3262316910785619"},"color":"rgb(132,67,229)","size":24.666667938232422},{"label":"Georginio Wijnaldum","x":874.0654907226562,"y":135.7948455810547,"id":"244","attributes":{"Eigenvector Centrality":"0.36016990192205894","Betweenness Centrality":"0.005645297467686556","Appearances":"5","No":"20","Country":"Netherlands","Club Country":"Netherlands","Club":"PSV","Weighted Degree":"24.0","Modularity Class":"22","Date of birth / Age":"11 November 1990 (aged 23)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3273942093541203"},"color":"rgb(197,67,229)","size":12.666666984558105},{"label":"Alfredo Talavera","x":-1995.7100830078125,"y":401.94842529296875,"id":"34","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"14","No":"12","Country":"Mexico","Club Country":"Mexico","Club":"Toluca","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"18 September 1982 (aged 31)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Esteban Paredes","x":-262.22747802734375,"y":1531.853271484375,"id":"207","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"35","No":"22","Country":"Chile","Club Country":"Chile","Club":"Colo-Colo","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"1 August 1980 (aged 33)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Enzo Pérez","x":-1057.39599609375,"y":279.5024719238281,"id":"202","attributes":{"Eigenvector Centrality":"0.5249878217996955","Betweenness Centrality":"8.46487079105798E-4","Appearances":"7","No":"8","Country":"Argentina","Club Country":"Portugal","Club":"Benfica","Weighted Degree":"25.0","Modularity Class":"19","Date of birth / Age":"22 February 1986 (aged 28)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3084347461183382"},"color":"rgb(67,229,229)","size":14.0},{"label":"MartÃn Cáceres","x":-21.211044311523438,"y":343.7950439453125,"id":"461","attributes":{"Eigenvector Centrality":"0.5969418716202328","Betweenness Centrality":"0.009327834149799673","Appearances":"57","No":"22","Country":"Uruguay","Club Country":"Italy","Club":"Juventus","Weighted Degree":"33.0","Modularity Class":"6","Date of birth / Age":"7 April 1987 (aged 27)","Degree":"33","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33731069297843047"},"color":"rgb(229,197,67)","size":24.666667938232422},{"label":"Thomas Vermaelen","x":-482.7641296386719,"y":-771.1542358398438,"id":"679","attributes":{"Eigenvector Centrality":"0.7319614548533502","Betweenness Centrality":"0.0031592253025152935","Appearances":"47","No":"3","Country":"Belgium","Club Country":"England","Club":"Arsenal","Weighted Degree":"31.0","Modularity Class":"28","Date of birth / Age":"14 November 1985 (aged 28)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33731069297843047"},"color":"rgb(67,229,132)","size":22.0},{"label":"Matt Besler","x":861.9520874023438,"y":-1604.162841796875,"id":"476","attributes":{"Eigenvector Centrality":"0.2718151842935107","Betweenness Centrality":"0.0","Appearances":"17","No":"5","Country":"United States","Club Country":"United States","Club":"Sporting Kansas City","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"11 February 1987 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Benjamin Moukandjo","x":415.3848876953125,"y":99.65612030029297,"id":"83","attributes":{"Eigenvector Centrality":"0.3227718779440804","Betweenness Centrality":"0.0","Appearances":"17","No":"8","Country":"Cameroon","Club Country":"France","Club":"Nancy","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"12 November 1988 (aged 25)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"David Ospina","x":-821.8875122070312,"y":1214.61767578125,"id":"153","attributes":{"Eigenvector Centrality":"0.3139492510789159","Betweenness Centrality":"0.0","Appearances":"44","No":"1","Country":"Colombia","Club Country":"France","Club":"Nice","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"31 August 1988 (aged 25)","Degree":"22","Position":"GK","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"Felipe Caicedo","x":-1726.1597900390625,"y":-587.7854614257812,"id":"222","attributes":{"Eigenvector Centrality":"0.3623062182068215","Betweenness Centrality":"0.0","Appearances":"50","No":"11","Country":"Ecuador","Club Country":"United Arab Emirates","Club":"Al-Jazira","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"5 September 1988 (aged 25)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Kevin Großkreutz","x":553.7317504882812,"y":-380.0992126464844,"id":"385","attributes":{"Eigenvector Centrality":"0.500680986024227","Betweenness Centrality":"0.008472576600609625","Appearances":"5","No":"2","Country":"Germany","Club Country":"Germany","Club":"Borussia Dortmund","Weighted Degree":"24.0","Modularity Class":"13","Date of birth / Age":"19 July 1988 (aged 25)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.310126582278481"},"color":"rgb(67,229,164)","size":12.666666984558105},{"label":"Jô","x":-470.48614501953125,"y":-271.3874816894531,"id":"331","attributes":{"Eigenvector Centrality":"0.5425650576268322","Betweenness Centrality":"0.0","Appearances":"17","No":"21","Country":"Brazil","Club Country":"Brazil","Club":"Atlético Mineiro","Weighted Degree":"22.0","Modularity Class":"23","Date of birth / Age":"20 March 1987 (aged 27)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3158573270305114"},"color":"rgb(229,67,197)","size":10.0},{"label":"Pavel Mogilevets","x":-1357.9305419921875,"y":-1289.38330078125,"id":"568","attributes":{"Eigenvector Centrality":"0.2784495406871368","Betweenness Centrality":"0.0019868644316807485","Appearances":"1","No":"15","Country":"Russia","Club Country":"Russia","Club":"Rubin Kazan","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"25 January 1993 (aged 21)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.256186824677588"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Raïs M\u0027Bolhi","x":-1459.36083984375,"y":1229.281982421875,"id":"585","attributes":{"Eigenvector Centrality":"0.2958935568628797","Betweenness Centrality":"0.0","Appearances":"28","No":"23","Country":"Algeria","Club Country":"Bulgaria","Club":"CSKA Sofia","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"25 April 1986 (aged 28)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Henrique","x":-572.6226806640625,"y":-84.16056823730469,"id":"279","attributes":{"Eigenvector Centrality":"0.8111998945620833","Betweenness Centrality":"0.00493020854872855","Appearances":"5","No":"15","Country":"Brazil","Club Country":"Italy","Club":"Napoli","Weighted Degree":"33.0","Modularity Class":"23","Date of birth / Age":"14 October 1986 (aged 27)","Degree":"33","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3458823529411765"},"color":"rgb(229,67,197)","size":24.666667938232422},{"label":"Daryl Janmaat","x":832.5292358398438,"y":28.84025001525879,"id":"149","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"16","No":"7","Country":"Netherlands","Club Country":"Netherlands","Club":"Feyenoord","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"22 July 1989 (aged 24)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"Ãlvaro González","x":13.41373348236084,"y":-43.777435302734375,"id":"38","attributes":{"Eigenvector Centrality":"0.4846353390672056","Betweenness Centrality":"0.006932977102729991","Appearances":"43","No":"20","Country":"Uruguay","Club Country":"Italy","Club":"Lazio","Weighted Degree":"28.0","Modularity Class":"6","Date of birth / Age":"29 October 1984 (aged 29)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34507042253521125"},"color":"rgb(229,197,67)","size":18.0},{"label":"Essaïd Belkalem","x":-1238.16552734375,"y":1250.7357177734375,"id":"205","attributes":{"Eigenvector Centrality":"0.30611433682396827","Betweenness Centrality":"0.005838443339718533","Appearances":"13","No":"4","Country":"Algeria","Club Country":"England","Club":"Watford","Weighted Degree":"23.0","Modularity Class":"24","Date of birth / Age":"1 January 1989 (aged 25)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.29388244702119154"},"color":"rgb(67,164,229)","size":11.333333015441895},{"label":"Adrián Ramos","x":-712.1338500976562,"y":1053.31591796875,"id":"10","attributes":{"Eigenvector Centrality":"0.3252993880084764","Betweenness Centrality":"0.003909094271768691","Appearances":"26","No":"19","Country":"Colombia","Club Country":"Germany","Club":"Hertha BSC","Weighted Degree":"23.0","Modularity Class":"11","Date of birth / Age":"22 January 1986 (aged 28)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.3080469404861693"},"color":"rgb(67,67,229)","size":11.333333015441895},{"label":"José Miguel Cubero","x":2268.583740234375,"y":346.56884765625,"id":"360","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"35","No":"22","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Herediano","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"14 February 1987 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Yuto Nagatomo","x":395.0039367675781,"y":607.56591796875,"id":"734","attributes":{"Eigenvector Centrality":"0.44967087937585604","Betweenness Centrality":"0.011059526851986908","Appearances":"70","No":"5","Country":"Japan","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"29.0","Modularity Class":"27","Date of birth / Age":"12 September 1986 (aged 27)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33731069297843047"},"color":"rgb(67,100,229)","size":19.333332061767578},{"label":"Hassan Yebda","x":-1303.48681640625,"y":1254.45166015625,"id":"274","attributes":{"Eigenvector Centrality":"0.30778242364802144","Betweenness Centrality":"0.0021251327211181483","Appearances":"25","No":"7","Country":"Algeria","Club Country":"Italy","Club":"Udinese","Weighted Degree":"23.0","Modularity Class":"24","Date of birth / Age":"14 May 1984 (aged 30)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2980535279805353"},"color":"rgb(67,164,229)","size":11.333333015441895},{"label":"Mensur Mujdža","x":1039.0458984375,"y":-418.0989685058594,"id":"497","attributes":{"Eigenvector Centrality":"0.3323231211056512","Betweenness Centrality":"0.006714488569703231","Appearances":"24","No":"13","Country":"Bosnia and Herzegovina","Club Country":"Germany","Club":"SC Freiburg","Weighted Degree":"25.0","Modularity Class":"20","Date of birth / Age":"28 March 1984 (aged 30)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(132,229,67)","size":14.0},{"label":"Matt McKay","x":2090.569580078125,"y":-687.9733276367188,"id":"477","attributes":{"Eigenvector Centrality":"0.2213229433005502","Betweenness Centrality":"0.0","Appearances":"47","No":"17","Country":"Australia","Club Country":"Australia","Club":"Brisbane Roar","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"11 January 1983 (aged 31)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Dany Nounkeu","x":382.61639404296875,"y":41.81476974487305,"id":"146","attributes":{"Eigenvector Centrality":"0.3503932506862968","Betweenness Centrality":"0.003969104553989964","Appearances":"16","No":"5","Country":"Cameroon","Club Country":"Turkey","Club":"Be?ikta?","Weighted Degree":"24.0","Modularity Class":"17","Date of birth / Age":"11 April 1986 (aged 28)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3272484416740873"},"color":"rgb(67,132,229)","size":12.666666984558105},{"label":"Toshihiro Aoyama","x":774.469970703125,"y":733.8078002929688,"id":"689","attributes":{"Eigenvector Centrality":"0.327417913267161","Betweenness Centrality":"0.0034073119067962805","Appearances":"6","No":"14","Country":"Japan","Club Country":"Japan","Club":"Sanfrecce Hiroshima","Weighted Degree":"23.0","Modularity Class":"27","Date of birth / Age":"22 February 1986 (aged 28)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.315450643776824"},"color":"rgb(67,100,229)","size":11.333333015441895},{"label":"Pablo Zabaleta","x":-933.6387939453125,"y":24.648056030273438,"id":"555","attributes":{"Eigenvector Centrality":"0.6398902783818313","Betweenness Centrality":"0.003598075368399343","Appearances":"36","No":"4","Country":"Argentina","Club Country":"England","Club":"Manchester City","Weighted Degree":"29.0","Modularity Class":"19","Date of birth / Age":"16 January 1985 (aged 29)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3316787003610108"},"color":"rgb(67,229,229)","size":19.333332061767578},{"label":"Luis Saritama","x":-1546.898681640625,"y":-441.077392578125,"id":"429","attributes":{"Eigenvector Centrality":"0.7525405481416904","Betweenness Centrality":"0.006691544296226193","Appearances":"49","No":"19","Country":"Ecuador","Club Country":"Ecuador","Club":"Barcelona","Weighted Degree":"35.0","Modularity Class":"4","Date of birth / Age":"20 October 1983 (aged 30)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(229,67,132)","size":27.33333396911621},{"label":"Orestis Karnezis","x":1393.8565673828125,"y":576.5565795898438,"id":"545","attributes":{"Eigenvector Centrality":"0.28385897578556757","Betweenness Centrality":"0.01153344916312804","Appearances":"19","No":"1","Country":"Greece","Club Country":"Spain","Club":"Granada","Weighted Degree":"24.0","Modularity Class":"15","Date of birth / Age":"11 July 1985 (aged 28)","Degree":"24","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.30624999999999997"},"color":"rgb(229,67,100)","size":12.666666984558105},{"label":"Abel Aguilar","x":-660.8257446289062,"y":1009.1897583007812,"id":"2","attributes":{"Eigenvector Centrality":"0.33885801794641307","Betweenness Centrality":"0.004574685606976985","Appearances":"49","No":"8","Country":"Colombia","Club Country":"France","Club":"Toulouse","Weighted Degree":"24.0","Modularity Class":"11","Date of birth / Age":"6 January 1985 (aged 29)","Degree":"24","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(67,67,229)","size":12.666666984558105},{"label":"Panagiotis Glykos","x":1575.4261474609375,"y":522.7161865234375,"id":"556","attributes":{"Eigenvector Centrality":"0.2581333696341679","Betweenness Centrality":"0.0","Appearances":"2","No":"12","Country":"Greece","Club Country":"Greece","Club":"PAOK","Weighted Degree":"22.0","Modularity Class":"15","Date of birth / Age":"3 June 1986 (aged 28)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2760045061960195"},"color":"rgb(229,67,100)","size":10.0},{"label":"José Juan Vázquez","x":-2102.5595703125,"y":434.6721496582031,"id":"357","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"5","No":"23","Country":"Mexico","Club Country":"Mexico","Club":"León","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"14 March 1988 (aged 26)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Vincent Kompany (c)","x":-575.3739013671875,"y":-726.921630859375,"id":"707","attributes":{"Eigenvector Centrality":"0.7270895604312667","Betweenness Centrality":"0.008072864238933854","Appearances":"59","No":"4","Country":"Belgium","Club Country":"England","Club":"Manchester City","Weighted Degree":"31.0","Modularity Class":"28","Date of birth / Age":"10 April 1986 (aged 28)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3506679389312977"},"color":"rgb(67,229,132)","size":22.0},{"label":"Mehrdad Pouladi","x":1894.86376953125,"y":1109.2691650390625,"id":"495","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"20","No":"23","Country":"Iran","Club Country":"Iran","Club":"Persepolis","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"26 February 1987 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Marcelo Brozovic","x":-406.1941833496094,"y":695.7294311523438,"id":"444","attributes":{"Eigenvector Centrality":"0.35648846045640376","Betweenness Centrality":"0.0013005076523818384","Appearances":"1","No":"14","Country":"Croatia","Club Country":"Croatia","Club":"Dinamo Zagreb","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"16 October 1992 (aged 21)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30209617755856966"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Laurent Ciman","x":-542.019287109375,"y":-660.8407592773438,"id":"408","attributes":{"Eigenvector Centrality":"0.5473733076826977","Betweenness Centrality":"0.004841485029495745","Appearances":"8","No":"23","Country":"Belgium","Club Country":"Belgium","Club":"Standard Liège","Weighted Degree":"24.0","Modularity Class":"28","Date of birth / Age":"5 August 1985 (aged 28)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3359232175502742"},"color":"rgb(67,229,132)","size":12.666666984558105},{"label":"Isaác Brizuela","x":-2104.457275390625,"y":342.27984619140625,"id":"295","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"7","No":"17","Country":"Mexico","Club Country":"Mexico","Club":"Toluca","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"28 August 1990 (aged 23)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Mario Yepes (c)","x":-719.3209838867188,"y":1256.8892822265625,"id":"457","attributes":{"Eigenvector Centrality":"0.326518739989132","Betweenness Centrality":"0.0018851206504077599","Appearances":"98","No":"3","Country":"Colombia","Club Country":"Italy","Club":"Atalanta","Weighted Degree":"23.0","Modularity Class":"11","Date of birth / Age":"13 January 1976 (aged 38)","Degree":"23","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2995110024449878"},"color":"rgb(67,67,229)","size":11.333333015441895},{"label":"Ramires","x":-481.0262451171875,"y":-469.7139587402344,"id":"586","attributes":{"Eigenvector Centrality":"0.7525362816963487","Betweenness Centrality":"0.002196566654268722","Appearances":"42","No":"16","Country":"Brazil","Club Country":"England","Club":"Chelsea","Weighted Degree":"30.0","Modularity Class":"23","Date of birth / Age":"24 March 1987 (aged 27)","Degree":"30","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3471894189891356"},"color":"rgb(229,67,197)","size":20.666667938232422},{"label":"Cédric Djeugoué","x":458.0302734375,"y":113.75821685791016,"id":"107","attributes":{"Eigenvector Centrality":"0.32277187794408035","Betweenness Centrality":"0.0","Appearances":"3","No":"4","Country":"Cameroon","Club Country":"Cameroon","Club":"Coton Sport","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"28 August 1992 (aged 21)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"Igor Denisov","x":-1478.451904296875,"y":-1427.125244140625,"id":"293","attributes":{"Eigenvector Centrality":"0.28166227463506127","Betweenness Centrality":"6.368705012250895E-4","Appearances":"43","No":"7","Country":"Russia","Club Country":"Russia","Club":"Dynamo Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"17 May 1984 (aged 30)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.25538568450312715"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Marco Fabián","x":-2042.7996826171875,"y":288.5499267578125,"id":"446","attributes":{"Eigenvector Centrality":"0.29131873163694544","Betweenness Centrality":"0.0012783129193471678","Appearances":"15","No":"8","Country":"Mexico","Club Country":"Mexico","Club":"Cruz Azul","Weighted Degree":"23.0","Modularity Class":"21","Date of birth / Age":"21 July 1989 (aged 24)","Degree":"23","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.2744585511575803"},"color":"rgb(67,229,67)","size":11.333333015441895},{"label":"Kevin-Prince Boateng","x":528.2719116210938,"y":1086.7677001953125,"id":"387","attributes":{"Eigenvector Centrality":"0.3920782711719237","Betweenness Centrality":"0.013927046623876642","Appearances":"13","No":"9","Country":"Ghana","Club Country":"Germany","Club":"Schalke \u002704","Weighted Degree":"28.0","Modularity Class":"5","Date of birth / Age":"6 March 1987 (aged 27)","Degree":"28","Position":"FW","Eccentricity":"4.0","Closeness Centrality":"0.3287119856887299"},"color":"rgb(67,229,197)","size":18.0},{"label":"Shola Ameobi","x":18.68687629699707,"y":-1408.741943359375,"id":"649","attributes":{"Eigenvector Centrality":"0.39186636186315155","Betweenness Centrality":"0.004728167800452107","Appearances":"7","No":"23","Country":"Nigeria","Club Country":"England","Club":"Newcastle United","Weighted Degree":"27.0","Modularity Class":"14","Date of birth / Age":"12 October 1981 (aged 32)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.31873373807458805"},"color":"rgb(67,229,100)","size":16.666667938232422},{"label":"Oribe Peralta","x":-2123.54345703125,"y":394.2029113769531,"id":"546","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"33","No":"19","Country":"Mexico","Club Country":"Mexico","Club":"Santos Laguna","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"12 January 1984 (aged 30)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Marouane Fellaini","x":-655.5911865234375,"y":-756.7737426757812,"id":"460","attributes":{"Eigenvector Centrality":"0.8465738555476342","Betweenness Centrality":"0.005671820760248386","Appearances":"50","No":"8","Country":"Belgium","Club Country":"England","Club":"Manchester United","Weighted Degree":"34.0","Modularity Class":"28","Date of birth / Age":"22 November 1987 (aged 26)","Degree":"34","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3554158607350097"},"color":"rgb(67,229,132)","size":26.0},{"label":"Mark Bresciano","x":2122.005615234375,"y":-604.5106811523438,"id":"458","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"74","No":"23","Country":"Australia","Club Country":"Qatar","Club":"Al-Gharafa","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"11 February 1980 (aged 34)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Juan Pablo Montes","x":1592.6820068359375,"y":-1250.384033203125,"id":"372","attributes":{"Eigenvector Centrality":"0.23664887946331797","Betweenness Centrality":"0.0","Appearances":"11","No":"4","Country":"Honduras","Club Country":"Honduras","Club":"Motagua","Weighted Degree":"22.0","Modularity Class":"7","Date of birth / Age":"26 October 1985 (aged 28)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.26344086021505375"},"color":"rgb(100,67,229)","size":10.0},{"label":"Sokratis Papastathopoulos","x":1506.5098876953125,"y":339.672119140625,"id":"656","attributes":{"Eigenvector Centrality":"0.34048353254028174","Betweenness Centrality":"0.015463773824795727","Appearances":"47","No":"19","Country":"Greece","Club Country":"Germany","Club":"Borussia Dortmund","Weighted Degree":"27.0","Modularity Class":"15","Date of birth / Age":"9 June 1988 (aged 26)","Degree":"27","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.29178245335450576"},"color":"rgb(229,67,100)","size":16.666667938232422},{"label":"Blerim Džemaili","x":-243.03868103027344,"y":290.1379699707031,"id":"88","attributes":{"Eigenvector Centrality":"0.6153709092825856","Betweenness Centrality":"0.004199284588766183","Appearances":"34","No":"15","Country":"Switzerland","Club Country":"Italy","Club":"Napoli","Weighted Degree":"31.0","Modularity Class":"0","Date of birth / Age":"12 April 1986 (aged 28)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3331822302810517"},"color":"rgb(164,229,67)","size":22.0},{"label":"Mario Balotelli","x":253.78076171875,"y":886.2698364257812,"id":"452","attributes":{"Eigenvector Centrality":"0.49991402097095833","Betweenness Centrality":"0.003073405743850096","Appearances":"30","No":"9","Country":"Italy","Club Country":"Italy","Club":"Milan","Weighted Degree":"27.0","Modularity Class":"3","Date of birth / Age":"12 August 1990 (aged 23)","Degree":"27","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.31928757602085145"},"color":"rgb(197,229,67)","size":16.666667938232422},{"label":"Ivan Rakitic","x":-359.27825927734375,"y":645.7860717773438,"id":"300","attributes":{"Eigenvector Centrality":"0.38837093893822316","Betweenness Centrality":"0.003900575726937713","Appearances":"62","No":"7","Country":"Croatia","Club Country":"Spain","Club":"Sevilla","Weighted Degree":"25.0","Modularity Class":"25","Date of birth / Age":"10 March 1988 (aged 26)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31873373807458805"},"color":"rgb(132,67,229)","size":14.0},{"label":"Denis Glushakov","x":-1381.390869140625,"y":-1518.66748046875,"id":"158","attributes":{"Eigenvector Centrality":"0.26569304291819806","Betweenness Centrality":"0.0","Appearances":"26","No":"8","Country":"Russia","Club Country":"Russia","Club":"Spartak Moscow","Weighted Degree":"22.0","Modularity Class":"2","Date of birth / Age":"27 January 1987 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.23244781783681215"},"color":"rgb(229,67,67)","size":10.0},{"label":"Alexander MejÃa","x":-761.3262329101562,"y":1152.329833984375,"id":"31","attributes":{"Eigenvector Centrality":"0.31394925107891597","Betweenness Centrality":"0.0","Appearances":"8","No":"15","Country":"Colombia","Club Country":"Colombia","Club":"Atlético Nacional","Weighted Degree":"22.0","Modularity Class":"11","Date of birth / Age":"11 July 1988 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.29329608938547486"},"color":"rgb(67,67,229)","size":10.0},{"label":"Iker Casillas (c)","x":-800.6239624023438,"y":-169.28741455078125,"id":"294","attributes":{"Eigenvector Centrality":"0.9040112595591265","Betweenness Centrality":"0.001687861941424018","Appearances":"154","No":"1","Country":"Spain","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"31.0","Modularity Class":"23","Date of birth / Age":"20 May 1981 (aged 33)","Degree":"31","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3350045578851413"},"color":"rgb(229,67,197)","size":22.0},{"label":"Bastian Schweinsteiger","x":244.85414123535156,"y":-373.9827575683594,"id":"79","attributes":{"Eigenvector Centrality":"0.6585766805388439","Betweenness Centrality":"0.0026429368589338613","Appearances":"102","No":"7","Country":"Germany","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"1 August 1984 (aged 29)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3390221402214022"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Héctor Moreno","x":-1943.870849609375,"y":364.6249694824219,"id":"276","attributes":{"Eigenvector Centrality":"0.2913525846132968","Betweenness Centrality":"0.0014244038755752933","Appearances":"53","No":"15","Country":"Mexico","Club Country":"Spain","Club":"Espanyol","Weighted Degree":"23.0","Modularity Class":"21","Date of birth / Age":"17 January 1988 (aged 26)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.2797868290826037"},"color":"rgb(67,229,67)","size":11.333333015441895},{"label":"Enner Valencia","x":-1712.62646484375,"y":-633.4451293945312,"id":"201","attributes":{"Eigenvector Centrality":"0.3623062182068215","Betweenness Centrality":"0.0","Appearances":"10","No":"13","Country":"Ecuador","Club Country":"Mexico","Club":"Pachuca","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"11 April 1989 (aged 25)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Miiko Albornoz","x":-282.7862243652344,"y":1583.49462890625,"id":"512","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"2","No":"3","Country":"Chile","Club Country":"Sweden","Club":"Malmö FF","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"30 November 1990 (aged 23)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Nigel de Jong","x":764.1231689453125,"y":266.0992126464844,"id":"534","attributes":{"Eigenvector Centrality":"0.4525178607313098","Betweenness Centrality":"0.007743435699427788","Appearances":"71","No":"6","Country":"Netherlands","Club Country":"Italy","Club":"Milan","Weighted Degree":"29.0","Modularity Class":"22","Date of birth / Age":"13 November 1984 (aged 29)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3300404131118096"},"color":"rgb(197,67,229)","size":19.333332061767578},{"label":"Diego Forlán","x":22.54448699951172,"y":32.10325241088867,"id":"165","attributes":{"Eigenvector Centrality":"0.40103485022538","Betweenness Centrality":"0.0023543724845431786","Appearances":"110","No":"10","Country":"Uruguay","Club Country":"Japan","Club":"Cerezo Osaka","Weighted Degree":"24.0","Modularity Class":"6","Date of birth / Age":"19 May 1979 (aged 35)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3220858895705521"},"color":"rgb(229,197,67)","size":12.666666984558105},{"label":"Marco Verratti","x":74.62252044677734,"y":597.4002075195312,"id":"449","attributes":{"Eigenvector Centrality":"0.577944433296703","Betweenness Centrality":"0.001710601263663759","Appearances":"6","No":"23","Country":"Italy","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"29.0","Modularity Class":"3","Date of birth / Age":"5 November 1992 (aged 21)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3166738474795347"},"color":"rgb(197,229,67)","size":19.333332061767578},{"label":"Joe Hart","x":-212.69390869140625,"y":-704.6478271484375,"id":"335","attributes":{"Eigenvector Centrality":"0.7015324384017536","Betweenness Centrality":"0.003652191896387035","Appearances":"41","No":"1","Country":"England","Club Country":"England","Club":"Manchester City","Weighted Degree":"30.0","Modularity Class":"28","Date of birth / Age":"19 May 1987 (aged 27)","Degree":"30","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3316787003610108"},"color":"rgb(67,229,132)","size":20.666667938232422},{"label":"Loïc Feudjou","x":464.741943359375,"y":157.33299255371094,"id":"420","attributes":{"Eigenvector Centrality":"0.3227718779440803","Betweenness Centrality":"0.0","Appearances":"2","No":"1","Country":"Cameroon","Club Country":"Cameroon","Club":"Coton Sport","Weighted Degree":"22.0","Modularity Class":"17","Date of birth / Age":"14 April 1992 (aged 22)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(67,132,229)","size":10.0},{"label":"Wakaso Mubarak","x":209.4365234375,"y":1057.447998046875,"id":"709","attributes":{"Eigenvector Centrality":"0.32387682859035066","Betweenness Centrality":"0.009270286480100764","Appearances":"17","No":"22","Country":"Ghana","Club Country":"Russia","Club":"Rubin Kazan","Weighted Degree":"25.0","Modularity Class":"5","Date of birth / Age":"25 July 1990 (aged 23)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2897122585731179"},"color":"rgb(67,229,197)","size":14.0},{"label":"Alexander DomÃnguez","x":-1643.0283203125,"y":-689.7501831054688,"id":"30","attributes":{"Eigenvector Centrality":"0.3623062182068214","Betweenness Centrality":"0.0","Appearances":"18","No":"22","Country":"Ecuador","Club Country":"Ecuador","Club":"LDU Quito","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"5 June 1987 (aged 27)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Camilo Vargas","x":-870.7738037109375,"y":1102.7423095703125,"id":"96","attributes":{"Eigenvector Centrality":"0.32771831640802235","Betweenness Centrality":"0.0031253464825959647","Appearances":"0","No":"12","Country":"Colombia","Club Country":"Colombia","Club":"Santa Fe","Weighted Degree":"23.0","Modularity Class":"11","Date of birth / Age":"9 March 1989 (aged 25)","Degree":"23","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.3046000828843763"},"color":"rgb(67,67,229)","size":11.333333015441895},{"label":"Gordon Schildenfeld","x":-217.73817443847656,"y":655.733154296875,"id":"263","attributes":{"Eigenvector Centrality":"0.35596191653510817","Betweenness Centrality":"0.00248185018192758","Appearances":"21","No":"13","Country":"Croatia","Club Country":"Greece","Club":"Panathinaikos","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"18 March 1985 (aged 29)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30676126878130217"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Miguel Ãngel Ponce","x":-2068.725830078125,"y":475.1539306640625,"id":"509","attributes":{"Eigenvector Centrality":"0.2771264523867947","Betweenness Centrality":"0.0","Appearances":"8","No":"16","Country":"Mexico","Club Country":"Mexico","Club":"Toluca","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"12 April 1989 (aged 25)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Klaas-Jan Huntelaar","x":809.1665649414062,"y":91.84487915039062,"id":"396","attributes":{"Eigenvector Centrality":"0.4358139473318699","Betweenness Centrality":"0.00591887145222094","Appearances":"62","No":"19","Country":"Netherlands","Club Country":"Germany","Club":"Schalke \u002704","Weighted Degree":"28.0","Modularity Class":"22","Date of birth / Age":"12 August 1983 (aged 30)","Degree":"28","Position":"FW","Eccentricity":"4.0","Closeness Centrality":"0.34106728538283065"},"color":"rgb(197,67,229)","size":18.0},{"label":"Adam Lallana","x":-133.68426513671875,"y":-732.5047607421875,"id":"5","attributes":{"Eigenvector Centrality":"0.5904515327423898","Betweenness Centrality":"0.0016054547217210155","Appearances":"6","No":"20","Country":"England","Club Country":"England","Club":"Southampton","Weighted Degree":"26.0","Modularity Class":"28","Date of birth / Age":"10 May 1988 (aged 26)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.32407407407407407"},"color":"rgb(67,229,132)","size":15.333333969116211},{"label":"Ognjen VranjeÅ¡","x":1242.7872314453125,"y":-442.58514404296875,"id":"538","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"13","No":"6","Country":"Bosnia and Herzegovina","Club Country":"Turkey","Club":"Elaz??spor","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"24 October 1989 (aged 24)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Nabil Bentaleb","x":-1282.9583740234375,"y":861.7017822265625,"id":"525","attributes":{"Eigenvector Centrality":"0.3967886399693337","Betweenness Centrality":"0.0057727171211353545","Appearances":"3","No":"14","Country":"Algeria","Club Country":"England","Club":"Tottenham Hotspur","Weighted Degree":"27.0","Modularity Class":"24","Date of birth / Age":"24 November 1994 (aged 19)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3127659574468085"},"color":"rgb(67,164,229)","size":16.666667938232422},{"label":"Christian Stuani","x":-159.97439575195312,"y":40.9938850402832,"id":"121","attributes":{"Eigenvector Centrality":"0.38716306457328087","Betweenness Centrality":"0.002173292405131628","Appearances":"10","No":"11","Country":"Uruguay","Club Country":"Spain","Club":"Espanyol","Weighted Degree":"23.0","Modularity Class":"6","Date of birth / Age":"12 October 1986 (aged 27)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3169469598965071"},"color":"rgb(229,197,67)","size":11.333333015441895},{"label":"Wayne Rooney","x":-356.8543395996094,"y":-834.0883178710938,"id":"713","attributes":{"Eigenvector Centrality":"0.7938188270448313","Betweenness Centrality":"0.0038886080479693477","Appearances":"92","No":"10","Country":"England","Club Country":"England","Club":"Manchester United","Weighted Degree":"32.0","Modularity Class":"28","Date of birth / Age":"24 October 1985 (aged 28)","Degree":"32","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3393351800554017"},"color":"rgb(67,229,132)","size":23.33333396911621},{"label":"VÃctor Ibarbo","x":-760.33837890625,"y":1293.089111328125,"id":"701","attributes":{"Eigenvector Centrality":"0.32651873998913206","Betweenness Centrality":"0.0018851206504077605","Appearances":"9","No":"14","Country":"Colombia","Club Country":"Italy","Club":"Cagliari","Weighted Degree":"23.0","Modularity Class":"11","Date of birth / Age":"19 May 1990 (aged 24)","Degree":"23","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.2995110024449878"},"color":"rgb(67,67,229)","size":11.333333015441895},{"label":"Stephan Lichtsteiner","x":67.66877746582031,"y":456.6788330078125,"id":"661","attributes":{"Eigenvector Centrality":"0.6056758151342643","Betweenness Centrality":"0.009695316861352839","Appearances":"63","No":"2","Country":"Switzerland","Club Country":"Italy","Club":"Juventus","Weighted Degree":"33.0","Modularity Class":"0","Date of birth / Age":"16 January 1984 (aged 30)","Degree":"33","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3272484416740873"},"color":"rgb(164,229,67)","size":24.666667938232422},{"label":"Stefanos Kapino","x":1427.728271484375,"y":531.8199462890625,"id":"660","attributes":{"Eigenvector Centrality":"0.28485567017526575","Betweenness Centrality":"0.005086946710578289","Appearances":"2","No":"13","Country":"Greece","Club Country":"Greece","Club":"Panathinaikos","Weighted Degree":"24.0","Modularity Class":"15","Date of birth / Age":"18 March 1994 (aged 20)","Degree":"24","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.29108910891089107"},"color":"rgb(229,67,100)","size":12.666666984558105},{"label":"Daley Blind","x":865.136962890625,"y":-4.895512104034424,"id":"133","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"12","No":"5","Country":"Netherlands","Club Country":"Netherlands","Club":"Ajax","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"9 March 1990 (aged 24)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"Domagoj Vida","x":-257.2379455566406,"y":568.6809692382812,"id":"175","attributes":{"Eigenvector Centrality":"0.3750066769920371","Betweenness Centrality":"0.0014678886642237275","Appearances":"23","No":"21","Country":"Croatia","Club Country":"Ukraine","Club":"Dynamo Kyiv","Weighted Degree":"24.0","Modularity Class":"25","Date of birth / Age":"29 April 1989 (aged 25)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31450577663671375"},"color":"rgb(132,67,229)","size":12.666666984558105},{"label":"DaMarcus Beasley","x":860.4318237304688,"y":-1509.4605712890625,"id":"134","attributes":{"Eigenvector Centrality":"0.2718151842935107","Betweenness Centrality":"0.0","Appearances":"116","No":"7","Country":"United States","Club Country":"Mexico","Club":"Puebla","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"24 May 1982 (aged 32)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Guillermo Ochoa","x":-2012.4979248046875,"y":495.5871276855469,"id":"267","attributes":{"Eigenvector Centrality":"0.2891264231632272","Betweenness Centrality":"0.0013552426869013025","Appearances":"59","No":"13","Country":"Mexico","Club Country":"France","Club":"Ajaccio","Weighted Degree":"23.0","Modularity Class":"21","Date of birth / Age":"13 July 1985 (aged 28)","Degree":"23","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.2753840389659048"},"color":"rgb(67,229,67)","size":11.333333015441895},{"label":"Gonzalo Jara","x":-235.43576049804688,"y":1571.703369140625,"id":"262","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"65","No":"18","Country":"Chile","Club Country":"England","Club":"Nottingham Forest","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"29 August 1985 (aged 28)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Julian Draxler","x":528.5164184570312,"y":-263.5556335449219,"id":"374","attributes":{"Eigenvector Centrality":"0.5529715553555452","Betweenness Centrality":"0.006227653676219969","Appearances":"11","No":"14","Country":"Germany","Club Country":"Germany","Club":"Schalke \u002704","Weighted Degree":"27.0","Modularity Class":"13","Date of birth / Age":"20 September 1993 (aged 20)","Degree":"27","Position":"MF","Eccentricity":"4.0","Closeness Centrality":"0.3353102189781022"},"color":"rgb(67,229,164)","size":16.666667938232422},{"label":"André Almeida","x":-733.0572509765625,"y":266.98699951171875,"id":"42","attributes":{"Eigenvector Centrality":"0.4623139362600412","Betweenness Centrality":"0.0011159545915913598","Appearances":"5","No":"19","Country":"Portugal","Club Country":"Portugal","Club":"Benfica","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"10 September 1990 (aged 23)","Degree":"25","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.31722054380664655"},"color":"rgb(229,164,67)","size":14.0},{"label":"Aleksandr Kokorin","x":-1414.3739013671875,"y":-1377.2596435546875,"id":"22","attributes":{"Eigenvector Centrality":"0.2816622746350614","Betweenness Centrality":"6.368705012250895E-4","Appearances":"21","No":"9","Country":"Russia","Club Country":"Russia","Club":"Dynamo Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"19 March 1991 (aged 23)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.25538568450312715"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Felipe Gutiérrez","x":-184.13504028320312,"y":1490.4881591796875,"id":"223","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"18","No":"16","Country":"Chile","Club Country":"Netherlands","Club":"Twente","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"8 October 1990 (aged 23)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Simon Mignolet","x":-491.4549255371094,"y":-919.83154296875,"id":"654","attributes":{"Eigenvector Centrality":"0.7087966227214388","Betweenness Centrality":"0.004200915543181152","Appearances":"14","No":"12","Country":"Belgium","Club Country":"England","Club":"Liverpool","Weighted Degree":"31.0","Modularity Class":"28","Date of birth / Age":"6 August 1988 (aged 25)","Degree":"31","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.34329752452125173"},"color":"rgb(67,229,132)","size":22.0},{"label":"Maxwell","x":-388.1637878417969,"y":-99.59259033203125,"id":"490","attributes":{"Eigenvector Centrality":"0.7136149540335622","Betweenness Centrality":"0.0035076449501830744","Appearances":"9","No":"14","Country":"Brazil","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"30.0","Modularity Class":"23","Date of birth / Age":"27 August 1981 (aged 32)","Degree":"30","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3336359509759419"},"color":"rgb(229,67,197)","size":20.666667938232422},{"label":"Mohamed Zemmamouche","x":-1405.252685546875,"y":1223.2103271484375,"id":"519","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"7","No":"16","Country":"Algeria","Club Country":"Algeria","Club":"USM Alger","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"19 March 1985 (aged 29)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Ciro Immobile","x":317.4281921386719,"y":794.2503662109375,"id":"123","attributes":{"Eigenvector Centrality":"0.43196054419267377","Betweenness Centrality":"0.0018820457212751422","Appearances":"2","No":"17","Country":"Italy","Club Country":"Italy","Club":"Torino","Weighted Degree":"23.0","Modularity Class":"3","Date of birth / Age":"20 February 1990 (aged 24)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30497925311203317"},"color":"rgb(197,229,67)","size":11.333333015441895},{"label":"Stipe Pletikosa","x":-333.28179931640625,"y":696.1630249023438,"id":"669","attributes":{"Eigenvector Centrality":"0.34443939620173625","Betweenness Centrality":"0.0","Appearances":"111","No":"1","Country":"Croatia","Club Country":"Russia","Club":"Rostov","Weighted Degree":"22.0","Modularity Class":"25","Date of birth / Age":"8 January 1979 (aged 35)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.29178245335450576"},"color":"rgb(132,67,229)","size":10.0},{"label":"Ismaël Diomandé","x":445.3325500488281,"y":-874.9510498046875,"id":"297","attributes":{"Eigenvector Centrality":"0.3273739867705004","Betweenness Centrality":"5.067313329973086E-4","Appearances":"2","No":"14","Country":"Ivory Coast","Club Country":"France","Club":"Saint-Étienne","Weighted Degree":"23.0","Modularity Class":"9","Date of birth / Age":"28 August 1992 (aged 21)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30548628428927677"},"color":"rgb(164,67,229)","size":11.333333015441895},{"label":"Roger Espinoza","x":1525.8236083984375,"y":-1042.1474609375,"id":"609","attributes":{"Eigenvector Centrality":"0.24958708367603963","Betweenness Centrality":"0.00224748146417088","Appearances":"42","No":"15","Country":"Honduras","Club Country":"England","Club":"Wigan Athletic","Weighted Degree":"23.0","Modularity Class":"7","Date of birth / Age":"25 October 1986 (aged 27)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,67,229)","size":11.333333015441895},{"label":"Júnior DÃaz","x":2052.333251953125,"y":457.9170837402344,"id":"378","attributes":{"Eigenvector Centrality":"0.2858658445617843","Betweenness Centrality":"0.019511326160720172","Appearances":"62","No":"15","Country":"Costa Rica","Club Country":"Germany","Club":"Mainz 05","Weighted Degree":"26.0","Modularity Class":"29","Date of birth / Age":"12 September 1983 (aged 30)","Degree":"26","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2916666666666667"},"color":"rgb(229,229,67)","size":15.333333969116211},{"label":"Diego Pérez","x":71.02754211425781,"y":37.87593078613281,"id":"168","attributes":{"Eigenvector Centrality":"0.3977686122666346","Betweenness Centrality":"0.008159853566079373","Appearances":"89","No":"15","Country":"Uruguay","Club Country":"Italy","Club":"Bologna","Weighted Degree":"24.0","Modularity Class":"6","Date of birth / Age":"18 May 1980 (aged 34)","Degree":"24","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.32637655417406747"},"color":"rgb(229,197,67)","size":12.666666984558105},{"label":"Danijel SubaÅ¡ic","x":-426.1968078613281,"y":636.2631225585938,"id":"143","attributes":{"Eigenvector Centrality":"0.39279324564134416","Betweenness Centrality":"0.002055537854408172","Appearances":"6","No":"23","Country":"Croatia","Club Country":"France","Club":"AS Monaco","Weighted Degree":"25.0","Modularity Class":"25","Date of birth / Age":"27 October 1984 (aged 29)","Degree":"25","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3150450064294899"},"color":"rgb(132,67,229)","size":14.0},{"label":"Luis Suárez","x":-100.21392822265625,"y":-246.3746795654297,"id":"430","attributes":{"Eigenvector Centrality":"0.5668349766194245","Betweenness Centrality":"0.005273786093229346","Appearances":"77","No":"9","Country":"Uruguay","Club Country":"England","Club":"Liverpool","Weighted Degree":"31.0","Modularity Class":"6","Date of birth / Age":"24 January 1987 (aged 27)","Degree":"31","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3365384615384615"},"color":"rgb(229,197,67)","size":22.0},{"label":"Marvin Chávez","x":1429.798828125,"y":-1179.989501953125,"id":"464","attributes":{"Eigenvector Centrality":"0.25036259885703577","Betweenness Centrality":"0.004810204715637005","Appearances":"42","No":"23","Country":"Honduras","Club Country":"United States","Club":"Chivas USA","Weighted Degree":"23.0","Modularity Class":"7","Date of birth / Age":"3 November 1983 (aged 30)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28171713300114987"},"color":"rgb(100,67,229)","size":11.333333015441895},{"label":"Allan Nyom","x":381.5302734375,"y":285.7757568359375,"id":"37","attributes":{"Eigenvector Centrality":"0.3467862797568034","Betweenness Centrality":"0.00587663072397192","Appearances":"10","No":"22","Country":"Cameroon","Club Country":"Spain","Club":"Granada","Weighted Degree":"24.0","Modularity Class":"17","Date of birth / Age":"10 May 1988 (aged 26)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3328804347826087"},"color":"rgb(67,132,229)","size":12.666666984558105},{"label":"Santiago Arias","x":-524.8426513671875,"y":1069.8533935546875,"id":"630","attributes":{"Eigenvector Centrality":"0.35261132545784823","Betweenness Centrality":"0.01168806541697648","Appearances":"6","No":"4","Country":"Colombia","Club Country":"Netherlands","Club":"PSV","Weighted Degree":"25.0","Modularity Class":"11","Date of birth / Age":"13 January 1992 (aged 22)","Degree":"25","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.3168103448275862"},"color":"rgb(67,67,229)","size":14.0},{"label":"Óscar Duarte","x":2292.369873046875,"y":190.4766845703125,"id":"550","attributes":{"Eigenvector Centrality":"0.2448400755989879","Betweenness Centrality":"0.004512594233796394","Appearances":"11","No":"6","Country":"Costa Rica","Club Country":"Belgium","Club":"Club Brugge","Weighted Degree":"23.0","Modularity Class":"29","Date of birth / Age":"3 June 1989 (aged 25)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2558301427079708"},"color":"rgb(229,229,67)","size":11.333333015441895},{"label":"Abdelmoumene Djabou","x":-1392.5499267578125,"y":1124.161376953125,"id":"1","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"8","No":"18","Country":"Algeria","Club Country":"Tunisia","Club":"Club Africain","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"31 January 1987 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Juwon Oshaniwa","x":-3.99511456489563,"y":-1656.1483154296875,"id":"379","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"10","No":"13","Country":"Nigeria","Club Country":"Israel","Club":"Ashdod","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"14 September 1990 (aged 23)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Francisco Silva","x":-207.91714477539062,"y":1451.440673828125,"id":"230","attributes":{"Eigenvector Centrality":"0.316119262177923","Betweenness Centrality":"0.0","Appearances":"12","No":"5","Country":"Chile","Club Country":"Spain","Club":"Osasuna","Weighted Degree":"22.0","Modularity Class":"18","Date of birth / Age":"11 February 1986 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2737430167597765"},"color":"rgb(229,132,67)","size":10.0},{"label":"Jason Davidson","x":2027.00927734375,"y":-621.2344360351562,"id":"313","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"7","No":"3","Country":"Australia","Club Country":"Netherlands","Club":"Heracles Almelo","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"29 June 1991 (aged 22)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Mousa Dembélé","x":-780.701416015625,"y":-765.0794067382812,"id":"522","attributes":{"Eigenvector Centrality":"0.5781054780643133","Betweenness Centrality":"0.0013899483715746057","Appearances":"57","No":"19","Country":"Belgium","Club Country":"England","Club":"Tottenham Hotspur","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"16 July 1987 (aged 26)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33638443935926776"},"color":"rgb(67,229,132)","size":14.0},{"label":"David de Gea","x":-916.8024291992188,"y":-469.9519348144531,"id":"150","attributes":{"Eigenvector Centrality":"1.0","Betweenness Centrality":"0.005194225936839837","Appearances":"1","No":"12","Country":"Spain","Club Country":"England","Club":"Manchester United","Weighted Degree":"34.0","Modularity Class":"23","Date of birth / Age":"7 November 1990 (aged 23)","Degree":"34","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3478466635115949"},"color":"rgb(229,67,197)","size":26.0},{"label":"Tim Cahill","x":2114.5048828125,"y":-511.01007080078125,"id":"680","attributes":{"Eigenvector Centrality":"0.2315995769978224","Betweenness Centrality":"0.0038336165219305914","Appearances":"69","No":"4","Country":"Australia","Club Country":"United States","Club":"New York Red Bulls","Weighted Degree":"23.0","Modularity Class":"12","Date of birth / Age":"6 December 1979 (aged 34)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.23535062439961577"},"color":"rgb(229,100,67)","size":11.333333015441895},{"label":"Dimitris Salpingidis","x":1578.1973876953125,"y":570.6368408203125,"id":"170","attributes":{"Eigenvector Centrality":"0.2581333696341679","Betweenness Centrality":"0.0","Appearances":"76","No":"14","Country":"Greece","Club Country":"Greece","Club":"PAOK","Weighted Degree":"22.0","Modularity Class":"15","Date of birth / Age":"18 August 1981 (aged 32)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2760045061960195"},"color":"rgb(229,67,100)","size":10.0},{"label":"Arturo Vidal","x":-116.50799560546875,"y":1233.550048828125,"id":"64","attributes":{"Eigenvector Centrality":"0.5204561062047255","Betweenness Centrality":"0.00860736609402208","Appearances":"54","No":"8","Country":"Chile","Club Country":"Italy","Club":"Juventus","Weighted Degree":"32.0","Modularity Class":"18","Date of birth / Age":"22 May 1987 (aged 27)","Degree":"32","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.31599312123817713"},"color":"rgb(229,132,67)","size":23.33333396911621},{"label":"Andy Najar","x":1494.201416015625,"y":-1172.4866943359375,"id":"52","attributes":{"Eigenvector Centrality":"0.25486924877772427","Betweenness Centrality":"0.0055302334935236706","Appearances":"17","No":"17","Country":"Honduras","Club Country":"Belgium","Club":"Anderlecht","Weighted Degree":"23.0","Modularity Class":"7","Date of birth / Age":"16 March 1993 (aged 21)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.28880157170923376"},"color":"rgb(100,67,229)","size":11.333333015441895},{"label":"Alex Song","x":-256.0782775878906,"y":56.99077224731445,"id":"28","attributes":{"Eigenvector Centrality":"0.764223422109595","Betweenness Centrality":"0.016336622858350185","Appearances":"47","No":"6","Country":"Cameroon","Club Country":"Spain","Club":"Barcelona","Weighted Degree":"37.0","Modularity Class":"17","Date of birth / Age":"9 September 1987 (aged 26)","Degree":"37","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34106728538283065"},"color":"rgb(67,132,229)","size":30.0},{"label":"Georgi Shchennikov","x":-1330.42041015625,"y":-1544.396240234375,"id":"243","attributes":{"Eigenvector Centrality":"0.279753045029421","Betweenness Centrality":"8.329697214751982E-4","Appearances":"4","No":"3","Country":"Russia","Club Country":"Russia","Club":"CSKA Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"27 April 1991 (aged 23)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.2544132917964694"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Mathew Leckie","x":2138.549072265625,"y":-562.8361206054688,"id":"470","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"8","No":"7","Country":"Australia","Club Country":"Germany","Club":"FSV Frankfurt","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"4 February 1991 (aged 23)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"James Holland","x":2105.74951171875,"y":-645.3329467773438,"id":"307","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"14","No":"16","Country":"Australia","Club Country":"Austria","Club":"Austria Wien","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"15 May 1989 (aged 25)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Stéphane Ruffier","x":44.78597640991211,"y":-265.3774108886719,"id":"663","attributes":{"Eigenvector Centrality":"0.5087837777709764","Betweenness Centrality":"0.0017249059427091587","Appearances":"2","No":"16","Country":"France","Club Country":"France","Club":"Saint-Étienne","Weighted Degree":"24.0","Modularity Class":"16","Date of birth / Age":"27 September 1986 (aged 27)","Degree":"24","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.3164012053379251"},"color":"rgb(229,67,229)","size":12.666666984558105},{"label":"Salvatore Sirigu","x":133.34747314453125,"y":646.74609375,"id":"622","attributes":{"Eigenvector Centrality":"0.5779444332967031","Betweenness Centrality":"0.001710601263663759","Appearances":"8","No":"12","Country":"Italy","Club Country":"France","Club":"Paris Saint-Germain","Weighted Degree":"29.0","Modularity Class":"3","Date of birth / Age":"12 January 1987 (aged 27)","Degree":"29","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3166738474795347"},"color":"rgb(197,229,67)","size":19.333332061767578},{"label":"Rashid Sumaila","x":457.3916015625,"y":1442.739013671875,"id":"590","attributes":{"Eigenvector Centrality":"0.2902743690727881","Betweenness Centrality":"0.0","Appearances":"6","No":"15","Country":"Ghana","Club Country":"South Africa","Club":"Mamelodi Sundowns","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"18 December 1992 (aged 21)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Panagiotis Tachtsidis","x":1428.6138916015625,"y":635.1239013671875,"id":"558","attributes":{"Eigenvector Centrality":"0.3047172931159461","Betweenness Centrality":"0.006160383817594169","Appearances":"6","No":"23","Country":"Greece","Club Country":"Italy","Club":"Torino","Weighted Degree":"25.0","Modularity Class":"15","Date of birth / Age":"15 February 1991 (aged 23)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.29016975917883936"},"color":"rgb(229,67,100)","size":14.0},{"label":"Antonio Valencia (c)","x":-1293.8275146484375,"y":-612.4883422851562,"id":"60","attributes":{"Eigenvector Centrality":"0.7194865947551579","Betweenness Centrality":"0.016480573584016885","Appearances":"71","No":"16","Country":"Ecuador","Club Country":"England","Club":"Manchester United","Weighted Degree":"35.0","Modularity Class":"4","Date of birth / Age":"4 August 1985 (aged 28)","Degree":"35","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33607681755829905"},"color":"rgb(229,67,132)","size":27.33333396911621},{"label":"Hashem Beikzadeh","x":1986.336181640625,"y":1189.6458740234375,"id":"273","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"17","No":"19","Country":"Iran","Club Country":"Iran","Club":"Esteghlal","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"22 January 1984 (aged 30)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Rafa Silva","x":-692.36767578125,"y":355.65155029296875,"id":"580","attributes":{"Eigenvector Centrality":"0.40962360528145025","Betweenness Centrality":"0.0","Appearances":"3","No":"15","Country":"Portugal","Club Country":"Portugal","Club":"Braga","Weighted Degree":"22.0","Modularity Class":"8","Date of birth / Age":"17 May 1993 (aged 21)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30714584203928125"},"color":"rgb(229,164,67)","size":10.0},{"label":"Loïc Rémy","x":73.68376922607422,"y":-313.17633056640625,"id":"421","attributes":{"Eigenvector Centrality":"0.5292224497836601","Betweenness Centrality":"0.0019647591823339743","Appearances":"25","No":"20","Country":"France","Club Country":"England","Club":"Newcastle United","Weighted Degree":"25.0","Modularity Class":"16","Date of birth / Age":"2 January 1987 (aged 27)","Degree":"25","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.3315290933694181"},"color":"rgb(229,67,229)","size":14.0},{"label":"Jean-Daniel Akpa-Akpro","x":413.52197265625,"y":-756.9923706054688,"id":"322","attributes":{"Eigenvector Centrality":"0.32268769768515043","Betweenness Centrality":"0.002014868000803819","Appearances":"1","No":"7","Country":"Ivory Coast","Club Country":"France","Club":"Toulouse","Weighted Degree":"23.0","Modularity Class":"9","Date of birth / Age":"11 October 1992 (aged 21)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30817610062893086"},"color":"rgb(164,67,229)","size":11.333333015441895},{"label":"Giorgos Tzavellas","x":1582.3857421875,"y":615.6647338867188,"id":"255","attributes":{"Eigenvector Centrality":"0.25813336963416794","Betweenness Centrality":"0.0","Appearances":"13","No":"3","Country":"Greece","Club Country":"Greece","Club":"PAOK","Weighted Degree":"22.0","Modularity Class":"15","Date of birth / Age":"26 November 1987 (aged 26)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2760045061960195"},"color":"rgb(229,67,100)","size":10.0},{"label":"Fred","x":-513.3817749023438,"y":-260.2742919921875,"id":"233","attributes":{"Eigenvector Centrality":"0.5425650576268323","Betweenness Centrality":"0.0","Appearances":"33","No":"9","Country":"Brazil","Club Country":"Brazil","Club":"Fluminense","Weighted Degree":"22.0","Modularity Class":"23","Date of birth / Age":"3 October 1983 (aged 30)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3158573270305114"},"color":"rgb(229,67,197)","size":10.0},{"label":"Per Mertesacker","x":261.4919738769531,"y":-532.3377075195312,"id":"573","attributes":{"Eigenvector Centrality":"0.6437896004097902","Betweenness Centrality":"0.002673471053911242","Appearances":"98","No":"17","Country":"Germany","Club Country":"England","Club":"Arsenal","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"29 September 1984 (aged 29)","Degree":"29","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3219448094612352"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Hernanes","x":-528.0017700195312,"y":-15.909561157226562,"id":"280","attributes":{"Eigenvector Centrality":"0.669052616458677","Betweenness Centrality":"0.005981834884331946","Appearances":"24","No":"18","Country":"Brazil","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"29.0","Modularity Class":"23","Date of birth / Age":"29 May 1985 (aged 29)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.34281716417910446"},"color":"rgb(229,67,197)","size":19.333332061767578},{"label":"Máximo Banguera","x":-1488.96337890625,"y":-533.3309326171875,"id":"489","attributes":{"Eigenvector Centrality":"0.7525405481416904","Betweenness Centrality":"0.006691544296226193","Appearances":"25","No":"1","Country":"Ecuador","Club Country":"Ecuador","Club":"Barcelona","Weighted Degree":"35.0","Modularity Class":"4","Date of birth / Age":"16 December 1985 (aged 28)","Degree":"35","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(229,67,132)","size":27.33333396911621},{"label":"Eliaquim Mangala","x":-347.64447021484375,"y":-15.025993347167969,"id":"196","attributes":{"Eigenvector Centrality":"0.6278043521909648","Betweenness Centrality":"0.009092242970245117","Appearances":"3","No":"13","Country":"France","Club Country":"Portugal","Club":"Porto","Weighted Degree":"30.0","Modularity Class":"16","Date of birth / Age":"13 February 1991 (aged 23)","Degree":"30","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.33669262482821805"},"color":"rgb(229,67,229)","size":20.666667938232422},{"label":"Ãlvaro Pereira","x":-93.80169677734375,"y":34.24333190917969,"id":"39","attributes":{"Eigenvector Centrality":"0.37564528732258246","Betweenness Centrality":"0.0","Appearances":"57","No":"6","Country":"Uruguay","Club Country":"Brazil","Club":"São Paulo","Weighted Degree":"22.0","Modularity Class":"6","Date of birth / Age":"28 November 1985 (aged 28)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3121019108280255"},"color":"rgb(229,197,67)","size":10.0},{"label":"Miguel Veloso","x":-552.1939086914062,"y":364.9159240722656,"id":"511","attributes":{"Eigenvector Centrality":"0.4519394040645381","Betweenness Centrality":"0.0020459479374588265","Appearances":"49","No":"4","Country":"Portugal","Club Country":"Ukraine","Club":"Dynamo Kyiv","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"11 May 1986 (aged 28)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(229,164,67)","size":14.0},{"label":"Saphir Taïder","x":-1233.49755859375,"y":1029.03173828125,"id":"631","attributes":{"Eigenvector Centrality":"0.4289736525122905","Betweenness Centrality":"0.007067153381945787","Appearances":"11","No":"19","Country":"Algeria","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"29.0","Modularity Class":"24","Date of birth / Age":"29 February 1992 (aged 22)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3208206023570493"},"color":"rgb(67,164,229)","size":19.333332061767578},{"label":"Dirk Kuyt","x":698.8324584960938,"y":-15.171172142028809,"id":"171","attributes":{"Eigenvector Centrality":"0.3965357475889929","Betweenness Centrality":"0.004158989584106385","Appearances":"98","No":"15","Country":"Netherlands","Club Country":"Turkey","Club":"Fenerbahçe","Weighted Degree":"26.0","Modularity Class":"22","Date of birth / Age":"22 July 1980 (aged 33)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.329153605015674"},"color":"rgb(197,67,229)","size":15.333333969116211},{"label":"Jorge Guagua","x":-1678.4407958984375,"y":-602.8709716796875,"id":"353","attributes":{"Eigenvector Centrality":"0.3623062182068214","Betweenness Centrality":"0.0","Appearances":"59","No":"2","Country":"Ecuador","Club Country":"Ecuador","Club":"Emelec","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"28 September 1981 (aged 32)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Keisuke Honda","x":610.3965454101562,"y":750.2002563476562,"id":"382","attributes":{"Eigenvector Centrality":"0.4349752953094465","Betweenness Centrality":"0.007469372100698354","Appearances":"56","No":"4","Country":"Japan","Club Country":"Italy","Club":"Milan","Weighted Degree":"29.0","Modularity Class":"27","Date of birth / Age":"13 June 1986 (aged 27)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3309320126069338"},"color":"rgb(67,100,229)","size":19.333332061767578},{"label":"Cédric Si Mohamed","x":-1432.4459228515625,"y":1140.2423095703125,"id":"108","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"1","No":"1","Country":"Algeria","Club Country":"Algeria","Club":"CS Constantine","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"9 January 1985 (aged 29)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"Tino-Sven SuÅ¡ic","x":1264.1190185546875,"y":-534.239990234375,"id":"684","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"2","No":"14","Country":"Bosnia and Herzegovina","Club Country":"Croatia","Club":"Hajduk Split","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"13 February 1992 (aged 22)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Samuel Eto\u0027o (c)","x":207.89883422851562,"y":-77.14188385009766,"id":"627","attributes":{"Eigenvector Centrality":"0.6120719582915053","Betweenness Centrality":"0.010941183209963411","Appearances":"117","No":"9","Country":"Cameroon","Club Country":"England","Club":"Chelsea","Weighted Degree":"33.0","Modularity Class":"17","Date of birth / Age":"10 March 1981 (aged 33)","Degree":"33","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.34507042253521125"},"color":"rgb(67,132,229)","size":24.666667938232422},{"label":"Karim Ansarifard","x":2030.397705078125,"y":1187.7640380859375,"id":"380","attributes":{"Eigenvector Centrality":"0.2127442934422965","Betweenness Centrality":"0.0","Appearances":"42","No":"10","Country":"Iran","Club Country":"Iran","Club":"Tractor Sazi","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"3 April 1990 (aged 24)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Uche Nwofor","x":-33.313961029052734,"y":-1701.16748046875,"id":"691","attributes":{"Eigenvector Centrality":"0.30581490023520397","Betweenness Centrality":"0.0","Appearances":"6","No":"19","Country":"Nigeria","Club Country":"Netherlands","Club":"Heerenveen","Weighted Degree":"22.0","Modularity Class":"14","Date of birth / Age":"17 September 1991 (aged 22)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.28800940438871475"},"color":"rgb(67,229,100)","size":10.0},{"label":"Michael Umaña","x":2330.072509765625,"y":379.5473937988281,"id":"506","attributes":{"Eigenvector Centrality":"0.23496944760866376","Betweenness Centrality":"0.0","Appearances":"83","No":"4","Country":"Costa Rica","Club Country":"Costa Rica","Club":"Saprissa","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"16 July 1982 (aged 31)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Jordan Ayew","x":418.2088317871094,"y":1351.912841796875,"id":"347","attributes":{"Eigenvector Centrality":"0.29027436907278803","Betweenness Centrality":"0.0","Appearances":"13","No":"13","Country":"Ghana","Club Country":"France","Club":"Sochaux","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"11 September 1991 (aged 22)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Ron Vlaar","x":922.5167236328125,"y":-99.8844985961914,"id":"613","attributes":{"Eigenvector Centrality":"0.3465757821519946","Betweenness Centrality":"0.0018348657473652398","Appearances":"24","No":"2","Country":"Netherlands","Club Country":"England","Club":"Aston Villa","Weighted Degree":"23.0","Modularity Class":"22","Date of birth / Age":"16 February 1985 (aged 29)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3139683895771038"},"color":"rgb(197,67,229)","size":11.333333015441895},{"label":"Aleksandr Samedov","x":-1362.3624267578125,"y":-1347.75,"id":"23","attributes":{"Eigenvector Centrality":"0.2790405449937141","Betweenness Centrality":"0.003584997128855062","Appearances":"17","No":"19","Country":"Russia","Club Country":"Russia","Club":"Lokomotiv Moscow","Weighted Degree":"23.0","Modularity Class":"2","Date of birth / Age":"19 July 1984 (aged 29)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.2573529411764706"},"color":"rgb(229,67,67)","size":11.333333015441895},{"label":"Hugo Almeida","x":-570.7293090820312,"y":230.9239959716797,"id":"286","attributes":{"Eigenvector Centrality":"0.43486864997258184","Betweenness Centrality":"0.00453740780637059","Appearances":"55","No":"9","Country":"Portugal","Club Country":"Turkey","Club":"Be?ikta?","Weighted Degree":"24.0","Modularity Class":"8","Date of birth / Age":"23 May 1984 (aged 30)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3253652058432935"},"color":"rgb(229,164,67)","size":12.666666984558105},{"label":"Federico Fernández","x":-945.4159545898438,"y":329.44189453125,"id":"221","attributes":{"Eigenvector Centrality":"0.7220713713108182","Betweenness Centrality":"0.003097438956551802","Appearances":"26","No":"17","Country":"Argentina","Club Country":"Italy","Club":"Napoli","Weighted Degree":"32.0","Modularity Class":"19","Date of birth / Age":"21 February 1989 (aged 25)","Degree":"32","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3313796212804328"},"color":"rgb(67,229,229)","size":23.33333396911621},{"label":"Edin Džeko","x":747.855712890625,"y":-487.78179931640625,"id":"183","attributes":{"Eigenvector Centrality":"0.4959287278586879","Betweenness Centrality":"0.019893239141010762","Appearances":"62","No":"11","Country":"Bosnia and Herzegovina","Club Country":"England","Club":"Manchester City","Weighted Degree":"31.0","Modularity Class":"20","Date of birth / Age":"17 March 1986 (aged 28)","Degree":"31","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3436185133239832"},"color":"rgb(132,229,67)","size":22.0},{"label":"Fatau Dauda","x":508.3158874511719,"y":1362.838134765625,"id":"220","attributes":{"Eigenvector Centrality":"0.29027436907278803","Betweenness Centrality":"0.0","Appearances":"18","No":"16","Country":"Ghana","Club Country":"South Africa","Club":"Orlando Pirates","Weighted Degree":"22.0","Modularity Class":"5","Date of birth / Age":"6 April 1985 (aged 29)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2849941837921675"},"color":"rgb(67,229,197)","size":10.0},{"label":"Giorgio Chiellini","x":168.96609497070312,"y":898.1615600585938,"id":"252","attributes":{"Eigenvector Centrality":"0.5455496050511397","Betweenness Centrality":"0.0016215443882875223","Appearances":"68","No":"3","Country":"Italy","Club Country":"Italy","Club":"Juventus","Weighted Degree":"28.0","Modularity Class":"3","Date of birth / Age":"14 August 1984 (aged 29)","Degree":"28","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3242170269078077"},"color":"rgb(197,229,67)","size":18.0},{"label":"Éder","x":-652.5069580078125,"y":328.9391174316406,"id":"180","attributes":{"Eigenvector Centrality":"0.4096236052814504","Betweenness Centrality":"0.0","Appearances":"8","No":"11","Country":"Portugal","Club Country":"Portugal","Club":"Braga","Weighted Degree":"22.0","Modularity Class":"8","Date of birth / Age":"22 December 1987 (aged 26)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30714584203928125"},"color":"rgb(229,164,67)","size":10.0},{"label":"Édison Méndez","x":-1680.7288818359375,"y":-523.7875366210938,"id":"186","attributes":{"Eigenvector Centrality":"0.37488664289499546","Betweenness Centrality":"0.003053300601509073","Appearances":"110","No":"8","Country":"Ecuador","Club Country":"Colombia","Club":"Santa Fe","Weighted Degree":"23.0","Modularity Class":"4","Date of birth / Age":"15 March 1979 (aged 35)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3001224989791752"},"color":"rgb(229,67,132)","size":11.333333015441895},{"label":"Hugo Lloris (c)","x":-181.9427032470703,"y":-259.6800842285156,"id":"288","attributes":{"Eigenvector Centrality":"0.579458372910698","Betweenness Centrality":"0.002663127912981995","Appearances":"57","No":"1","Country":"France","Club Country":"England","Club":"Tottenham Hotspur","Weighted Degree":"27.0","Modularity Class":"16","Date of birth / Age":"26 December 1986 (aged 27)","Degree":"27","Position":"GK","Eccentricity":"6.0","Closeness Centrality":"0.32407407407407407"},"color":"rgb(229,67,229)","size":16.666667938232422},{"label":"Ricardo Ãlvarez","x":-991.7132568359375,"y":419.20452880859375,"id":"600","attributes":{"Eigenvector Centrality":"0.5658107599692682","Betweenness Centrality":"0.0025393109943757006","Appearances":"7","No":"19","Country":"Argentina","Club Country":"Italy","Club":"Internazionale","Weighted Degree":"27.0","Modularity Class":"19","Date of birth / Age":"12 April 1988 (aged 26)","Degree":"27","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3272484416740873"},"color":"rgb(67,229,229)","size":16.666667938232422},{"label":"Sofiane Feghouli","x":-1244.94921875,"y":1115.6298828125,"id":"655","attributes":{"Eigenvector Centrality":"0.3592587866347209","Betweenness Centrality":"0.005117058445342943","Appearances":"19","No":"10","Country":"Algeria","Club Country":"Spain","Club":"Valencia","Weighted Degree":"26.0","Modularity Class":"24","Date of birth / Age":"26 December 1989 (aged 24)","Degree":"26","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.30973451327433627"},"color":"rgb(67,164,229)","size":15.333333969116211},{"label":"Cristiano Ronaldo (c)","x":-705.8994140625,"y":163.7381134033203,"id":"131","attributes":{"Eigenvector Centrality":"0.651122142378051","Betweenness Centrality":"0.002704889595809238","Appearances":"111","No":"7","Country":"Portugal","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"31.0","Modularity Class":"8","Date of birth / Age":"5 February 1985 (aged 29)","Degree":"31","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.33546325878594246"},"color":"rgb(229,164,67)","size":22.0},{"label":"John Obi Mikel","x":-197.90223693847656,"y":-1324.32470703125,"id":"342","attributes":{"Eigenvector Centrality":"0.5955495363924806","Betweenness Centrality":"0.01100579205017528","Appearances":"59","No":"10","Country":"Nigeria","Club Country":"England","Club":"Chelsea","Weighted Degree":"33.0","Modularity Class":"14","Date of birth / Age":"22 April 1987 (aged 27)","Degree":"33","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3295964125560538"},"color":"rgb(67,229,100)","size":24.666667938232422},{"label":"Roy Miller","x":2341.18359375,"y":210.36285400390625,"id":"617","attributes":{"Eigenvector Centrality":"0.2448400755989879","Betweenness Centrality":"0.004512594233796391","Appearances":"48","No":"19","Country":"Costa Rica","Club Country":"United States","Club":"New York Red Bulls","Weighted Degree":"23.0","Modularity Class":"29","Date of birth / Age":"24 November 1984 (aged 29)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2558301427079708"},"color":"rgb(229,229,67)","size":11.333333015441895},{"label":"Kostas Mitroglou","x":1704.1070556640625,"y":623.1121215820312,"id":"402","attributes":{"Eigenvector Centrality":"0.26821419599108537","Betweenness Centrality":"0.011764360515140076","Appearances":"32","No":"9","Country":"Greece","Club Country":"England","Club":"Fulham","Weighted Degree":"23.0","Modularity Class":"15","Date of birth / Age":"12 March 1988 (aged 26)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.2784090909090909"},"color":"rgb(229,67,100)","size":11.333333015441895},{"label":"Daniel Opare","x":399.6513366699219,"y":1199.5255126953125,"id":"138","attributes":{"Eigenvector Centrality":"0.3223336840810573","Betweenness Centrality":"0.004091587855968099","Appearances":"16","No":"4","Country":"Ghana","Club Country":"Belgium","Club":"Standard Liège","Weighted Degree":"24.0","Modularity Class":"5","Date of birth / Age":"18 October 1990 (aged 23)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.30973451327433627"},"color":"rgb(67,229,197)","size":12.666666984558105},{"label":"Jean Beausejour","x":-67.39273834228516,"y":1286.549072265625,"id":"320","attributes":{"Eigenvector Centrality":"0.336908513308338","Betweenness Centrality":"0.005662725175478597","Appearances":"59","No":"15","Country":"Chile","Club Country":"England","Club":"Wigan Athletic","Weighted Degree":"24.0","Modularity Class":"18","Date of birth / Age":"3 June 1984 (aged 30)","Degree":"24","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.28891509433962265"},"color":"rgb(229,132,67)","size":12.666666984558105},{"label":"Erik Durm","x":553.0518188476562,"y":-438.38714599609375,"id":"203","attributes":{"Eigenvector Centrality":"0.500680986024227","Betweenness Centrality":"0.008472576600609625","Appearances":"1","No":"15","Country":"Germany","Club Country":"Germany","Club":"Borussia Dortmund","Weighted Degree":"24.0","Modularity Class":"13","Date of birth / Age":"12 May 1992 (aged 22)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.310126582278481"},"color":"rgb(67,229,164)","size":12.666666984558105},{"label":"Egidio Arévalo RÃos","x":-140.44900512695312,"y":-11.467087745666504,"id":"191","attributes":{"Eigenvector Centrality":"0.3894572111283446","Betweenness Centrality":"0.002989706787662918","Appearances":"55","No":"17","Country":"Uruguay","Club Country":"Mexico","Club":"Morelia","Weighted Degree":"23.0","Modularity Class":"6","Date of birth / Age":"1 January 1982 (aged 32)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31873373807458805"},"color":"rgb(229,197,67)","size":11.333333015441895},{"label":"Raul Meireles","x":-515.27490234375,"y":255.2202911376953,"id":"593","attributes":{"Eigenvector Centrality":"0.45315937558107944","Betweenness Centrality":"0.0029488481093627983","Appearances":"74","No":"16","Country":"Portugal","Club Country":"Turkey","Club":"Fenerbahçe","Weighted Degree":"25.0","Modularity Class":"8","Date of birth / Age":"17 March 1983 (aged 31)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3295964125560538"},"color":"rgb(229,164,67)","size":14.0},{"label":"Maicon","x":-278.0897216796875,"y":-249.45703125,"id":"436","attributes":{"Eigenvector Centrality":"0.6006324446964797","Betweenness Centrality":"0.010333588970217586","Appearances":"72","No":"23","Country":"Brazil","Club Country":"Italy","Club":"Roma","Weighted Degree":"26.0","Modularity Class":"23","Date of birth / Age":"26 July 1981 (aged 32)","Degree":"26","Position":"DF","Eccentricity":"4.0","Closeness Centrality":"0.3475177304964539"},"color":"rgb(229,67,197)","size":15.333333969116211},{"label":"Luke Shaw","x":-92.2292251586914,"y":-688.8857421875,"id":"434","attributes":{"Eigenvector Centrality":"0.5904515327423896","Betweenness Centrality":"0.0016054547217210155","Appearances":"2","No":"23","Country":"England","Club Country":"England","Club":"Southampton","Weighted Degree":"26.0","Modularity Class":"28","Date of birth / Age":"12 July 1995 (aged 18)","Degree":"26","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.32407407407407407"},"color":"rgb(67,229,132)","size":15.333333969116211},{"label":"Toni Kroos","x":364.4765319824219,"y":-371.8941650390625,"id":"687","attributes":{"Eigenvector Centrality":"0.6585766805388439","Betweenness Centrality":"0.0026429368589338613","Appearances":"44","No":"18","Country":"Germany","Club Country":"Germany","Club":"Bayern Munich","Weighted Degree":"29.0","Modularity Class":"13","Date of birth / Age":"4 January 1990 (aged 24)","Degree":"29","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3390221402214022"},"color":"rgb(67,229,164)","size":19.333332061767578},{"label":"Antonio Cassano","x":193.04763793945312,"y":758.9298706054688,"id":"59","attributes":{"Eigenvector Centrality":"0.44952910121457806","Betweenness Centrality":"4.3533065978638123E-4","Appearances":"37","No":"10","Country":"Italy","Club Country":"Italy","Club":"Parma","Weighted Degree":"24.0","Modularity Class":"3","Date of birth / Age":"12 July 1982 (aged 31)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.30714584203928125"},"color":"rgb(197,229,67)","size":12.666666984558105},{"label":"Son Heung-min","x":1048.6976318359375,"y":1445.7691650390625,"id":"658","attributes":{"Eigenvector Centrality":"0.2555712186488899","Betweenness Centrality":"0.010566232255619219","Appearances":"25","No":"9","Country":"South Korea","Club Country":"Germany","Club":"Bayer Leverkusen","Weighted Degree":"24.0","Modularity Class":"10","Date of birth / Age":"8 July 1992 (aged 21)","Degree":"24","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(229,67,164)","size":12.666666984558105},{"label":"Alexandros Tziolis","x":1617.329345703125,"y":542.8191528320312,"id":"32","attributes":{"Eigenvector Centrality":"0.25813336963416794","Betweenness Centrality":"0.0","Appearances":"49","No":"6","Country":"Greece","Club Country":"Turkey","Club":"Kayserispor","Weighted Degree":"22.0","Modularity Class":"15","Date of birth / Age":"13 February 1985 (aged 29)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2760045061960195"},"color":"rgb(229,67,100)","size":10.0},{"label":"Marcelo DÃaz","x":-193.8722381591797,"y":1188.14697265625,"id":"445","attributes":{"Eigenvector Centrality":"0.3914962580991112","Betweenness Centrality":"0.007300142578773374","Appearances":"21","No":"21","Country":"Chile","Club Country":"Switzerland","Club":"Basel","Weighted Degree":"27.0","Modularity Class":"18","Date of birth / Age":"30 December 1986 (aged 27)","Degree":"27","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.29902359641985354"},"color":"rgb(229,132,67)","size":16.666667938232422},{"label":"Pepe","x":-652.334228515625,"y":226.08396911621094,"id":"571","attributes":{"Eigenvector Centrality":"0.651122142378051","Betweenness Centrality":"0.002704889595809238","Appearances":"58","No":"3","Country":"Portugal","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"31.0","Modularity Class":"8","Date of birth / Age":"26 February 1983 (aged 31)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33546325878594246"},"color":"rgb(229,164,67)","size":22.0},{"label":"Sayouba Mandé","x":565.8164672851562,"y":-858.4483642578125,"id":"632","attributes":{"Eigenvector Centrality":"0.30966117600400683","Betweenness Centrality":"0.0","Appearances":"1","No":"23","Country":"Ivory Coast","Club Country":"Norway","Club":"Stabæk","Weighted Degree":"22.0","Modularity Class":"9","Date of birth / Age":"15 June 1993 (aged 20)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2929453965723396"},"color":"rgb(164,67,229)","size":10.0},{"label":"Romelu Lukaku","x":-624.7638549804688,"y":-965.3787841796875,"id":"612","attributes":{"Eigenvector Centrality":"0.5945562042887822","Betweenness Centrality":"0.0024227939394388456","Appearances":"29","No":"9","Country":"Belgium","Club Country":"England","Club":"Everton","Weighted Degree":"26.0","Modularity Class":"28","Date of birth / Age":"13 May 1993 (aged 21)","Degree":"26","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3330312641594925"},"color":"rgb(67,229,132)","size":15.333333969116211},{"label":"Carlos Gruezo","x":-1417.1590576171875,"y":-636.35205078125,"id":"102","attributes":{"Eigenvector Centrality":"0.40234260169062663","Betweenness Centrality":"0.012924077143976812","Appearances":"3","No":"23","Country":"Ecuador","Club Country":"Germany","Club":"VfB Stuttgart","Weighted Degree":"25.0","Modularity Class":"4","Date of birth / Age":"19 April 1995 (aged 19)","Degree":"25","Position":"MF","Eccentricity":"4.0","Closeness Centrality":"0.3208206023570493"},"color":"rgb(229,67,132)","size":14.0},{"label":"Boubacar Barry","x":488.794921875,"y":-907.9202880859375,"id":"89","attributes":{"Eigenvector Centrality":"0.3096611760040069","Betweenness Centrality":"0.0","Appearances":"77","No":"1","Country":"Ivory Coast","Club Country":"Belgium","Club":"Lokeren","Weighted Degree":"22.0","Modularity Class":"9","Date of birth / Age":"30 December 1979 (aged 34)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.2929453965723396"},"color":"rgb(164,67,229)","size":10.0},{"label":"Adam Taggart","x":2042.42724609375,"y":-579.6041870117188,"id":"6","attributes":{"Eigenvector Centrality":"0.22132294330055022","Betweenness Centrality":"0.0","Appearances":"5","No":"9","Country":"Australia","Club Country":"Australia","Club":"Newcastle Jets","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"2 June 1993 (aged 21)","Degree":"22","Position":"FW","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Gabriel Achilier","x":-1682.26220703125,"y":-719.3626708984375,"id":"236","attributes":{"Eigenvector Centrality":"0.3623062182068216","Betweenness Centrality":"0.0","Appearances":"23","No":"21","Country":"Ecuador","Club Country":"Ecuador","Club":"Emelec","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"24 March 1985 (aged 29)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Paul Verhaegh","x":949.3831176757812,"y":201.00778198242188,"id":"566","attributes":{"Eigenvector Centrality":"0.35574061516727906","Betweenness Centrality":"0.008783426226424064","Appearances":"2","No":"12","Country":"Netherlands","Club Country":"Germany","Club":"FC Augsburg","Weighted Degree":"24.0","Modularity Class":"22","Date of birth / Age":"1 September 1983 (aged 30)","Degree":"24","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3153153153153153"},"color":"rgb(197,67,229)","size":12.666666984558105},{"label":"Clint Dempsey (c)","x":742.0546264648438,"y":-1547.4185791015625,"id":"126","attributes":{"Eigenvector Centrality":"0.27181518429351065","Betweenness Centrality":"0.0","Appearances":"105","No":"8","Country":"United States","Club Country":"United States","Club":"Seattle Sounders FC","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"9 March 1983 (aged 31)","Degree":"22","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Madjid Bougherra (c)","x":-1470.3363037109375,"y":1180.3843994140625,"id":"435","attributes":{"Eigenvector Centrality":"0.29589355686287977","Betweenness Centrality":"0.0","Appearances":"62","No":"2","Country":"Algeria","Club Country":"Qatar","Club":"Lekhwiya","Weighted Degree":"22.0","Modularity Class":"24","Date of birth / Age":"7 October 1982 (aged 31)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28389339513325607"},"color":"rgb(67,164,229)","size":10.0},{"label":"James RodrÃguez","x":-798.67431640625,"y":1094.4688720703125,"id":"309","attributes":{"Eigenvector Centrality":"0.3631125757022638","Betweenness Centrality":"0.002531708436743698","Appearances":"22","No":"10","Country":"Colombia","Club Country":"France","Club":"AS Monaco","Weighted Degree":"25.0","Modularity Class":"11","Date of birth / Age":"12 July 1991 (aged 22)","Degree":"25","Position":"MF","Eccentricity":"6.0","Closeness Centrality":"0.315450643776824"},"color":"rgb(67,67,229)","size":14.0},{"label":"Jeremain Lens","x":718.18798828125,"y":97.26069641113281,"id":"325","attributes":{"Eigenvector Centrality":"0.37953617711875015","Betweenness Centrality":"0.00411799412159424","Appearances":"22","No":"17","Country":"Netherlands","Club Country":"Ukraine","Club":"Dynamo Kyiv","Weighted Degree":"25.0","Modularity Class":"22","Date of birth / Age":"24 November 1987 (aged 26)","Degree":"25","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3255093002657219"},"color":"rgb(197,67,229)","size":14.0},{"label":"Juanfran","x":-888.2894897460938,"y":-365.1721496582031,"id":"373","attributes":{"Eigenvector Centrality":"0.7852248920099726","Betweenness Centrality":"7.220203040676876E-4","Appearances":"8","No":"5","Country":"Spain","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"27.0","Modularity Class":"23","Date of birth / Age":"9 January 1985 (aged 29)","Degree":"27","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3215223097112861"},"color":"rgb(229,67,197)","size":16.666667938232422},{"label":"Amir Hossein Sadeghi","x":1990.185546875,"y":1052.62548828125,"id":"40","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"17","No":"5","Country":"Iran","Club Country":"Iran","Club":"Esteghlal","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"6 September 1981 (aged 32)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Zvjezdan Misimovic","x":1277.4697265625,"y":-479.1226501464844,"id":"736","attributes":{"Eigenvector Centrality":"0.2839695417201138","Betweenness Centrality":"0.0","Appearances":"81","No":"10","Country":"Bosnia and Herzegovina","Club Country":"China","Club":"Guizhou Renhe","Weighted Degree":"22.0","Modularity Class":"20","Date of birth / Age":"5 June 1982 (aged 32)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3077889447236181"},"color":"rgb(132,229,67)","size":10.0},{"label":"Nacer Chadli","x":-730.6295166015625,"y":-798.0245971679688,"id":"527","attributes":{"Eigenvector Centrality":"0.5781054780643133","Betweenness Centrality":"0.0013899483715746057","Appearances":"20","No":"22","Country":"Belgium","Club Country":"England","Club":"Tottenham Hotspur","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"2 October 1989 (aged 24)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.33638443935926776"},"color":"rgb(67,229,132)","size":14.0},{"label":"Michael Arroyo","x":-1730.895751953125,"y":-727.3639526367188,"id":"499","attributes":{"Eigenvector Centrality":"0.3623062182068213","Betweenness Centrality":"0.0","Appearances":"21","No":"15","Country":"Ecuador","Club Country":"Mexico","Club":"Atlante","Weighted Degree":"22.0","Modularity Class":"4","Date of birth / Age":"23 April 1987 (aged 27)","Degree":"22","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.2881223049784398"},"color":"rgb(229,67,132)","size":10.0},{"label":"Valon Behrami","x":-152.94186401367188,"y":233.4356231689453,"id":"693","attributes":{"Eigenvector Centrality":"0.6153709092825856","Betweenness Centrality":"0.004199284588766183","Appearances":"48","No":"11","Country":"Switzerland","Club Country":"Italy","Club":"Napoli","Weighted Degree":"31.0","Modularity Class":"0","Date of birth / Age":"19 April 1985 (aged 29)","Degree":"31","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3331822302810517"},"color":"rgb(164,229,67)","size":22.0},{"label":"Sami Khedira","x":147.37220764160156,"y":-251.9683837890625,"id":"623","attributes":{"Eigenvector Centrality":"0.7584962588500563","Betweenness Centrality":"0.008327156420560313","Appearances":"46","No":"6","Country":"Germany","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"33.0","Modularity Class":"13","Date of birth / Age":"4 April 1987 (aged 27)","Degree":"33","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.32974427994616423"},"color":"rgb(67,229,164)","size":24.666667938232422},{"label":"Admir Mehmedi","x":126.91813659667969,"y":115.84123229980469,"id":"7","attributes":{"Eigenvector Centrality":"0.41564407300864686","Betweenness Centrality":"0.0029131326818128433","Appearances":"21","No":"18","Country":"Switzerland","Club Country":"Germany","Club":"SC Freiburg","Weighted Degree":"24.0","Modularity Class":"0","Date of birth / Age":"16 March 1991 (aged 23)","Degree":"24","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.3150450064294899"},"color":"rgb(164,229,67)","size":12.666666984558105},{"label":"Hong Jeong-ho","x":1189.017578125,"y":1491.9881591796875,"id":"283","attributes":{"Eigenvector Centrality":"0.24502153540109495","Betweenness Centrality":"0.0031284111071300832","Appearances":"25","No":"20","Country":"South Korea","Club Country":"Germany","Club":"FC Augsburg","Weighted Degree":"23.0","Modularity Class":"10","Date of birth / Age":"12 August 1989 (aged 24)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.2726261127596439"},"color":"rgb(229,67,164)","size":11.333333015441895},{"label":"Nikica Jelavic","x":-197.76739501953125,"y":532.7603149414062,"id":"535","attributes":{"Eigenvector Centrality":"0.354839329394506","Betweenness Centrality":"0.005268740805035136","Appearances":"33","No":"9","Country":"Croatia","Club Country":"England","Club":"Hull City","Weighted Degree":"23.0","Modularity Class":"25","Date of birth / Age":"27 August 1985 (aged 28)","Degree":"23","Position":"FW","Eccentricity":"5.0","Closeness Centrality":"0.303970223325062"},"color":"rgb(132,67,229)","size":11.333333015441895},{"label":"Ross Barkley","x":-149.76280212402344,"y":-1043.209228515625,"id":"616","attributes":{"Eigenvector Centrality":"0.5738583419916762","Betweenness Centrality":"0.0013664563333722465","Appearances":"6","No":"21","Country":"England","Club Country":"England","Club":"Everton","Weighted Degree":"25.0","Modularity Class":"28","Date of birth / Age":"5 December 1993 (aged 20)","Degree":"25","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.31183708103521424"},"color":"rgb(67,229,132)","size":14.0},{"label":"Ji Dong-won","x":1240.84521484375,"y":1492.1494140625,"id":"330","attributes":{"Eigenvector Centrality":"0.24502153540109498","Betweenness Centrality":"0.0031284111071300832","Appearances":"28","No":"19","Country":"South Korea","Club Country":"Germany","Club":"FC Augsburg","Weighted Degree":"23.0","Modularity Class":"10","Date of birth / Age":"28 May 1991 (aged 23)","Degree":"23","Position":"FW","Eccentricity":"6.0","Closeness Centrality":"0.2726261127596439"},"color":"rgb(229,67,164)","size":11.333333015441895},{"label":"Nick Rimando","x":864.0869140625,"y":-1556.7880859375,"id":"530","attributes":{"Eigenvector Centrality":"0.27181518429351065","Betweenness Centrality":"0.0","Appearances":"14","No":"22","Country":"United States","Club Country":"United States","Club":"Real Salt Lake","Weighted Degree":"22.0","Modularity Class":"26","Date of birth / Age":"17 June 1979 (aged 34)","Degree":"22","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.28021349599695006"},"color":"rgb(100,229,67)","size":10.0},{"label":"Hwang Seok-ho","x":1138.2103271484375,"y":1544.553466796875,"id":"290","attributes":{"Eigenvector Centrality":"0.2441012483722342","Betweenness Centrality":"0.0022277566561183537","Appearances":"3","No":"6","Country":"South Korea","Club Country":"Japan","Club":"Sanfrecce Hiroshima","Weighted Degree":"23.0","Modularity Class":"10","Date of birth / Age":"27 June 1989 (aged 24)","Degree":"23","Position":"DF","Eccentricity":"6.0","Closeness Centrality":"0.27051895472948106"},"color":"rgb(229,67,164)","size":11.333333015441895},{"label":"André Schürrle","x":130.84710693359375,"y":-528.9302368164062,"id":"44","attributes":{"Eigenvector Centrality":"0.7600410241243024","Betweenness Centrality":"0.006814981026437991","Appearances":"33","No":"9","Country":"Germany","Club Country":"England","Club":"Chelsea","Weighted Degree":"33.0","Modularity Class":"13","Date of birth / Age":"6 November 1990 (aged 23)","Degree":"33","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3343949044585987"},"color":"rgb(67,229,164)","size":24.666667938232422},{"label":"Pepe Reina","x":-850.5621948242188,"y":-89.60556030273438,"id":"572","attributes":{"Eigenvector Centrality":"0.9188656127061582","Betweenness Centrality":"0.004836935094169011","Appearances":"32","No":"23","Country":"Spain","Club Country":"Italy","Club":"Napoli","Weighted Degree":"32.0","Modularity Class":"23","Date of birth / Age":"31 August 1982 (aged 31)","Degree":"32","Position":"GK","Eccentricity":"5.0","Closeness Centrality":"0.34249767008387694"},"color":"rgb(229,67,197)","size":23.33333396911621},{"label":"Maynor Figueroa","x":1528.1024169921875,"y":-1100.3426513671875,"id":"492","attributes":{"Eigenvector Centrality":"0.24997612632443128","Betweenness Centrality":"0.00471069378362544","Appearances":"105","No":"3","Country":"Honduras","Club Country":"England","Club":"Hull City","Weighted Degree":"23.0","Modularity Class":"7","Date of birth / Age":"2 May 1983 (aged 31)","Degree":"23","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.28107074569789675"},"color":"rgb(100,67,229)","size":11.333333015441895},{"label":"Dmitri Kombarov","x":-1369.3797607421875,"y":-1467.8458251953125,"id":"174","attributes":{"Eigenvector Centrality":"0.2656930429181982","Betweenness Centrality":"0.0","Appearances":"22","No":"23","Country":"Russia","Club Country":"Russia","Club":"Spartak Moscow","Weighted Degree":"22.0","Modularity Class":"2","Date of birth / Age":"22 January 1987 (aged 27)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.23244781783681215"},"color":"rgb(229,67,67)","size":10.0},{"label":"Waylon Francis","x":2350.48974609375,"y":280.3184509277344,"id":"712","attributes":{"Eigenvector Centrality":"0.2349694476086638","Betweenness Centrality":"0.0","Appearances":"1","No":"12","Country":"Costa Rica","Club Country":"United States","Club":"Columbus Crew","Weighted Degree":"22.0","Modularity Class":"29","Date of birth / Age":"20 September 1990 (aged 23)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.2515400410677618"},"color":"rgb(229,229,67)","size":10.0},{"label":"Ahmad Alenemeh","x":2028.45654296875,"y":1067.91259765625,"id":"13","attributes":{"Eigenvector Centrality":"0.21274429344229648","Betweenness Centrality":"0.0","Appearances":"9","No":"17","Country":"Iran","Club Country":"Iran","Club":"Naft Tehran","Weighted Degree":"22.0","Modularity Class":"1","Date of birth / Age":"10 October 1982 (aged 31)","Degree":"22","Position":"DF","Eccentricity":"7.0","Closeness Centrality":"0.206809229037704"},"color":"rgb(67,197,229)","size":10.0},{"label":"Fábio Coentrão","x":-620.6026611328125,"y":152.4325408935547,"id":"216","attributes":{"Eigenvector Centrality":"0.6511221423780509","Betweenness Centrality":"0.002704889595809238","Appearances":"45","No":"5","Country":"Portugal","Club Country":"Spain","Club":"Real Madrid","Weighted Degree":"31.0","Modularity Class":"8","Date of birth / Age":"11 March 1988 (aged 26)","Degree":"31","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.33546325878594246"},"color":"rgb(229,164,67)","size":22.0},{"label":"Stefan de Vrij","x":967.5440673828125,"y":46.13400650024414,"id":"659","attributes":{"Eigenvector Centrality":"0.335211163684756","Betweenness Centrality":"0.0","Appearances":"12","No":"3","Country":"Netherlands","Club Country":"Netherlands","Club":"Feyenoord","Weighted Degree":"22.0","Modularity Class":"22","Date of birth / Age":"5 February 1992 (aged 22)","Degree":"22","Position":"DF","Eccentricity":"5.0","Closeness Centrality":"0.3088235294117647"},"color":"rgb(197,67,229)","size":10.0},{"label":"Javier Aquino","x":-2081.5556640625,"y":384.58026123046875,"id":"317","attributes":{"Eigenvector Centrality":"0.27712645238679473","Betweenness Centrality":"0.0","Appearances":"22","No":"20","Country":"Mexico","Club Country":"Spain","Club":"Villarreal","Weighted Degree":"22.0","Modularity Class":"21","Date of birth / Age":"11 February 1990 (aged 24)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.2599929253625752"},"color":"rgb(67,229,67)","size":10.0},{"label":"Mile Jedinak (c)","x":2075.45263671875,"y":-732.8336791992188,"id":"515","attributes":{"Eigenvector Centrality":"0.2213229433005502","Betweenness Centrality":"0.0","Appearances":"44","No":"15","Country":"Australia","Club Country":"England","Club":"Crystal Palace","Weighted Degree":"22.0","Modularity Class":"12","Date of birth / Age":"3 August 1984 (aged 29)","Degree":"22","Position":"MF","Eccentricity":"7.0","Closeness Centrality":"0.22025771651183698"},"color":"rgb(229,100,67)","size":10.0},{"label":"Cristian RodrÃguez","x":-272.8934631347656,"y":-76.41095733642578,"id":"129","attributes":{"Eigenvector Centrality":"0.5243629945948548","Betweenness Centrality":"0.0015151368839237088","Appearances":"73","No":"7","Country":"Uruguay","Club Country":"Spain","Club":"Atlético Madrid","Weighted Degree":"28.0","Modularity Class":"6","Date of birth / Age":"30 September 1985 (aged 28)","Degree":"28","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3236459709379128"},"color":"rgb(229,197,67)","size":18.0},{"label":"Jean Makoun","x":430.8337097167969,"y":257.7498474121094,"id":"321","attributes":{"Eigenvector Centrality":"0.3346787587121599","Betweenness Centrality":"0.0017126023775967546","Appearances":"66","No":"11","Country":"Cameroon","Club Country":"France","Club":"Rennes","Weighted Degree":"23.0","Modularity Class":"17","Date of birth / Age":"29 May 1983 (aged 31)","Degree":"23","Position":"MF","Eccentricity":"5.0","Closeness Centrality":"0.3202614379084967"},"color":"rgb(67,132,229)","size":11.333333015441895}]}
\ No newline at end of file
diff --git a/examples/network/datasources/largeHierarchicalDataset.js b/examples/network/datasources/largeHierarchicalDataset.js
new file mode 100644
index 0000000000..ddbb524e76
--- /dev/null
+++ b/examples/network/datasources/largeHierarchicalDataset.js
@@ -0,0 +1,2 @@
+var nodes = [{id:0,label:0},{id:1,label:1},{id:2,label:2},{id:3,label:3},{id:4,label:4},{id:5,label:5},{id:6,label:6},{id:7,label:7},{id:8,label:8},{id:9,label:9},{id:10,label:10},{id:11,label:11},{id:12,label:12},{id:13,label:13},{id:14,label:14},{id:15,label:15},{id:16,label:16},{id:17,label:17},{id:18,label:18},{id:19,label:19},{id:20,label:20},{id:21,label:21},{id:22,label:22},{id:23,label:23},{id:24,label:24},{id:25,label:25},{id:26,label:26},{id:27,label:27},{id:28,label:28},{id:29,label:29},{id:30,label:30},{id:31,label:31},{id:32,label:32},{id:33,label:33},{id:34,label:34},{id:35,label:35},{id:36,label:36},{id:37,label:37},{id:38,label:38},{id:39,label:39},{id:40,label:40},{id:41,label:41},{id:42,label:42},{id:43,label:43},{id:44,label:44},{id:45,label:45},{id:46,label:46},{id:47,label:47},{id:48,label:48},{id:49,label:49},{id:50,label:50},{id:51,label:51},{id:52,label:52},{id:53,label:53},{id:54,label:54},{id:55,label:55},{id:56,label:56},{id:57,label:57},{id:58,label:58},{id:59,label:59},{id:60,label:60},{id:61,label:61},{id:62,label:62},{id:63,label:63},{id:64,label:64},{id:65,label:65},{id:66,label:66},{id:67,label:67},{id:68,label:68},{id:69,label:69},{id:70,label:70},{id:71,label:71},{id:72,label:72},{id:73,label:73},{id:74,label:74},{id:75,label:75},{id:76,label:76},{id:77,label:77},{id:78,label:78},{id:79,label:79},{id:80,label:80},{id:81,label:81},{id:82,label:82},{id:83,label:83},{id:84,label:84},{id:85,label:85},{id:86,label:86},{id:87,label:87},{id:88,label:88},{id:89,label:89},{id:90,label:90},{id:91,label:91},{id:92,label:92},{id:93,label:93},{id:94,label:94},{id:95,label:95},{id:96,label:96},{id:97,label:97},{id:98,label:98},{id:99,label:99},{id:100,label:100},{id:101,label:101},{id:102,label:102},{id:103,label:103},{id:104,label:104},{id:105,label:105},{id:106,label:106},{id:107,label:107},{id:108,label:108},{id:109,label:109},{id:110,label:110},{id:111,label:111},{id:112,label:112},{id:113,label:113},{id:114,label:114},{id:115,label:115},{id:116,label:116},{id:117,label:117},{id:118,label:118},{id:119,label:119},{id:120,label:120},{id:121,label:121},{id:122,label:122},{id:123,label:123},{id:124,label:124},{id:125,label:125},{id:126,label:126},{id:127,label:127},{id:128,label:128},{id:129,label:129},{id:130,label:130},{id:131,label:131},{id:132,label:132},{id:133,label:133},{id:134,label:134},{id:135,label:135},{id:136,label:136},{id:137,label:137},{id:138,label:138},{id:139,label:139},{id:140,label:140},{id:141,label:141},{id:142,label:142},{id:143,label:143},{id:144,label:144},{id:145,label:145},{id:146,label:146},{id:147,label:147},{id:148,label:148},{id:149,label:149},{id:150,label:150},{id:151,label:151},{id:152,label:152},{id:153,label:153},{id:154,label:154},{id:155,label:155},{id:156,label:156},{id:157,label:157},{id:158,label:158},{id:159,label:159},{id:160,label:160},{id:161,label:161},{id:162,label:162},{id:163,label:163},{id:164,label:164},{id:165,label:165},{id:166,label:166},{id:167,label:167},{id:168,label:168},{id:169,label:169},{id:170,label:170},{id:171,label:171},{id:172,label:172},{id:173,label:173},{id:174,label:174},{id:175,label:175},{id:176,label:176},{id:177,label:177},{id:178,label:178},{id:179,label:179},{id:180,label:180},{id:181,label:181},{id:182,label:182},{id:183,label:183},{id:184,label:184},{id:185,label:185},{id:186,label:186},{id:187,label:187},{id:188,label:188},{id:189,label:189},{id:190,label:190},{id:191,label:191},{id:192,label:192},{id:193,label:193},{id:194,label:194},{id:195,label:195},{id:196,label:196},{id:197,label:197},{id:198,label:198},{id:199,label:199},{id:200,label:200},{id:201,label:201},{id:202,label:202},{id:203,label:203},{id:204,label:204},{id:205,label:205},{id:206,label:206},{id:207,label:207},{id:208,label:208},{id:209,label:209},{id:210,label:210},{id:211,label:211},{id:212,label:212},{id:213,label:213},{id:214,label:214},{id:215,label:215},{id:216,label:216},{id:217,label:217},{id:218,label:218},{id:219,label:219},{id:220,label:220},{id:221,label:221},{id:222,label:222},{id:223,label:223},{id:224,label:224},{id:225,label:225},{id:226,label:226},{id:227,label:227},{id:228,label:228},{id:229,label:229},{id:230,label:230},{id:231,label:231},{id:232,label:232},{id:233,label:233},{id:234,label:234},{id:235,label:235},{id:236,label:236},{id:237,label:237},{id:238,label:238},{id:239,label:239},{id:240,label:240},{id:241,label:241},{id:242,label:242},{id:243,label:243},{id:244,label:244},{id:245,label:245},{id:246,label:246},{id:247,label:247},{id:248,label:248},{id:249,label:249},{id:250,label:250},{id:251,label:251},{id:252,label:252},{id:253,label:253},{id:254,label:254},{id:255,label:255},{id:256,label:256},{id:257,label:257},{id:258,label:258},{id:259,label:259},{id:260,label:260},{id:261,label:261},{id:262,label:262},{id:263,label:263},{id:264,label:264},{id:265,label:265},{id:266,label:266},{id:267,label:267},{id:268,label:268},{id:269,label:269},{id:270,label:270},{id:271,label:271},{id:272,label:272},{id:273,label:273},{id:274,label:274},{id:275,label:275},{id:276,label:276},{id:277,label:277},{id:278,label:278},{id:279,label:279},{id:280,label:280},{id:281,label:281},{id:282,label:282},{id:283,label:283},{id:284,label:284},{id:285,label:285},{id:286,label:286},{id:287,label:287},{id:288,label:288},{id:289,label:289},{id:290,label:290},{id:291,label:291},{id:292,label:292},{id:293,label:293},{id:294,label:294},{id:295,label:295},{id:296,label:296},{id:297,label:297},{id:298,label:298},{id:299,label:299},{id:300,label:300},{id:301,label:301},{id:302,label:302},{id:303,label:303},{id:304,label:304},{id:305,label:305},{id:306,label:306},{id:307,label:307},{id:308,label:308},{id:309,label:309},{id:310,label:310},{id:311,label:311},{id:312,label:312},{id:313,label:313},{id:314,label:314},{id:315,label:315},{id:316,label:316},{id:317,label:317},{id:318,label:318},{id:319,label:319},{id:320,label:320},{id:321,label:321},{id:322,label:322},{id:323,label:323},{id:324,label:324},{id:325,label:325},{id:326,label:326},{id:327,label:327},{id:328,label:328},{id:329,label:329},{id:330,label:330},{id:331,label:331},{id:332,label:332},{id:333,label:333},{id:334,label:334},{id:335,label:335},{id:336,label:336},{id:337,label:337},{id:338,label:338},{id:339,label:339},{id:340,label:340},{id:341,label:341},{id:342,label:342},{id:343,label:343},{id:344,label:344},{id:345,label:345},{id:346,label:346},{id:347,label:347}];
+var edges = [{from:331,to:0,id:"e0"},{from:331,to:1,id:"e1"},{from:302,to:2,id:"e2"},{from:321,to:3,id:"e3"},{from:323,to:4,id:"e4"},{from:326,to:5,id:"e5"},{from:24,to:6,id:"e6"},{from:327,to:7,id:"e7"},{from:50,to:8,id:"e8"},{from:275,to:9,id:"e9"},{from:327,to:10,id:"e10"},{from:30,to:11,id:"e11"},{from:327,to:12,id:"e12"},{from:270,to:13,id:"e13"},{from:204,to:14,id:"e14"},{from:42,to:15,id:"e15"},{from:140,to:16,id:"e16"},{from:327,to:17,id:"e17"},{from:80,to:18,id:"e18"},{from:24,to:19,id:"e19"},{from:60,to:20,id:"e20"},{from:323,to:21,id:"e21"},{from:328,to:22,id:"e22"},{from:58,to:23,id:"e23"},{from:0,to:24,id:"e24"},{from:50,to:25,id:"e25"},{from:50,to:26,id:"e26"},{from:36,to:27,id:"e27"},{from:36,to:28,id:"e28"},{from:303,to:29,id:"e29"},{from:1,to:30,id:"e30"},{from:326,to:31,id:"e31"},{from:81,to:32,id:"e32"},{from:60,to:33,id:"e33"},{from:62,to:34,id:"e34"},{from:24,to:35,id:"e35"},{from:319,to:36,id:"e36"},{from:58,to:37,id:"e37"},{from:58,to:38,id:"e38"},{from:80,to:39,id:"e39"},{from:35,to:40,id:"e40"},{from:73,to:41,id:"e41"},{from:327,to:42,id:"e42"},{from:301,to:43,id:"e43"},{from:36,to:44,id:"e44"},{from:322,to:45,id:"e45"},{from:69,to:46,id:"e46"},{from:329,to:47,id:"e47"},{from:199,to:48,id:"e48"},{from:321,to:49,id:"e49"},{from:331,to:50,id:"e50"},{from:70,to:51,id:"e51"},{from:329,to:52,id:"e52"},{from:140,to:53,id:"e53"},{from:1,to:54,id:"e54"},{from:330,to:55,id:"e55"},{from:304,to:56,id:"e56"},{from:214,to:57,id:"e57"},{from:84,to:58,id:"e58"},{from:141,to:59,id:"e59"},{from:36,to:60,id:"e60"},{from:323,to:61,id:"e61"},{from:326,to:62,id:"e62"},{from:323,to:63,id:"e63"},{from:328,to:64,id:"e64"},{from:331,to:65,id:"e65"},{from:140,to:66,id:"e66"},{from:24,to:67,id:"e67"},{from:324,to:68,id:"e68"},{from:326,to:69,id:"e69"},{from:323,to:70,id:"e70"},{from:283,to:71,id:"e71"},{from:27,to:72,id:"e72"},{from:50,to:73,id:"e73"},{from:325,to:74,id:"e74"},{from:58,to:75,id:"e75"},{from:323,to:76,id:"e76"},{from:15,to:77,id:"e77"},{from:70,to:78,id:"e78"},{from:22,to:79,id:"e79"},{from:328,to:80,id:"e80"},{from:0,to:81,id:"e81"},{from:322,to:82,id:"e82"},{from:326,to:83,id:"e83"},{from:325,to:84,id:"e84"},{from:331,to:85,id:"e85"},{from:184,to:86,id:"e86"},{from:250,to:87,id:"e87"},{from:321,to:88,id:"e88"},{from:322,to:89,id:"e89"},{from:326,to:90,id:"e90"},{from:162,to:91,id:"e91"},{from:162,to:92,id:"e92"},{from:99,to:93,id:"e93"},{from:320,to:94,id:"e94"},{from:326,to:95,id:"e95"},{from:0,to:96,id:"e96"},{from:326,to:97,id:"e97"},{from:327,to:98,id:"e98"},{from:0,to:99,id:"e99"},{from:327,to:100,id:"e100"},{from:0,to:101,id:"e101"},{from:0,to:102,id:"e102"},{from:328,to:103,id:"e103"},{from:256,to:104,id:"e104"},{from:326,to:105,id:"e105"},{from:81,to:106,id:"e106"},{from:322,to:107,id:"e107"},{from:326,to:108,id:"e108"},{from:8,to:109,id:"e109"},{from:204,to:110,id:"e110"},{from:163,to:111,id:"e111"},{from:330,to:112,id:"e112"},{from:330,to:113,id:"e113"},{from:324,to:114,id:"e114"},{from:42,to:115,id:"e115"},{from:328,to:116,id:"e116"},{from:331,to:117,id:"e117"},{from:321,to:118,id:"e118"},{from:141,to:119,id:"e119"},{from:321,to:120,id:"e120"},{from:330,to:121,id:"e121"},{from:324,to:122,id:"e122"},{from:199,to:123,id:"e123"},{from:302,to:124,id:"e124"},{from:328,to:125,id:"e125"},{from:307,to:126,id:"e126"},{from:321,to:127,id:"e127"},{from:329,to:128,id:"e128"},{from:0,to:129,id:"e129"},{from:331,to:130,id:"e130"},{from:287,to:131,id:"e131"},{from:322,to:132,id:"e132"},{from:1,to:133,id:"e133"},{from:304,to:134,id:"e134"},{from:295,to:135,id:"e135"},{from:42,to:136,id:"e136"},{from:104,to:137,id:"e137"},{from:321,to:138,id:"e138"},{from:204,to:139,id:"e139"},{from:109,to:140,id:"e140"},{from:324,to:141,id:"e141"},{from:70,to:142,id:"e142"},{from:73,to:143,id:"e143"},{from:304,to:144,id:"e144"},{from:0,to:145,id:"e145"},{from:0,to:146,id:"e146"},{from:327,to:147,id:"e147"},{from:141,to:148,id:"e148"},{from:323,to:149,id:"e149"},{from:184,to:150,id:"e150"},{from:324,to:151,id:"e151"},{from:330,to:152,id:"e152"},{from:75,to:153,id:"e153"},{from:328,to:154,id:"e154"},{from:60,to:155,id:"e155"},{from:331,to:156,id:"e156"},{from:153,to:157,id:"e157"},{from:214,to:158,id:"e158"},{from:129,to:159,id:"e159"},{from:331,to:160,id:"e160"},{from:324,to:161,id:"e161"},{from:322,to:162,id:"e162"},{from:195,to:163,id:"e163"},{from:323,to:164,id:"e164"},{from:275,to:165,id:"e165"},{from:58,to:166,id:"e166"},{from:321,to:167,id:"e167"},{from:325,to:168,id:"e168"},{from:324,to:169,id:"e169"},{from:330,to:170,id:"e170"},{from:330,to:171,id:"e171"},{from:331,to:172,id:"e172"},{from:1,to:173,id:"e173"},{from:50,to:174,id:"e174"},{from:327,to:175,id:"e175"},{from:331,to:176,id:"e176"},{from:324,to:177,id:"e177"},{from:204,to:178,id:"e178"},{from:330,to:179,id:"e179"},{from:330,to:180,id:"e180"},{from:50,to:181,id:"e181"},{from:323,to:182,id:"e182"},{from:106,to:183,id:"e183"},{from:70,to:184,id:"e184"},{from:58,to:185,id:"e185"},{from:0,to:186,id:"e186"},{from:321,to:187,id:"e187"},{from:304,to:188,id:"e188"},{from:307,to:189,id:"e189"},{from:140,to:190,id:"e190"},{from:104,to:191,id:"e191"},{from:50,to:192,id:"e192"},{from:60,to:193,id:"e193"},{from:27,to:194,id:"e194"},{from:297,to:195,id:"e195"},{from:321,to:196,id:"e196"},{from:27,to:197,id:"e197"},{from:1,to:198,id:"e198"},{from:321,to:199,id:"e199"},{from:75,to:200,id:"e200"},{from:30,to:201,id:"e201"},{from:50,to:202,id:"e202"},{from:325,to:203,id:"e203"},{from:173,to:204,id:"e204"},{from:307,to:205,id:"e205"},{from:275,to:206,id:"e206"},{from:275,to:207,id:"e207"},{from:331,to:208,id:"e208"},{from:109,to:209,id:"e209"},{from:0,to:210,id:"e210"},{from:327,to:211,id:"e211"},{from:275,to:212,id:"e212"},{from:304,to:213,id:"e213"},{from:104,to:214,id:"e214"},{from:327,to:215,id:"e215"},{from:53,to:216,id:"e216"},{from:60,to:217,id:"e217"},{from:60,to:218,id:"e218"},{from:109,to:219,id:"e219"},{from:192,to:220,id:"e220"},{from:275,to:221,id:"e221"},{from:326,to:222,id:"e222"},{from:250,to:223,id:"e223"},{from:325,to:224,id:"e224"},{from:321,to:225,id:"e225"},{from:1,to:226,id:"e226"},{from:323,to:227,id:"e227"},{from:322,to:228,id:"e228"},{from:327,to:229,id:"e229"},{from:256,to:230,id:"e230"},{from:250,to:231,id:"e231"},{from:330,to:232,id:"e232"},{from:36,to:233,id:"e233"},{from:328,to:234,id:"e234"},{from:323,to:235,id:"e235"},{from:327,to:236,id:"e236"},{from:328,to:237,id:"e237"},{from:250,to:238,id:"e238"},{from:326,to:239,id:"e239"},{from:327,to:240,id:"e240"},{from:329,to:241,id:"e241"},{from:329,to:242,id:"e242"},{from:109,to:243,id:"e243"},{from:323,to:244,id:"e244"},{from:220,to:245,id:"e245"},{from:326,to:246,id:"e246"},{from:267,to:247,id:"e247"},{from:250,to:248,id:"e248"},{from:256,to:249,id:"e249"},{from:322,to:250,id:"e250"},{from:322,to:251,id:"e251"},{from:322,to:252,id:"e252"},{from:109,to:253,id:"e253"},{from:101,to:254,id:"e254"},{from:328,to:255,id:"e255"},{from:331,to:256,id:"e256"},{from:327,to:257,id:"e257"},{from:24,to:258,id:"e258"},{from:124,to:259,id:"e259"},{from:324,to:260,id:"e260"},{from:322,to:261,id:"e261"},{from:322,to:262,id:"e262"},{from:321,to:263,id:"e263"},{from:283,to:264,id:"e264"},{from:318,to:265,id:"e265"},{from:30,to:266,id:"e266"},{from:8,to:267,id:"e267"},{from:140,to:268,id:"e268"},{from:322,to:269,id:"e269"},{from:24,to:270,id:"e270"},{from:9,to:271,id:"e271"},{from:322,to:272,id:"e272"},{from:99,to:273,id:"e273"},{from:24,to:274,id:"e274"},{from:282,to:275,id:"e275"},{from:250,to:276,id:"e276"},{from:70,to:277,id:"e277"},{from:328,to:278,id:"e278"},{from:250,to:279,id:"e279"},{from:50,to:280,id:"e280"},{from:250,to:281,id:"e281"},{from:173,to:282,id:"e282"},{from:320,to:283,id:"e283"},{from:320,to:284,id:"e284"},{from:250,to:285,id:"e285"},{from:325,to:286,id:"e286"},{from:1,to:287,id:"e287"},{from:1,to:288,id:"e288"},{from:109,to:289,id:"e289"},{from:50,to:290,id:"e290"},{from:250,to:291,id:"e291"},{from:195,to:292,id:"e292"},{from:320,to:293,id:"e293"},{from:331,to:294,id:"e294"},{from:331,to:295,id:"e295"},{from:101,to:296,id:"e296"},{from:58,to:297,id:"e297"},{from:24,to:298,id:"e298"},{from:291,to:299,id:"e299"},{from:302,to:300,id:"e300"},{from:323,to:301,id:"e301"},{from:226,to:302,id:"e302"},{from:53,to:303,id:"e303"},{from:110,to:304,id:"e304"},{from:163,to:305,id:"e305"},{from:324,to:306,id:"e306"},{from:304,to:307,id:"e307"},{from:322,to:308,id:"e308"},{from:140,to:309,id:"e309"},{from:323,to:310,id:"e310"},{from:0,to:311,id:"e311"},{from:250,to:312,id:"e312"},{from:30,to:313,id:"e313"},{from:58,to:314,id:"e314"},{from:104,to:315,id:"e315"},{from:75,to:316,id:"e316"},{from:323,to:317,id:"e317"},{from:321,to:318,id:"e318"},{from:256,to:319,id:"e319"},{from:250,to:320,id:"e320"},{from:330,to:321,id:"e321"},{from:327,to:322,id:"e322"},{from:326,to:323,id:"e323"},{from:328,to:324,id:"e324"},{from:328,to:325,id:"e325"},{from:327,to:326,id:"e326"},{from:0,to:327,id:"e327"},{from:70,to:328,id:"e328"},{from:327,to:329,id:"e329"},{from:324,to:330,id:"e330"},{from:69,to:332,id:"e331"},{from:346,to:333,id:"e332"},{from:346,to:334,id:"e333"},{from:337,to:335,id:"e334"},{from:106,to:336,id:"e335"},{from:341,to:337,id:"e336"},{from:341,to:338,id:"e337"},{from:346,to:339,id:"e338"},{from:337,to:340,id:"e339"},{from:334,to:341,id:"e340"},{from:334,to:342,id:"e341"},{from:334,to:343,id:"e342"},{from:334,to:344,id:"e343"},{from:84,to:345,id:"e344"},{from:14,to:346,id:"e345"},{from:331,to:347,id:"e346"}]
\ No newline at end of file
diff --git a/examples/network/edgeStyles/arrowTypes.html b/examples/network/edgeStyles/arrowTypes.html
new file mode 100644
index 0000000000..29d29cc5ad
--- /dev/null
+++ b/examples/network/edgeStyles/arrowTypes.html
@@ -0,0 +1,98 @@
+
+
+
+
Network | Basic usage
+
+
+
+
+
+
+
+
+
+ The types of endpoints.
+ The default is 'arrow'
.
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/edgeStyles/arrows.html b/examples/network/edgeStyles/arrows.html
new file mode 100644
index 0000000000..21a4e84b9d
--- /dev/null
+++ b/examples/network/edgeStyles/arrows.html
@@ -0,0 +1,61 @@
+
+
+
+
Network | Basic usage
+
+
+
+
+
+
+
+
+
+ There are a lot of options with arrows! They can also be combined with dashed lines.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/edgeStyles/background.html b/examples/network/edgeStyles/background.html
new file mode 100644
index 0000000000..838be2fbb2
--- /dev/null
+++ b/examples/network/edgeStyles/background.html
@@ -0,0 +1,67 @@
+
+
+
+
Network | Edge background
+
+
+
+
+
+
+
+
+
+ Edge background.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/edgeStyles/colors.html b/examples/network/edgeStyles/colors.html
new file mode 100644
index 0000000000..e471425647
--- /dev/null
+++ b/examples/network/edgeStyles/colors.html
@@ -0,0 +1,71 @@
+
+
+
+
Network | Basic usage
+
+
+
+
+
+
+
+
+
+ There are a lot of options with colors. You can manually define a color or inherit the color from the nodes. You can set the opacity
+ to override any opacity given by a color. IN ORDER TO USE THE OPACITY, BOTH THE NODES AND THE EDGES NEED COLORS IN HEX OR RGB !
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/edgeStyles/dashes.html b/examples/network/edgeStyles/dashes.html
new file mode 100644
index 0000000000..07c2af431f
--- /dev/null
+++ b/examples/network/edgeStyles/dashes.html
@@ -0,0 +1,57 @@
+
+
+
+
Network | Basic usage
+
+
+
+
+
+
+
+
+
+ Playing with dashes.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/edgeStyles/smooth.html b/examples/network/edgeStyles/smooth.html
new file mode 100644
index 0000000000..ab114cc990
--- /dev/null
+++ b/examples/network/edgeStyles/smooth.html
@@ -0,0 +1,78 @@
+
+
+
+
Network | Static smooth curves
+
+
+
+
+
+
+
+
+
+
+
Smooth curves
+
+ All the smooth curves in the examples so far have been using dynamic smooth curves. This means that each curve has a
+ support node which takes part in the physics simulation. For large networks or dense clusters, this may not be the ideal
+ solution. To solve this, static smooth curves have been added. The static smooth curves are based only on the positions of the connected
+ nodes. There are multiple ways to determine the way this curve is drawn. This example shows the effect of the different
+ types.
+ Drag the node around to see how the smooth curves are drawn for each setting. For animated system, we
+ recommend only the continuous mode. In the next example you can see the effect of these methods on a large network. Keep in mind
+ that the direction (the from and to) of the curve matters.
+
+ When you select the dynamic type, you can see the interaction with the fixed node and the edge, any other type will not interact with other nodes.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/edgeStyles/smoothWorldCup.html b/examples/network/edgeStyles/smoothWorldCup.html
new file mode 100644
index 0000000000..30b0b574de
--- /dev/null
+++ b/examples/network/edgeStyles/smoothWorldCup.html
@@ -0,0 +1,97 @@
+
+
+
+
+
+
Network | Static smooth curves - World Cup Network
+
+
+
+
+
+
+
+
+
+
+
+
+
Static smooth curves - World Cup Network
+
+
+ The static smooth curves are based only on the positions of the connected
+ nodes.
+ There are multiple ways to determine the way this curve is drawn.
+ This example shows the effect of the different types on a large network.
+
+ Also shown in this example is the inheritColor option of the edges as well as
+ the roundness factor. Because the physics has been disabled, the dynamic smooth curves do not work here.
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/events/interactionEvents.html b/examples/network/events/interactionEvents.html
new file mode 100644
index 0000000000..6ac2d3380b
--- /dev/null
+++ b/examples/network/events/interactionEvents.html
@@ -0,0 +1,132 @@
+
+
+
+
Network | Interaction events
+
+
+
+
+
+
+
+
+
+ Create a simple network with some nodes and edges. Some of the events are logged in the console in improve readability.
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/events/physicsEvents.html b/examples/network/events/physicsEvents.html
new file mode 100644
index 0000000000..e319d03dc7
--- /dev/null
+++ b/examples/network/events/physicsEvents.html
@@ -0,0 +1,73 @@
+
+
+
+
Network | Basic usage
+
+
+
+
+
+
+
+
+
+ Create a simple network with some nodes and edges.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/events/renderEvents.html b/examples/network/events/renderEvents.html
new file mode 100644
index 0000000000..ba8072fa60
--- /dev/null
+++ b/examples/network/events/renderEvents.html
@@ -0,0 +1,83 @@
+
+
+
+
Network | Basic usage
+
+
+
+
+
+
+
+
+
+ You can draw on the canvas using normal HTML5 canvas functions. The before drawing will be behind the network, the after drawing will be in front of the network.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/exampleApplications/disassemblerExample.html b/examples/network/exampleApplications/disassemblerExample.html
new file mode 100644
index 0000000000..b2f0117a92
--- /dev/null
+++ b/examples/network/exampleApplications/disassemblerExample.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
Use VisJS to diagram the Control-Flow-Graph (CFG) of a function from
+a program you wish to analyze.
+
+
+
+
diff --git a/examples/network/exampleApplications/disassemblerExample.js b/examples/network/exampleApplications/disassemblerExample.js
new file mode 100644
index 0000000000..c22fb28977
--- /dev/null
+++ b/examples/network/exampleApplications/disassemblerExample.js
@@ -0,0 +1,53 @@
+var options = {
+ manipulation: false,
+ height: '90%',
+ layout: {
+ hierarchical: {
+ enabled: true,
+ levelSeparation: 300
+ }
+ },
+ physics: {
+ hierarchicalRepulsion: {
+ nodeDistance: 300
+ }
+ }
+};
+
+var nodes = [
+ {'id': 'cfg_0x00405a2e', 'size': 150, 'label': "0x00405a2e:\nmov DWORD PTR ss:[esp + 0x000000b0], 0x00000002\nmov DWORD PTR ss:[ebp + 0x00], esi\ntest bl, 0x02\nje 0x00405a49<
>\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x00405a49', 'size': 150, 'label': "0x00405a49:\ntest bl, 0x01\nje 0x00405a62<>\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x00405a55', 'size': 150, 'label': "0x00405a55:\nmov ecx, DWORD PTR ss:[esp + 0x1c]\npush ecx\ncall 0x004095c6<>\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x00405a62', 'size': 150, 'label': "0x00405a62:\nmov eax, 0x00000002\nmov ecx, DWORD PTR ss:[esp + 0x000000a8]\nmov DWORD PTR fs:[0x00000000], ecx\npop ecx\npop esi\npop ebp\npop ebx\nadd esp, 0x000000a4\nret\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x004095c6', 'size': 150, 'label': "0x004095c6:\nmov edi, edi\npush ebp\nmov ebp, esp\npop ebp\njmp 0x00417563<>\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x00405a39', 'size': 150, 'label': "0x00405a39:\nand ebx, 0xfd<-0x03>\nlea ecx, [esp + 0x34]\nmov DWORD PTR ss:[esp + 0x10], ebx\ncall 0x00403450<>\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x00403450', 'size': 150, 'label': "0x00403450:\npush 0xff<-0x01>\npush 0x0042fa64\nmov eax, DWORD PTR fs:[0x00000000]\npush eax\npush ecx\npush ebx\npush ebp\npush esi\npush edi\nmov eax, DWORD PTR ds:[0x0043dff0<.data+0x0ff0>]\nxor eax, esp\npush eax\nlea eax, [esp + 0x18]\nmov DWORD PTR fs:[0x00000000], eax\nmov esi, ecx\nmov DWORD PTR ss:[esp + 0x14], esi\npush esi\nmov DWORD PTR ss:[esp + 0x24], 0x00000004\ncall 0x0042f03f<>\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x00405a4e', 'size': 150, 'label': "0x00405a4e:\ncmp DWORD PTR ss:[esp + 0x30], 0x10\njb 0x00405a62<>\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+ {'id': 'cfg_0x00405a5f', 'size': 150, 'label': "0x00405a5f:\nadd esp, 0x04\n", 'color': "#FFCFCF", 'shape': 'box', 'font': {'face': 'monospace', 'align': 'left'}},
+];
+
+
+//
+// Note: there are a couple of node id's present here which do not exist
+// - cfg_0x00417563
+// - cfg_0x00403489
+// - cfg_0x0042f03f
+//
+// The edges with these id's will not load into the Network instance.
+//
+var edges = [
+{'from': "cfg_0x00405a2e", 'to': "cfg_0x00405a39", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a2e", 'to': "cfg_0x00405a49", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a49", 'to': "cfg_0x00405a4e", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a49", 'to': "cfg_0x00405a62", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a55", 'to': "cfg_0x00405a5f", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a55", 'to': "cfg_0x004095c6", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x004095c6", 'to': "cfg_0x00417563", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a39", 'to': "cfg_0x00403450", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a39", 'to': "cfg_0x00405a49", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00403450", 'to': "cfg_0x00403489", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00403450", 'to': "cfg_0x0042f03f", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a4e", 'to': "cfg_0x00405a55", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a4e", 'to': "cfg_0x00405a62", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+{'from': "cfg_0x00405a5f", 'to': "cfg_0x00405a62", 'arrows': 'to', 'physics': false, 'smooth': {'type': 'cubicBezier'}},
+];
diff --git a/examples/network/exampleApplications/lesMiserables.html b/examples/network/exampleApplications/lesMiserables.html
new file mode 100644
index 0000000000..d1ed65ad0e
--- /dev/null
+++ b/examples/network/exampleApplications/lesMiserables.html
@@ -0,0 +1,396 @@
+
+
+
+ Network | Les miserables
+
+
+
+
+
+
+
+
+
+
+
+
+ Relations between the characters of "Les miserables".
+
+
+
+
+
diff --git a/examples/network/exampleApplications/loadingBar.html b/examples/network/exampleApplications/loadingBar.html
new file mode 100644
index 0000000000..6341a636a4
--- /dev/null
+++ b/examples/network/exampleApplications/loadingBar.html
@@ -0,0 +1,504 @@
+
+
+
+ Network | Les miserables
+
+
+
+
+
+
+
+
+
+
+
+
+ With the new stabilization events you can implement your own custom loading bar for all those long loading times!
+
+
+
+
+
diff --git a/examples/network/exampleApplications/neighbourhoodHighlight.html b/examples/network/exampleApplications/neighbourhoodHighlight.html
new file mode 100644
index 0000000000..dea6e0f9c8
--- /dev/null
+++ b/examples/network/exampleApplications/neighbourhoodHighlight.html
@@ -0,0 +1,162 @@
+
+
+
+ Network | Static smooth curves - World Cup Network
+
+
+
+
+
+
+
+
+
+
+
+
+Dynamic Data - Neighbourhood Highlight
+
+ This example shows the power of the DataSet. Once a node is clicked, all nodes are greyed out except for the first and second order connected nodes.
+ In this example we show how you can determine the order of connection per node as well as applying individual styling to the nodes based on whether or not
+ they are connected to the selected node. The code doing the highlighting only takes about 1ms, the rest of the time is the redrawing of the network (9200 edges..).
+
+
+
+
+
+
+
+
diff --git a/examples/network/exampleApplications/nodeLegend.html b/examples/network/exampleApplications/nodeLegend.html
new file mode 100644
index 0000000000..544087850e
--- /dev/null
+++ b/examples/network/exampleApplications/nodeLegend.html
@@ -0,0 +1,163 @@
+
+
+
+ Network | Images
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/network/exampleApplications/worldCupPerformance.html b/examples/network/exampleApplications/worldCupPerformance.html
new file mode 100644
index 0000000000..a0d0f4f67c
--- /dev/null
+++ b/examples/network/exampleApplications/worldCupPerformance.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+ Network | Static smooth curves - World Cup Network
+
+
+
+
+
+
+
+
+
+
+
+
+Performance - World Cup Network
+
+
+ This example shows the performance of vis with a larger network. The edges in
+ particular (~9200) are very computationally intensive
+ to draw. Drag and hold the graph to see the performance difference if the
+ edges are hidden.
+
+ We use the following physics configuration:
+ {barnesHut: {gravitationalConstant: -80000, springConstant: 0.001,
+ springLength: 200}}
+
+
+
+
+
+
+
+
diff --git a/examples/network/exampleUtil.js b/examples/network/exampleUtil.js
new file mode 100644
index 0000000000..1621a9a505
--- /dev/null
+++ b/examples/network/exampleUtil.js
@@ -0,0 +1,133 @@
+/**
+ * Created by Alex on 5/20/2015.
+ */
+
+function loadJSON(path, success, error) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4) {
+ if (xhr.status === 200) {
+ success(JSON.parse(xhr.responseText));
+ }
+ else {
+ error(xhr);
+ }
+ }
+ };
+ xhr.open('GET', path, true);
+ xhr.send();
+}
+
+
+function getScaleFreeNetwork(nodeCount) {
+ var nodes = [];
+ var edges = [];
+ var connectionCount = [];
+
+ // randomly create some nodes and edges
+ for (var i = 0; i < nodeCount; i++) {
+ nodes.push({
+ id: i,
+ label: String(i)
+ });
+
+ connectionCount[i] = 0;
+
+ // create edges in a scale-free-network way
+ if (i == 1) {
+ var from = i;
+ var to = 0;
+ edges.push({
+ from: from,
+ to: to
+ });
+ connectionCount[from]++;
+ connectionCount[to]++;
+ }
+ else if (i > 1) {
+ var conn = edges.length * 2;
+ var rand = Math.floor(Math.random() * conn);
+ var cum = 0;
+ var j = 0;
+ while (j < connectionCount.length && cum < rand) {
+ cum += connectionCount[j];
+ j++;
+ }
+
+
+ var from = i;
+ var to = j;
+ edges.push({
+ from: from,
+ to: to
+ });
+ connectionCount[from]++;
+ connectionCount[to]++;
+ }
+ }
+
+ return {nodes:nodes, edges:edges};
+}
+
+var randomSeed = 764; // Math.round(Math.random()*1000);
+function seededRandom() {
+ var x = Math.sin(randomSeed++) * 10000;
+ return x - Math.floor(x);
+}
+
+function getScaleFreeNetworkSeeded(nodeCount, seed) {
+ if (seed) {
+ randomSeed = Number(seed);
+ }
+ var nodes = [];
+ var edges = [];
+ var connectionCount = [];
+ var edgesId = 0;
+
+
+ // randomly create some nodes and edges
+ for (var i = 0; i < nodeCount; i++) {
+ nodes.push({
+ id: i,
+ label: String(i)
+ });
+
+ connectionCount[i] = 0;
+
+ // create edges in a scale-free-network way
+ if (i == 1) {
+ var from = i;
+ var to = 0;
+ edges.push({
+ id: edgesId++,
+ from: from,
+ to: to
+ });
+ connectionCount[from]++;
+ connectionCount[to]++;
+ }
+ else if (i > 1) {
+ var conn = edges.length * 2;
+ var rand = Math.floor(seededRandom() * conn);
+ var cum = 0;
+ var j = 0;
+ while (j < connectionCount.length && cum < rand) {
+ cum += connectionCount[j];
+ j++;
+ }
+
+
+ var from = i;
+ var to = j;
+ edges.push({
+ id: edgesId++,
+ from: from,
+ to: to
+ });
+ connectionCount[from]++;
+ connectionCount[to]++;
+ }
+ }
+
+ return {nodes:nodes, edges:edges};
+}
\ No newline at end of file
diff --git a/examples/network/imageSelected/broken-image.png b/examples/network/imageSelected/broken-image.png
new file mode 100644
index 0000000000..c910719595
Binary files /dev/null and b/examples/network/imageSelected/broken-image.png differ
diff --git a/examples/network/imageSelected/imageSelected.html b/examples/network/imageSelected/imageSelected.html
new file mode 100644
index 0000000000..f3b030f0d5
--- /dev/null
+++ b/examples/network/imageSelected/imageSelected.html
@@ -0,0 +1,82 @@
+
+
+ Network | Selected/Unselected Image
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/imageSelected/selected.svg b/examples/network/imageSelected/selected.svg
new file mode 100644
index 0000000000..a15c04af19
--- /dev/null
+++ b/examples/network/imageSelected/selected.svg
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/imageSelected/unselected.svg b/examples/network/imageSelected/unselected.svg
new file mode 100644
index 0000000000..538cb2559d
--- /dev/null
+++ b/examples/network/imageSelected/unselected.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/examples/network/img/indonesia/1.png b/examples/network/img/indonesia/1.png
new file mode 100644
index 0000000000..1eb55fadb8
Binary files /dev/null and b/examples/network/img/indonesia/1.png differ
diff --git a/examples/network/img/indonesia/10.png b/examples/network/img/indonesia/10.png
new file mode 100644
index 0000000000..f0266c816f
Binary files /dev/null and b/examples/network/img/indonesia/10.png differ
diff --git a/examples/network/img/indonesia/11.png b/examples/network/img/indonesia/11.png
new file mode 100644
index 0000000000..ecce3f9e98
Binary files /dev/null and b/examples/network/img/indonesia/11.png differ
diff --git a/examples/network/img/indonesia/12.png b/examples/network/img/indonesia/12.png
new file mode 100644
index 0000000000..1c60cee6a6
Binary files /dev/null and b/examples/network/img/indonesia/12.png differ
diff --git a/examples/network/img/indonesia/13.png b/examples/network/img/indonesia/13.png
new file mode 100644
index 0000000000..ab85587518
Binary files /dev/null and b/examples/network/img/indonesia/13.png differ
diff --git a/examples/network/img/indonesia/14.png b/examples/network/img/indonesia/14.png
new file mode 100644
index 0000000000..468633ba0b
Binary files /dev/null and b/examples/network/img/indonesia/14.png differ
diff --git a/examples/network/img/indonesia/2.png b/examples/network/img/indonesia/2.png
new file mode 100644
index 0000000000..f1da21ee6d
Binary files /dev/null and b/examples/network/img/indonesia/2.png differ
diff --git a/examples/network/img/indonesia/3.png b/examples/network/img/indonesia/3.png
new file mode 100644
index 0000000000..f9713f361f
Binary files /dev/null and b/examples/network/img/indonesia/3.png differ
diff --git a/examples/network/img/indonesia/4.png b/examples/network/img/indonesia/4.png
new file mode 100644
index 0000000000..5cda578855
Binary files /dev/null and b/examples/network/img/indonesia/4.png differ
diff --git a/examples/network/img/indonesia/5.png b/examples/network/img/indonesia/5.png
new file mode 100644
index 0000000000..397487b980
Binary files /dev/null and b/examples/network/img/indonesia/5.png differ
diff --git a/examples/network/img/indonesia/6.png b/examples/network/img/indonesia/6.png
new file mode 100644
index 0000000000..c86160471a
Binary files /dev/null and b/examples/network/img/indonesia/6.png differ
diff --git a/examples/network/img/indonesia/7.png b/examples/network/img/indonesia/7.png
new file mode 100644
index 0000000000..0055f1d74b
Binary files /dev/null and b/examples/network/img/indonesia/7.png differ
diff --git a/examples/network/img/indonesia/8.png b/examples/network/img/indonesia/8.png
new file mode 100644
index 0000000000..0a40aec9be
Binary files /dev/null and b/examples/network/img/indonesia/8.png differ
diff --git a/examples/network/img/indonesia/9.png b/examples/network/img/indonesia/9.png
new file mode 100644
index 0000000000..ff9ebf2bf9
Binary files /dev/null and b/examples/network/img/indonesia/9.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-Fax-icon.png b/examples/network/img/refresh-cl/Hardware-Fax-icon.png
new file mode 100644
index 0000000000..eab07c7e2b
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-Fax-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-Laptop-1-icon.png b/examples/network/img/refresh-cl/Hardware-Laptop-1-icon.png
new file mode 100644
index 0000000000..5e0c2ac519
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-Laptop-1-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-Mobile-Phone-icon.png b/examples/network/img/refresh-cl/Hardware-Mobile-Phone-icon.png
new file mode 100644
index 0000000000..66a6d35fc3
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-Mobile-Phone-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-My-Computer-3-icon.png b/examples/network/img/refresh-cl/Hardware-My-Computer-3-icon.png
new file mode 100644
index 0000000000..26ac626079
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-My-Computer-3-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-My-PDA-02-icon.png b/examples/network/img/refresh-cl/Hardware-My-PDA-02-icon.png
new file mode 100644
index 0000000000..a761307d25
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-My-PDA-02-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-My-PDA-04-icon.png b/examples/network/img/refresh-cl/Hardware-My-PDA-04-icon.png
new file mode 100644
index 0000000000..a1fae46024
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-My-PDA-04-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-My-PDA-05-icon.png b/examples/network/img/refresh-cl/Hardware-My-PDA-05-icon.png
new file mode 100644
index 0000000000..d337f861a0
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-My-PDA-05-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-My-Phone-Picture-icon.png b/examples/network/img/refresh-cl/Hardware-My-Phone-Picture-icon.png
new file mode 100644
index 0000000000..5e9ea6c56f
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-My-Phone-Picture-icon.png differ
diff --git a/examples/network/img/refresh-cl/Hardware-Printer-Blue-icon.png b/examples/network/img/refresh-cl/Hardware-Printer-Blue-icon.png
new file mode 100644
index 0000000000..076a542fcf
Binary files /dev/null and b/examples/network/img/refresh-cl/Hardware-Printer-Blue-icon.png differ
diff --git a/examples/network/img/refresh-cl/Misc-Scanner-default-icon.png b/examples/network/img/refresh-cl/Misc-Scanner-default-icon.png
new file mode 100644
index 0000000000..637c619bc9
Binary files /dev/null and b/examples/network/img/refresh-cl/Misc-Scanner-default-icon.png differ
diff --git a/examples/network/img/refresh-cl/Network-Drive-icon.png b/examples/network/img/refresh-cl/Network-Drive-icon.png
new file mode 100644
index 0000000000..e669165c50
Binary files /dev/null and b/examples/network/img/refresh-cl/Network-Drive-icon.png differ
diff --git a/examples/network/img/refresh-cl/Network-Internet-Connection-icon.png b/examples/network/img/refresh-cl/Network-Internet-Connection-icon.png
new file mode 100644
index 0000000000..277047cc41
Binary files /dev/null and b/examples/network/img/refresh-cl/Network-Internet-Connection-icon.png differ
diff --git a/examples/network/img/refresh-cl/Network-Pipe-icon.png b/examples/network/img/refresh-cl/Network-Pipe-icon.png
new file mode 100644
index 0000000000..c5f34b773b
Binary files /dev/null and b/examples/network/img/refresh-cl/Network-Pipe-icon.png differ
diff --git a/examples/network/img/refresh-cl/System-Firewall-2-icon.png b/examples/network/img/refresh-cl/System-Firewall-2-icon.png
new file mode 100644
index 0000000000..e04fe6c29b
Binary files /dev/null and b/examples/network/img/refresh-cl/System-Firewall-2-icon.png differ
diff --git a/examples/network/img/refresh-cl/System-Globe-icon.png b/examples/network/img/refresh-cl/System-Globe-icon.png
new file mode 100644
index 0000000000..a317665fa0
Binary files /dev/null and b/examples/network/img/refresh-cl/System-Globe-icon.png differ
diff --git a/examples/network/img/refresh-cl/license.txt b/examples/network/img/refresh-cl/license.txt
new file mode 100644
index 0000000000..7b8b9d431d
--- /dev/null
+++ b/examples/network/img/refresh-cl/license.txt
@@ -0,0 +1,14 @@
+Refresh Cl icon set
+
+http://www.iconarchive.com/show/refresh-cl-icons-by-tpdkdesign.net.html
+http://www.iconarchive.com/artist/tpdkdesign.net.html
+
+Artist: TpdkDesign.net
+License: Free for non-commercial use.
+
+Name: TpdkDesign.net
+URL: http://www.tpdkdesign.net
+Available for custom work: No
+Default License: Free for non-commercial use.
+Commercial usage: Not allowed
+
diff --git a/examples/network/img/soft-scraps-icons/Document-icon24.png b/examples/network/img/soft-scraps-icons/Document-icon24.png
new file mode 100644
index 0000000000..c420b202ed
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Document-icon24.png differ
diff --git a/examples/network/img/soft-scraps-icons/Document-icon32.png b/examples/network/img/soft-scraps-icons/Document-icon32.png
new file mode 100644
index 0000000000..5938c512fb
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Document-icon32.png differ
diff --git a/examples/network/img/soft-scraps-icons/Document-icon48.png b/examples/network/img/soft-scraps-icons/Document-icon48.png
new file mode 100644
index 0000000000..5938c512fb
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Document-icon48.png differ
diff --git a/examples/network/img/soft-scraps-icons/Email-icon24.png b/examples/network/img/soft-scraps-icons/Email-icon24.png
new file mode 100644
index 0000000000..c01c9040ec
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Email-icon24.png differ
diff --git a/examples/network/img/soft-scraps-icons/Email-icon32.png b/examples/network/img/soft-scraps-icons/Email-icon32.png
new file mode 100644
index 0000000000..86ed5de937
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Email-icon32.png differ
diff --git a/examples/network/img/soft-scraps-icons/Email-icon48.png b/examples/network/img/soft-scraps-icons/Email-icon48.png
new file mode 100644
index 0000000000..799ebb70bf
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Email-icon48.png differ
diff --git a/examples/network/img/soft-scraps-icons/Folder-icon24.png b/examples/network/img/soft-scraps-icons/Folder-icon24.png
new file mode 100644
index 0000000000..16d050846f
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Folder-icon24.png differ
diff --git a/examples/network/img/soft-scraps-icons/Folder-icon32.png b/examples/network/img/soft-scraps-icons/Folder-icon32.png
new file mode 100644
index 0000000000..73111b1511
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Folder-icon32.png differ
diff --git a/examples/network/img/soft-scraps-icons/Folder-icon48.png b/examples/network/img/soft-scraps-icons/Folder-icon48.png
new file mode 100644
index 0000000000..94d69cad61
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Folder-icon48.png differ
diff --git a/examples/network/img/soft-scraps-icons/Folder-icon64.png b/examples/network/img/soft-scraps-icons/Folder-icon64.png
new file mode 100644
index 0000000000..6c5d457aa6
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Folder-icon64.png differ
diff --git a/examples/network/img/soft-scraps-icons/Smiley-Angry-icon.png b/examples/network/img/soft-scraps-icons/Smiley-Angry-icon.png
new file mode 100644
index 0000000000..f40bc381b9
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Smiley-Angry-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/Smiley-Grin-icon.png b/examples/network/img/soft-scraps-icons/Smiley-Grin-icon.png
new file mode 100644
index 0000000000..6ff39eb79e
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/Smiley-Grin-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Administrator-Blue-icon.png b/examples/network/img/soft-scraps-icons/User-Administrator-Blue-icon.png
new file mode 100644
index 0000000000..ba2ffac737
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Administrator-Blue-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Administrator-Green-icon.png b/examples/network/img/soft-scraps-icons/User-Administrator-Green-icon.png
new file mode 100644
index 0000000000..a3d3167785
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Administrator-Green-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Coat-Blue-icon.png b/examples/network/img/soft-scraps-icons/User-Coat-Blue-icon.png
new file mode 100644
index 0000000000..ff367221b3
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Coat-Blue-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Coat-Green-icon.png b/examples/network/img/soft-scraps-icons/User-Coat-Green-icon.png
new file mode 100644
index 0000000000..4a4326b749
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Coat-Green-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Coat-Red-icon.png b/examples/network/img/soft-scraps-icons/User-Coat-Red-icon.png
new file mode 100644
index 0000000000..06f0130f8f
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Coat-Red-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Executive-Green-icon.png b/examples/network/img/soft-scraps-icons/User-Executive-Green-icon.png
new file mode 100644
index 0000000000..a639861ceb
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Executive-Green-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Preppy-Blue-icon.png b/examples/network/img/soft-scraps-icons/User-Preppy-Blue-icon.png
new file mode 100644
index 0000000000..b3c774083e
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Preppy-Blue-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/User-Preppy-Red-icon.png b/examples/network/img/soft-scraps-icons/User-Preppy-Red-icon.png
new file mode 100644
index 0000000000..f569776ea0
Binary files /dev/null and b/examples/network/img/soft-scraps-icons/User-Preppy-Red-icon.png differ
diff --git a/examples/network/img/soft-scraps-icons/license.txt b/examples/network/img/soft-scraps-icons/license.txt
new file mode 100644
index 0000000000..750841c88f
--- /dev/null
+++ b/examples/network/img/soft-scraps-icons/license.txt
@@ -0,0 +1,12 @@
+Scrap Icons by Deleket
+
+http://www.iconarchive.com/show/soft-scraps-icons-by-deleket.html
+
+
+Artist: Deleket (Jojo Mendoza) (Available for custom work)
+License: CC Attribution-Noncommercial-No Derivate 3.0
+
+http://creativecommons.org/licenses/by-nc-nd/3.0/
+
+Commercial usage: Allowed (Author Approval required -> Visit artist homepage for details).
+
diff --git a/examples/network/labels/labelAlignment.html b/examples/network/labels/labelAlignment.html
new file mode 100644
index 0000000000..58a5fd9c42
--- /dev/null
+++ b/examples/network/labels/labelAlignment.html
@@ -0,0 +1,70 @@
+
+
+
+ Network | Label alignment
+
+
+
+
+
+
+
+
+
+
+Labels of edges can be aligned to edges in various ways.
+Text-alignment within node labels can be 'left' or 'center', other font alignments not implemented.
+Label alignment (placement of label "box") for nodes (top, bottom, left, right, inside) is
+planned but not in vis yet.
+The click event is captured and displayed to illustrate how the clicking on labels works.
+You can drag the nodes over each other to see how this influences the click event values.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/labels/labelBackground.html b/examples/network/labels/labelBackground.html
new file mode 100644
index 0000000000..d6e21cd07c
--- /dev/null
+++ b/examples/network/labels/labelBackground.html
@@ -0,0 +1,57 @@
+
+
+
+ Network | Label alignment
+
+
+
+
+
+
+
+
+
+
+Labels can have any color background.
+
+
+
+
+
+
+
diff --git a/examples/network/labels/labelColorAndSize.html b/examples/network/labels/labelColorAndSize.html
new file mode 100644
index 0000000000..800e90a7c3
--- /dev/null
+++ b/examples/network/labels/labelColorAndSize.html
@@ -0,0 +1,61 @@
+
+
+
+ Network | Label stroke
+
+
+
+
+
+
+
+
+The style of the edges can be fully customized.
+
+
+
+
+
+
+
diff --git a/examples/network/labels/labelMargins.html b/examples/network/labels/labelMargins.html
new file mode 100644
index 0000000000..e71025435b
--- /dev/null
+++ b/examples/network/labels/labelMargins.html
@@ -0,0 +1,63 @@
+
+
+
+ Network | Label margins
+
+
+
+
+
+
+
+
+
+
+The labels of box, circle, database, icon and text nodes may have different margin values.
+ Top, right, bottom and left margins may be different for each node.
+Setting the margin value in the network's nodes property sets it as the default.
+Setting a the value to a number uses that number for the margins. If the value is an object, a different value for each margin will be set.
+Note that negative values appropriately push labels outside the node.
+
+
+
+
+
+
+
diff --git a/examples/network/labels/labelMultifont.html b/examples/network/labels/labelMultifont.html
new file mode 100644
index 0000000000..e9b9060389
--- /dev/null
+++ b/examples/network/labels/labelMultifont.html
@@ -0,0 +1,115 @@
+
+
+
+ Network | Multifont Labels
+
+
+
+
+
+
+
+
+
+
+Node and edge labels may be marked up to be drawn with multiple fonts.
+
+
+
+The value of the font.multi
property may be set to 'html'
, 'markdown'
or a boolean.
+
+ Embedded Font Markup
+ font mod font.multi
setting
+ 'html'
or true
'markdown'
or 'md'
false
+ bold <b>
... </b>
*
... *
n/a
+ italic <i>
... </i>
_
... _
n/a
+ mono-spaced <code>
... </code>
`
... `
n/a
+
+
+
+The html
and markdown
rendering is limited: bolds may be embedded in italics, italics may be embedded in bolds, and mono-spaced may be embedded in bold or italic, but will not be altered by those font mods, nor will embedded bolds or italics be handled.
+The only entities that will be observed in html are <
and &
and in markdown
a backslash will escape the following character (including a backslash) from special processing.
+Any font mod that is started in a label line will be implicitly terminated at the end of that line.
+While this interpretation may not exactly match official rendering standards, it is a consistent compromise for drawing multifont strings in the non-multifont html canvas element underlying vis.
+
+
+This implies that four additional sets of font properties will be recognized in label processing.
+font.bold
designates the font used for rendering bold font mods.
+font.ital
designates the font used for rendering italic font mods.
+font.boldital
designates the font used for rendering bold-and -italic font mods.
+font.mono
designates the font used for rendering monospaced font mods.
+Any font mod without a matching font will be rendered using the normal font
(or default) value.
+
+The font.multi
and extended font settings may be set in the network's nodes
or edges
properties, or on individual nodes and edges.
+Node and edge label fonts are separate.
+
+
+
+
+
diff --git a/examples/network/labels/labelStroke.html b/examples/network/labels/labelStroke.html
new file mode 100644
index 0000000000..b770315d0c
--- /dev/null
+++ b/examples/network/labels/labelStroke.html
@@ -0,0 +1,61 @@
+
+
+
+ Network | Label stroke
+
+
+
+
+
+
+
+
+The stroke of labels is fully can have a width and color. Edgelabels by default have a white stroke for clarity.
+
+
+
+
+
+
+
diff --git a/examples/network/labels/multilineText.html b/examples/network/labels/multilineText.html
new file mode 100644
index 0000000000..9d09199e64
--- /dev/null
+++ b/examples/network/labels/multilineText.html
@@ -0,0 +1,52 @@
+
+
+
+ Network | Multiline text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/layout/demo.jsonp b/examples/network/layout/demo.jsonp
new file mode 100644
index 0000000000..727db6fc5a
--- /dev/null
+++ b/examples/network/layout/demo.jsonp
@@ -0,0 +1,1894 @@
+p( {
+ "nodes": [
+ {
+ "level": 0,
+ "id": "0",
+ "label": "0"
+ },
+ {
+ "level": 1,
+ "id": "1",
+ "label": "1"
+ },
+ {
+ "level": 2,
+ "id": "2",
+ "label": "2"
+ },
+ {
+ "level": 3,
+ "id": "3",
+ "label": "3"
+ },
+ {
+ "level": 4,
+ "id": "4",
+ "label": "4"
+ },
+ {
+ "level": 5,
+ "id": "5",
+ "label": "5"
+ },
+ {
+ "level": 6,
+ "id": "6",
+ "label": "6"
+ },
+ {
+ "level": 7,
+ "id": "7",
+ "label": "7"
+ },
+ {
+ "level": 8,
+ "id": "8",
+ "label": "8"
+ },
+ {
+ "level": 0,
+ "id": "9",
+ "label": "9"
+ },
+ {
+ "level": 9,
+ "id": "10",
+ "label": "10"
+ },
+ {
+ "level": 10,
+ "id": "11",
+ "label": "11"
+ },
+ {
+ "level": 11,
+ "id": "12",
+ "label": "12"
+ },
+ {
+ "level": 12,
+ "id": "13",
+ "label": "13"
+ },
+ {
+ "level": 13,
+ "id": "14",
+ "label": "14"
+ },
+ {
+ "level": 13,
+ "id": "15",
+ "label": "15"
+ },
+ {
+ "level": 14,
+ "id": "16",
+ "label": "16"
+ },
+ {
+ "level": 15,
+ "id": "17",
+ "label": "17"
+ },
+ {
+ "level": 16,
+ "id": "18",
+ "label": "18"
+ },
+ {
+ "level": 17,
+ "id": "19",
+ "label": "19"
+ },
+ {
+ "level": 18,
+ "id": "20",
+ "label": "20"
+ },
+ {
+ "level": 19,
+ "id": "21",
+ "label": "21"
+ },
+ {
+ "level": 20,
+ "id": "22",
+ "label": "22"
+ },
+ {
+ "level": 21,
+ "id": "23",
+ "label": "23"
+ },
+ {
+ "level": 22,
+ "id": "24",
+ "label": "24"
+ },
+ {
+ "level": 23,
+ "id": "25",
+ "label": "25"
+ },
+ {
+ "level": 24,
+ "id": "26",
+ "label": "26"
+ },
+ {
+ "level": 25,
+ "id": "27",
+ "label": "27"
+ },
+ {
+ "level": 26,
+ "id": "28",
+ "label": "28"
+ },
+ {
+ "level": 27,
+ "id": "29",
+ "label": "29"
+ },
+ {
+ "level": 28,
+ "id": "30",
+ "label": "30"
+ },
+ {
+ "level": 29,
+ "id": "31",
+ "label": "31"
+ },
+ {
+ "level": 30,
+ "id": "32",
+ "label": "32"
+ },
+ {
+ "level": 31,
+ "id": "33",
+ "label": "33"
+ },
+ {
+ "level": 32,
+ "id": "34",
+ "label": "34"
+ },
+ {
+ "level": 32,
+ "id": "35",
+ "label": "35"
+ },
+ {
+ "level": 33,
+ "id": "36",
+ "label": "36"
+ },
+ {
+ "level": 32,
+ "id": "37",
+ "label": "37"
+ },
+ {
+ "level": 34,
+ "id": "38",
+ "label": "38"
+ },
+ {
+ "level": 35,
+ "id": "39",
+ "label": "39"
+ },
+ {
+ "level": 36,
+ "id": "40",
+ "label": "40"
+ },
+ {
+ "level": 37,
+ "id": "41",
+ "label": "41"
+ },
+ {
+ "level": 38,
+ "id": "42",
+ "label": "42"
+ },
+ {
+ "level": 33,
+ "id": "43",
+ "label": "43"
+ },
+ {
+ "level": 39,
+ "id": "44",
+ "label": "44"
+ },
+ {
+ "level": 40,
+ "id": "45",
+ "label": "45"
+ },
+ {
+ "level": 41,
+ "id": "46",
+ "label": "46"
+ },
+ {
+ "level": 42,
+ "id": "47",
+ "label": "47"
+ },
+ {
+ "level": 43,
+ "id": "48",
+ "label": "48"
+ },
+ {
+ "level": 44,
+ "id": "49",
+ "label": "49"
+ },
+ {
+ "level": 45,
+ "id": "50",
+ "label": "50"
+ },
+ {
+ "level": 46,
+ "id": "51",
+ "label": "51"
+ },
+ {
+ "level": 47,
+ "id": "52",
+ "label": "52"
+ },
+ {
+ "level": 48,
+ "id": "53",
+ "label": "53"
+ },
+ {
+ "level": 49,
+ "id": "54",
+ "label": "54"
+ },
+ {
+ "level": 50,
+ "id": "55",
+ "label": "55"
+ },
+ {
+ "level": 51,
+ "id": "56",
+ "label": "56"
+ },
+ {
+ "level": 52,
+ "id": "57",
+ "label": "57"
+ },
+ {
+ "level": 53,
+ "id": "58",
+ "label": "58"
+ },
+ {
+ "level": 54,
+ "id": "59",
+ "label": "59"
+ },
+ {
+ "level": 55,
+ "id": "60",
+ "label": "60"
+ },
+ {
+ "level": 56,
+ "id": "61",
+ "label": "61"
+ },
+ {
+ "level": 57,
+ "id": "62",
+ "label": "62"
+ },
+ {
+ "level": 58,
+ "id": "63",
+ "label": "63"
+ },
+ {
+ "level": 59,
+ "id": "64",
+ "label": "64"
+ },
+ {
+ "level": 55,
+ "id": "65",
+ "label": "65"
+ },
+ {
+ "level": 60,
+ "id": "66",
+ "label": "66"
+ },
+ {
+ "level": 61,
+ "id": "67",
+ "label": "67"
+ },
+ {
+ "level": 62,
+ "id": "68",
+ "label": "68"
+ },
+ {
+ "level": 63,
+ "id": "69",
+ "label": "69"
+ },
+ {
+ "level": 64,
+ "id": "70",
+ "label": "70"
+ },
+ {
+ "level": 65,
+ "id": "71",
+ "label": "71"
+ },
+ {
+ "level": 66,
+ "id": "72",
+ "label": "72"
+ },
+ {
+ "level": 67,
+ "id": "73",
+ "label": "73"
+ },
+ {
+ "level": 68,
+ "id": "74",
+ "label": "74"
+ },
+ {
+ "level": 69,
+ "id": "75",
+ "label": "75"
+ },
+ {
+ "level": 70,
+ "id": "76",
+ "label": "76"
+ },
+ {
+ "level": 71,
+ "id": "77",
+ "label": "77"
+ },
+ {
+ "level": 72,
+ "id": "78",
+ "label": "78"
+ },
+ {
+ "level": 73,
+ "id": "79",
+ "label": "79"
+ },
+ {
+ "level": 74,
+ "id": "80",
+ "label": "80"
+ },
+ {
+ "level": 75,
+ "id": "81",
+ "label": "81"
+ },
+ {
+ "level": 76,
+ "id": "82",
+ "label": "82"
+ },
+ {
+ "level": 77,
+ "id": "83",
+ "label": "83"
+ },
+ {
+ "level": 78,
+ "id": "84",
+ "label": "84"
+ },
+ {
+ "level": 79,
+ "id": "85",
+ "label": "85"
+ },
+ {
+ "level": 80,
+ "id": "86",
+ "label": "86"
+ },
+ {
+ "level": 81,
+ "id": "87",
+ "label": "87"
+ },
+ {
+ "level": 82,
+ "id": "88",
+ "label": "88"
+ },
+ {
+ "level": 83,
+ "id": "89",
+ "label": "89"
+ },
+ {
+ "level": 84,
+ "id": "90",
+ "label": "90"
+ },
+ {
+ "level": 80,
+ "id": "91",
+ "label": "91"
+ },
+ {
+ "level": 85,
+ "id": "92",
+ "label": "92"
+ },
+ {
+ "level": 86,
+ "id": "93",
+ "label": "93"
+ },
+ {
+ "level": 87,
+ "id": "94",
+ "label": "94"
+ },
+ {
+ "level": 88,
+ "id": "95",
+ "label": "95"
+ },
+ {
+ "level": 89,
+ "id": "96",
+ "label": "96"
+ },
+ {
+ "level": 90,
+ "id": "97",
+ "label": "97"
+ },
+ {
+ "level": 91,
+ "id": "98",
+ "label": "98"
+ },
+ {
+ "level": 92,
+ "id": "99",
+ "label": "99"
+ },
+ {
+ "level": 93,
+ "id": "100",
+ "label": "100"
+ },
+ {
+ "level": 94,
+ "id": "101",
+ "label": "101"
+ },
+ {
+ "level": 95,
+ "id": "102",
+ "label": "102"
+ },
+ {
+ "level": 96,
+ "id": "103",
+ "label": "103"
+ },
+ {
+ "level": 97,
+ "id": "104",
+ "label": "104"
+ },
+ {
+ "level": 98,
+ "id": "105",
+ "label": "105"
+ },
+ {
+ "level": 99,
+ "id": "106",
+ "label": "106"
+ },
+ {
+ "level": 100,
+ "id": "107",
+ "label": "107"
+ },
+ {
+ "level": 101,
+ "id": "108",
+ "label": "108"
+ },
+ {
+ "level": 102,
+ "id": "109",
+ "label": "109"
+ },
+ {
+ "level": 103,
+ "id": "110",
+ "label": "110"
+ },
+ {
+ "level": 104,
+ "id": "111",
+ "label": "111"
+ },
+ {
+ "level": 105,
+ "id": "112",
+ "label": "112"
+ },
+ {
+ "level": 106,
+ "id": "113",
+ "label": "113"
+ },
+ {
+ "level": 107,
+ "id": "114",
+ "label": "114"
+ },
+ {
+ "level": 108,
+ "id": "115",
+ "label": "115"
+ },
+ {
+ "level": 109,
+ "id": "116",
+ "label": "116"
+ },
+ {
+ "level": 110,
+ "id": "117",
+ "label": "117"
+ },
+ {
+ "level": 111,
+ "id": "118",
+ "label": "118"
+ },
+ {
+ "level": 112,
+ "id": "119",
+ "label": "119"
+ },
+ {
+ "level": 113,
+ "id": "120",
+ "label": "120"
+ },
+ {
+ "level": 114,
+ "id": "121",
+ "label": "121"
+ },
+ {
+ "level": 115,
+ "id": "122",
+ "label": "122"
+ },
+ {
+ "level": 116,
+ "id": "123",
+ "label": "123"
+ },
+ {
+ "level": 117,
+ "id": "124",
+ "label": "124"
+ },
+ {
+ "level": 118,
+ "id": "125",
+ "label": "125"
+ },
+ {
+ "level": 119,
+ "id": "126",
+ "label": "126"
+ },
+ {
+ "level": 120,
+ "id": "127",
+ "label": "127"
+ },
+ {
+ "level": 121,
+ "id": "128",
+ "label": "128"
+ },
+ {
+ "level": 122,
+ "id": "129",
+ "label": "129"
+ },
+ {
+ "level": 123,
+ "id": "130",
+ "label": "130"
+ },
+ {
+ "level": 124,
+ "id": "131",
+ "label": "131"
+ },
+ {
+ "level": 125,
+ "id": "132",
+ "label": "132"
+ },
+ {
+ "level": 126,
+ "id": "133",
+ "label": "133"
+ },
+ {
+ "level": 126,
+ "id": "134",
+ "label": "134"
+ },
+ {
+ "level": 127,
+ "id": "135",
+ "label": "135"
+ },
+ {
+ "level": 128,
+ "id": "136",
+ "label": "136"
+ },
+ {
+ "level": 129,
+ "id": "137",
+ "label": "137"
+ },
+ {
+ "level": 130,
+ "id": "138",
+ "label": "138"
+ },
+ {
+ "level": 131,
+ "id": "139",
+ "label": "139"
+ },
+ {
+ "level": 131,
+ "id": "140",
+ "label": "140"
+ },
+ {
+ "level": 132,
+ "id": "141",
+ "label": "141"
+ },
+ {
+ "level": 133,
+ "id": "142",
+ "label": "142"
+ },
+ {
+ "level": 134,
+ "id": "143",
+ "label": "143"
+ },
+ {
+ "level": 135,
+ "id": "144",
+ "label": "144"
+ },
+ {
+ "level": 136,
+ "id": "145",
+ "label": "145"
+ },
+ {
+ "level": 137,
+ "id": "146",
+ "label": "146"
+ },
+ {
+ "level": 138,
+ "id": "147",
+ "label": "147"
+ },
+ {
+ "level": 139,
+ "id": "148",
+ "label": "148"
+ },
+ {
+ "level": 140,
+ "id": "149",
+ "label": "149"
+ },
+ {
+ "level": 141,
+ "id": "150",
+ "label": "150"
+ },
+ {
+ "level": 142,
+ "id": "151",
+ "label": "151"
+ },
+ {
+ "level": 143,
+ "id": "152",
+ "label": "152"
+ },
+ {
+ "level": 144,
+ "id": "153",
+ "label": "153"
+ },
+ {
+ "level": 145,
+ "id": "154",
+ "label": "154"
+ },
+ {
+ "level": 146,
+ "id": "155",
+ "label": "155"
+ },
+ {
+ "level": 147,
+ "id": "156",
+ "label": "156"
+ },
+ {
+ "level": 147,
+ "id": "157",
+ "label": "157"
+ },
+ {
+ "level": 148,
+ "id": "158",
+ "label": "158"
+ },
+ {
+ "level": 149,
+ "id": "159",
+ "label": "159"
+ },
+ {
+ "level": 150,
+ "id": "160",
+ "label": "160"
+ },
+ {
+ "level": 151,
+ "id": "161",
+ "label": "161"
+ },
+ {
+ "level": 150,
+ "id": "162",
+ "label": "162"
+ },
+ {
+ "level": 152,
+ "id": "163",
+ "label": "163"
+ },
+ {
+ "level": 151,
+ "id": "164",
+ "label": "164"
+ },
+ {
+ "level": 153,
+ "id": "165",
+ "label": "165"
+ },
+ {
+ "level": 154,
+ "id": "166",
+ "label": "166"
+ },
+ {
+ "level": 155,
+ "id": "167",
+ "label": "167"
+ },
+ {
+ "level": 156,
+ "id": "168",
+ "label": "168"
+ },
+ {
+ "level": 157,
+ "id": "169",
+ "label": "169"
+ },
+ {
+ "level": 157,
+ "id": "170",
+ "label": "170"
+ },
+ {
+ "level": 158,
+ "id": "171",
+ "label": "171"
+ },
+ {
+ "level": 159,
+ "id": "172",
+ "label": "172"
+ },
+ {
+ "level": 160,
+ "id": "173",
+ "label": "173"
+ },
+ {
+ "level": 161,
+ "id": "174",
+ "label": "174"
+ },
+ {
+ "level": 162,
+ "id": "175",
+ "label": "175"
+ },
+ {
+ "level": 163,
+ "id": "176",
+ "label": "176"
+ },
+ {
+ "level": 164,
+ "id": "177",
+ "label": "177"
+ },
+ {
+ "level": 165,
+ "id": "178",
+ "label": "178"
+ },
+ {
+ "level": 166,
+ "id": "179",
+ "label": "179"
+ },
+ {
+ "level": 166,
+ "id": "180",
+ "label": "180"
+ },
+ {
+ "level": 167,
+ "id": "181",
+ "label": "181"
+ },
+ {
+ "level": 168,
+ "id": "182",
+ "label": "182"
+ },
+ {
+ "level": 168,
+ "id": "183",
+ "label": "183"
+ },
+ {
+ "level": 169,
+ "id": "184",
+ "label": "184"
+ },
+ {
+ "level": 170,
+ "id": "185",
+ "label": "185"
+ },
+ {
+ "level": 170,
+ "id": "186",
+ "label": "186"
+ },
+ {
+ "level": 171,
+ "id": "187",
+ "label": "187"
+ },
+ {
+ "level": 172,
+ "id": "188",
+ "label": "188"
+ },
+ {
+ "level": 172,
+ "id": "189",
+ "label": "189"
+ },
+ {
+ "level": 173,
+ "id": "190",
+ "label": "190"
+ },
+ {
+ "level": 174,
+ "id": "191",
+ "label": "191"
+ },
+ {
+ "level": 175,
+ "id": "192",
+ "label": "192"
+ },
+ {
+ "level": 176,
+ "id": "193",
+ "label": "193"
+ },
+ {
+ "level": 177,
+ "id": "194",
+ "label": "194"
+ },
+ {
+ "level": 178,
+ "id": "195",
+ "label": "195"
+ },
+ {
+ "level": 179,
+ "id": "196",
+ "label": "196"
+ },
+ {
+ "level": 179,
+ "id": "197",
+ "label": "197"
+ },
+ {
+ "level": 180,
+ "id": "198",
+ "label": "198"
+ },
+ {
+ "level": 181,
+ "id": "199",
+ "label": "199"
+ }
+ ],
+ "edges": [
+ {
+ "to": "0",
+ "from": "1"
+ },
+ {
+ "to": "1",
+ "from": "2"
+ },
+ {
+ "to": "2",
+ "from": "3"
+ },
+ {
+ "to": "3",
+ "from": "4"
+ },
+ {
+ "to": "4",
+ "from": "5"
+ },
+ {
+ "to": "5",
+ "from": "6"
+ },
+ {
+ "to": "6",
+ "from": "7"
+ },
+ {
+ "to": "7",
+ "from": "8"
+ },
+ {
+ "to": "8",
+ "from": "10"
+ },
+ {
+ "to": "9",
+ "from": "11"
+ },
+ {
+ "to": "10",
+ "from": "11"
+ },
+ {
+ "to": "11",
+ "from": "12"
+ },
+ {
+ "to": "12",
+ "from": "13"
+ },
+ {
+ "to": "13",
+ "from": "15"
+ },
+ {
+ "to": "13",
+ "from": "14"
+ },
+ {
+ "to": "14",
+ "from": "16"
+ },
+ {
+ "to": "15",
+ "from": "16"
+ },
+ {
+ "to": "16",
+ "from": "17"
+ },
+ {
+ "to": "17",
+ "from": "18"
+ },
+ {
+ "to": "18",
+ "from": "19"
+ },
+ {
+ "to": "19",
+ "from": "20"
+ },
+ {
+ "to": "20",
+ "from": "21"
+ },
+ {
+ "to": "21",
+ "from": "22"
+ },
+ {
+ "to": "22",
+ "from": "23"
+ },
+ {
+ "to": "23",
+ "from": "24"
+ },
+ {
+ "to": "24",
+ "from": "25"
+ },
+ {
+ "to": "25",
+ "from": "26"
+ },
+ {
+ "to": "26",
+ "from": "27"
+ },
+ {
+ "to": "27",
+ "from": "28"
+ },
+ {
+ "to": "28",
+ "from": "29"
+ },
+ {
+ "to": "29",
+ "from": "30"
+ },
+ {
+ "to": "30",
+ "from": "31"
+ },
+ {
+ "to": "31",
+ "from": "32"
+ },
+ {
+ "to": "32",
+ "from": "33"
+ },
+ {
+ "to": "33",
+ "from": "34"
+ },
+ {
+ "to": "33",
+ "from": "35"
+ },
+ {
+ "to": "33",
+ "from": "37"
+ },
+ {
+ "to": "34",
+ "from": "36"
+ },
+ {
+ "to": "34",
+ "from": "43"
+ },
+ {
+ "to": "35",
+ "from": "36"
+ },
+ {
+ "to": "35",
+ "from": "43"
+ },
+ {
+ "to": "36",
+ "from": "38"
+ },
+ {
+ "to": "37",
+ "from": "39"
+ },
+ {
+ "to": "37",
+ "from": "43"
+ },
+ {
+ "to": "38",
+ "from": "39"
+ },
+ {
+ "to": "39",
+ "from": "40"
+ },
+ {
+ "to": "40",
+ "from": "41"
+ },
+ {
+ "to": "41",
+ "from": "42"
+ },
+ {
+ "to": "42",
+ "from": "44"
+ },
+ {
+ "to": "43",
+ "from": "45"
+ },
+ {
+ "to": "44",
+ "from": "45"
+ },
+ {
+ "to": "45",
+ "from": "46"
+ },
+ {
+ "to": "46",
+ "from": "47"
+ },
+ {
+ "to": "47",
+ "from": "48"
+ },
+ {
+ "to": "48",
+ "from": "49"
+ },
+ {
+ "to": "49",
+ "from": "50"
+ },
+ {
+ "to": "50",
+ "from": "51"
+ },
+ {
+ "to": "51",
+ "from": "52"
+ },
+ {
+ "to": "52",
+ "from": "53"
+ },
+ {
+ "to": "53",
+ "from": "54"
+ },
+ {
+ "to": "54",
+ "from": "55"
+ },
+ {
+ "to": "55",
+ "from": "56"
+ },
+ {
+ "to": "56",
+ "from": "57"
+ },
+ {
+ "to": "57",
+ "from": "58"
+ },
+ {
+ "to": "58",
+ "from": "59"
+ },
+ {
+ "to": "59",
+ "from": "60"
+ },
+ {
+ "to": "59",
+ "from": "65"
+ },
+ {
+ "to": "60",
+ "from": "61"
+ },
+ {
+ "to": "61",
+ "from": "62"
+ },
+ {
+ "to": "62",
+ "from": "63"
+ },
+ {
+ "to": "63",
+ "from": "64"
+ },
+ {
+ "to": "64",
+ "from": "66"
+ },
+ {
+ "to": "65",
+ "from": "67"
+ },
+ {
+ "to": "65",
+ "from": "124"
+ },
+ {
+ "to": "66",
+ "from": "67"
+ },
+ {
+ "to": "67",
+ "from": "68"
+ },
+ {
+ "to": "68",
+ "from": "69"
+ },
+ {
+ "to": "69",
+ "from": "70"
+ },
+ {
+ "to": "70",
+ "from": "71"
+ },
+ {
+ "to": "71",
+ "from": "72"
+ },
+ {
+ "to": "72",
+ "from": "73"
+ },
+ {
+ "to": "73",
+ "from": "74"
+ },
+ {
+ "to": "74",
+ "from": "75"
+ },
+ {
+ "to": "75",
+ "from": "76"
+ },
+ {
+ "to": "76",
+ "from": "77"
+ },
+ {
+ "to": "77",
+ "from": "78"
+ },
+ {
+ "to": "78",
+ "from": "79"
+ },
+ {
+ "to": "79",
+ "from": "80"
+ },
+ {
+ "to": "80",
+ "from": "81"
+ },
+ {
+ "to": "81",
+ "from": "82"
+ },
+ {
+ "to": "82",
+ "from": "83"
+ },
+ {
+ "to": "83",
+ "from": "84"
+ },
+ {
+ "to": "84",
+ "from": "85"
+ },
+ {
+ "to": "85",
+ "from": "91"
+ },
+ {
+ "to": "85",
+ "from": "86"
+ },
+ {
+ "to": "86",
+ "from": "87"
+ },
+ {
+ "to": "87",
+ "from": "88"
+ },
+ {
+ "to": "88",
+ "from": "89"
+ },
+ {
+ "to": "89",
+ "from": "90"
+ },
+ {
+ "to": "90",
+ "from": "92"
+ },
+ {
+ "to": "91",
+ "from": "195"
+ },
+ {
+ "to": "91",
+ "from": "93"
+ },
+ {
+ "to": "91",
+ "from": "125"
+ },
+ {
+ "to": "92",
+ "from": "93"
+ },
+ {
+ "to": "93",
+ "from": "94"
+ },
+ {
+ "to": "94",
+ "from": "95"
+ },
+ {
+ "to": "95",
+ "from": "96"
+ },
+ {
+ "to": "96",
+ "from": "97"
+ },
+ {
+ "to": "97",
+ "from": "98"
+ },
+ {
+ "to": "98",
+ "from": "99"
+ },
+ {
+ "to": "99",
+ "from": "100"
+ },
+ {
+ "to": "100",
+ "from": "101"
+ },
+ {
+ "to": "101",
+ "from": "102"
+ },
+ {
+ "to": "102",
+ "from": "103"
+ },
+ {
+ "to": "103",
+ "from": "104"
+ },
+ {
+ "to": "104",
+ "from": "105"
+ },
+ {
+ "to": "105",
+ "from": "106"
+ },
+ {
+ "to": "106",
+ "from": "107"
+ },
+ {
+ "to": "107",
+ "from": "108"
+ },
+ {
+ "to": "108",
+ "from": "109"
+ },
+ {
+ "to": "109",
+ "from": "110"
+ },
+ {
+ "to": "110",
+ "from": "111"
+ },
+ {
+ "to": "111",
+ "from": "112"
+ },
+ {
+ "to": "112",
+ "from": "113"
+ },
+ {
+ "to": "113",
+ "from": "114"
+ },
+ {
+ "to": "114",
+ "from": "115"
+ },
+ {
+ "to": "115",
+ "from": "116"
+ },
+ {
+ "to": "116",
+ "from": "117"
+ },
+ {
+ "to": "117",
+ "from": "118"
+ },
+ {
+ "to": "118",
+ "from": "119"
+ },
+ {
+ "to": "119",
+ "from": "120"
+ },
+ {
+ "to": "120",
+ "from": "121"
+ },
+ {
+ "to": "121",
+ "from": "122"
+ },
+ {
+ "to": "122",
+ "from": "123"
+ },
+ {
+ "to": "123",
+ "from": "124"
+ },
+ {
+ "to": "124",
+ "from": "125"
+ },
+ {
+ "to": "125",
+ "from": "126"
+ },
+ {
+ "to": "126",
+ "from": "127"
+ },
+ {
+ "to": "127",
+ "from": "128"
+ },
+ {
+ "to": "128",
+ "from": "129"
+ },
+ {
+ "to": "129",
+ "from": "130"
+ },
+ {
+ "to": "130",
+ "from": "131"
+ },
+ {
+ "to": "131",
+ "from": "132"
+ },
+ {
+ "to": "132",
+ "from": "134"
+ },
+ {
+ "to": "132",
+ "from": "133"
+ },
+ {
+ "to": "133",
+ "from": "135"
+ },
+ {
+ "to": "134",
+ "from": "135"
+ },
+ {
+ "to": "135",
+ "from": "136"
+ },
+ {
+ "to": "136",
+ "from": "137"
+ },
+ {
+ "to": "137",
+ "from": "138"
+ },
+ {
+ "to": "138",
+ "from": "139"
+ },
+ {
+ "to": "138",
+ "from": "140"
+ },
+ {
+ "to": "139",
+ "from": "141"
+ },
+ {
+ "to": "140",
+ "from": "141"
+ },
+ {
+ "to": "141",
+ "from": "142"
+ },
+ {
+ "to": "142",
+ "from": "143"
+ },
+ {
+ "to": "143",
+ "from": "144"
+ },
+ {
+ "to": "144",
+ "from": "145"
+ },
+ {
+ "to": "145",
+ "from": "146"
+ },
+ {
+ "to": "146",
+ "from": "147"
+ },
+ {
+ "to": "147",
+ "from": "148"
+ },
+ {
+ "to": "148",
+ "from": "149"
+ },
+ {
+ "to": "149",
+ "from": "150"
+ },
+ {
+ "to": "150",
+ "from": "151"
+ },
+ {
+ "to": "151",
+ "from": "152"
+ },
+ {
+ "to": "152",
+ "from": "153"
+ },
+ {
+ "to": "153",
+ "from": "154"
+ },
+ {
+ "to": "154",
+ "from": "155"
+ },
+ {
+ "to": "155",
+ "from": "157"
+ },
+ {
+ "to": "155",
+ "from": "156"
+ },
+ {
+ "to": "156",
+ "from": "158"
+ },
+ {
+ "to": "157",
+ "from": "158"
+ },
+ {
+ "to": "158",
+ "from": "159"
+ },
+ {
+ "to": "159",
+ "from": "162"
+ },
+ {
+ "to": "159",
+ "from": "160"
+ },
+ {
+ "to": "160",
+ "from": "164"
+ },
+ {
+ "to": "160",
+ "from": "161"
+ },
+ {
+ "to": "161",
+ "from": "163"
+ },
+ {
+ "to": "162",
+ "from": "164"
+ },
+ {
+ "to": "163",
+ "from": "165"
+ },
+ {
+ "to": "164",
+ "from": "166"
+ },
+ {
+ "to": "165",
+ "from": "166"
+ },
+ {
+ "to": "166",
+ "from": "167"
+ },
+ {
+ "to": "167",
+ "from": "168"
+ },
+ {
+ "to": "168",
+ "from": "170"
+ },
+ {
+ "to": "168",
+ "from": "169"
+ },
+ {
+ "to": "169",
+ "from": "171"
+ },
+ {
+ "to": "170",
+ "from": "171"
+ },
+ {
+ "to": "171",
+ "from": "172"
+ },
+ {
+ "to": "172",
+ "from": "173"
+ },
+ {
+ "to": "173",
+ "from": "174"
+ },
+ {
+ "to": "174",
+ "from": "175"
+ },
+ {
+ "to": "175",
+ "from": "176"
+ },
+ {
+ "to": "176",
+ "from": "177"
+ },
+ {
+ "to": "177",
+ "from": "178"
+ },
+ {
+ "to": "178",
+ "from": "180"
+ },
+ {
+ "to": "178",
+ "from": "179"
+ },
+ {
+ "to": "179",
+ "from": "181"
+ },
+ {
+ "to": "180",
+ "from": "181"
+ },
+ {
+ "to": "181",
+ "from": "183"
+ },
+ {
+ "to": "181",
+ "from": "182"
+ },
+ {
+ "to": "182",
+ "from": "184"
+ },
+ {
+ "to": "183",
+ "from": "184"
+ },
+ {
+ "to": "184",
+ "from": "186"
+ },
+ {
+ "to": "184",
+ "from": "185"
+ },
+ {
+ "to": "185",
+ "from": "187"
+ },
+ {
+ "to": "186",
+ "from": "189"
+ },
+ {
+ "to": "186",
+ "from": "188"
+ },
+ {
+ "to": "187",
+ "from": "188"
+ },
+ {
+ "to": "187",
+ "from": "189"
+ },
+ {
+ "to": "188",
+ "from": "190"
+ },
+ {
+ "to": "189",
+ "from": "191"
+ },
+ {
+ "to": "190",
+ "from": "191"
+ },
+ {
+ "to": "191",
+ "from": "192"
+ },
+ {
+ "to": "192",
+ "from": "193"
+ },
+ {
+ "to": "193",
+ "from": "194"
+ },
+ {
+ "to": "194",
+ "from": "195"
+ },
+ {
+ "to": "195",
+ "from": "197"
+ },
+ {
+ "to": "195",
+ "from": "196"
+ },
+ {
+ "to": "196",
+ "from": "198"
+ },
+ {
+ "to": "197",
+ "from": "198"
+ },
+ {
+ "to": "198",
+ "from": "199"
+ }
+ ]
+} );
diff --git a/examples/network/layout/demo_big.jsonp b/examples/network/layout/demo_big.jsonp
new file mode 100644
index 0000000000..e9f2c0b9d2
--- /dev/null
+++ b/examples/network/layout/demo_big.jsonp
@@ -0,0 +1,3762 @@
+p( {
+ "nodes": [
+ {
+ "level": 0,
+ "id": "0",
+ "label": "0"
+ },
+ {
+ "level": 1,
+ "id": "1",
+ "label": "1"
+ },
+ {
+ "level": 2,
+ "id": "2",
+ "label": "2"
+ },
+ {
+ "level": 3,
+ "id": "3",
+ "label": "3"
+ },
+ {
+ "level": 4,
+ "id": "4",
+ "label": "4"
+ },
+ {
+ "level": 5,
+ "id": "5",
+ "label": "5"
+ },
+ {
+ "level": 6,
+ "id": "6",
+ "label": "6"
+ },
+ {
+ "level": 7,
+ "id": "7",
+ "label": "7"
+ },
+ {
+ "level": 8,
+ "id": "8",
+ "label": "8"
+ },
+ {
+ "level": 0,
+ "id": "9",
+ "label": "9"
+ },
+ {
+ "level": 9,
+ "id": "10",
+ "label": "10"
+ },
+ {
+ "level": 10,
+ "id": "11",
+ "label": "11"
+ },
+ {
+ "level": 11,
+ "id": "12",
+ "label": "12"
+ },
+ {
+ "level": 12,
+ "id": "13",
+ "label": "13"
+ },
+ {
+ "level": 13,
+ "id": "14",
+ "label": "14"
+ },
+ {
+ "level": 13,
+ "id": "15",
+ "label": "15"
+ },
+ {
+ "level": 14,
+ "id": "16",
+ "label": "16"
+ },
+ {
+ "level": 15,
+ "id": "17",
+ "label": "17"
+ },
+ {
+ "level": 16,
+ "id": "18",
+ "label": "18"
+ },
+ {
+ "level": 17,
+ "id": "19",
+ "label": "19"
+ },
+ {
+ "level": 18,
+ "id": "20",
+ "label": "20"
+ },
+ {
+ "level": 19,
+ "id": "21",
+ "label": "21"
+ },
+ {
+ "level": 20,
+ "id": "22",
+ "label": "22"
+ },
+ {
+ "level": 21,
+ "id": "23",
+ "label": "23"
+ },
+ {
+ "level": 22,
+ "id": "24",
+ "label": "24"
+ },
+ {
+ "level": 23,
+ "id": "25",
+ "label": "25"
+ },
+ {
+ "level": 24,
+ "id": "26",
+ "label": "26"
+ },
+ {
+ "level": 25,
+ "id": "27",
+ "label": "27"
+ },
+ {
+ "level": 26,
+ "id": "28",
+ "label": "28"
+ },
+ {
+ "level": 27,
+ "id": "29",
+ "label": "29"
+ },
+ {
+ "level": 28,
+ "id": "30",
+ "label": "30"
+ },
+ {
+ "level": 29,
+ "id": "31",
+ "label": "31"
+ },
+ {
+ "level": 30,
+ "id": "32",
+ "label": "32"
+ },
+ {
+ "level": 31,
+ "id": "33",
+ "label": "33"
+ },
+ {
+ "level": 32,
+ "id": "34",
+ "label": "34"
+ },
+ {
+ "level": 32,
+ "id": "35",
+ "label": "35"
+ },
+ {
+ "level": 33,
+ "id": "36",
+ "label": "36"
+ },
+ {
+ "level": 32,
+ "id": "37",
+ "label": "37"
+ },
+ {
+ "level": 34,
+ "id": "38",
+ "label": "38"
+ },
+ {
+ "level": 35,
+ "id": "39",
+ "label": "39"
+ },
+ {
+ "level": 36,
+ "id": "40",
+ "label": "40"
+ },
+ {
+ "level": 37,
+ "id": "41",
+ "label": "41"
+ },
+ {
+ "level": 38,
+ "id": "42",
+ "label": "42"
+ },
+ {
+ "level": 33,
+ "id": "43",
+ "label": "43"
+ },
+ {
+ "level": 39,
+ "id": "44",
+ "label": "44"
+ },
+ {
+ "level": 40,
+ "id": "45",
+ "label": "45"
+ },
+ {
+ "level": 41,
+ "id": "46",
+ "label": "46"
+ },
+ {
+ "level": 42,
+ "id": "47",
+ "label": "47"
+ },
+ {
+ "level": 43,
+ "id": "48",
+ "label": "48"
+ },
+ {
+ "level": 44,
+ "id": "49",
+ "label": "49"
+ },
+ {
+ "level": 45,
+ "id": "50",
+ "label": "50"
+ },
+ {
+ "level": 46,
+ "id": "51",
+ "label": "51"
+ },
+ {
+ "level": 47,
+ "id": "52",
+ "label": "52"
+ },
+ {
+ "level": 48,
+ "id": "53",
+ "label": "53"
+ },
+ {
+ "level": 49,
+ "id": "54",
+ "label": "54"
+ },
+ {
+ "level": 50,
+ "id": "55",
+ "label": "55"
+ },
+ {
+ "level": 51,
+ "id": "56",
+ "label": "56"
+ },
+ {
+ "level": 52,
+ "id": "57",
+ "label": "57"
+ },
+ {
+ "level": 53,
+ "id": "58",
+ "label": "58"
+ },
+ {
+ "level": 54,
+ "id": "59",
+ "label": "59"
+ },
+ {
+ "level": 55,
+ "id": "60",
+ "label": "60"
+ },
+ {
+ "level": 56,
+ "id": "61",
+ "label": "61"
+ },
+ {
+ "level": 57,
+ "id": "62",
+ "label": "62"
+ },
+ {
+ "level": 58,
+ "id": "63",
+ "label": "63"
+ },
+ {
+ "level": 59,
+ "id": "64",
+ "label": "64"
+ },
+ {
+ "level": 55,
+ "id": "65",
+ "label": "65"
+ },
+ {
+ "level": 60,
+ "id": "66",
+ "label": "66"
+ },
+ {
+ "level": 61,
+ "id": "67",
+ "label": "67"
+ },
+ {
+ "level": 62,
+ "id": "68",
+ "label": "68"
+ },
+ {
+ "level": 63,
+ "id": "69",
+ "label": "69"
+ },
+ {
+ "level": 64,
+ "id": "70",
+ "label": "70"
+ },
+ {
+ "level": 65,
+ "id": "71",
+ "label": "71"
+ },
+ {
+ "level": 66,
+ "id": "72",
+ "label": "72"
+ },
+ {
+ "level": 67,
+ "id": "73",
+ "label": "73"
+ },
+ {
+ "level": 68,
+ "id": "74",
+ "label": "74"
+ },
+ {
+ "level": 69,
+ "id": "75",
+ "label": "75"
+ },
+ {
+ "level": 70,
+ "id": "76",
+ "label": "76"
+ },
+ {
+ "level": 71,
+ "id": "77",
+ "label": "77"
+ },
+ {
+ "level": 72,
+ "id": "78",
+ "label": "78"
+ },
+ {
+ "level": 73,
+ "id": "79",
+ "label": "79"
+ },
+ {
+ "level": 74,
+ "id": "80",
+ "label": "80"
+ },
+ {
+ "level": 75,
+ "id": "81",
+ "label": "81"
+ },
+ {
+ "level": 76,
+ "id": "82",
+ "label": "82"
+ },
+ {
+ "level": 77,
+ "id": "83",
+ "label": "83"
+ },
+ {
+ "level": 78,
+ "id": "84",
+ "label": "84"
+ },
+ {
+ "level": 79,
+ "id": "85",
+ "label": "85"
+ },
+ {
+ "level": 80,
+ "id": "86",
+ "label": "86"
+ },
+ {
+ "level": 81,
+ "id": "87",
+ "label": "87"
+ },
+ {
+ "level": 82,
+ "id": "88",
+ "label": "88"
+ },
+ {
+ "level": 83,
+ "id": "89",
+ "label": "89"
+ },
+ {
+ "level": 84,
+ "id": "90",
+ "label": "90"
+ },
+ {
+ "level": 80,
+ "id": "91",
+ "label": "91"
+ },
+ {
+ "level": 85,
+ "id": "92",
+ "label": "92"
+ },
+ {
+ "level": 86,
+ "id": "93",
+ "label": "93"
+ },
+ {
+ "level": 87,
+ "id": "94",
+ "label": "94"
+ },
+ {
+ "level": 88,
+ "id": "95",
+ "label": "95"
+ },
+ {
+ "level": 89,
+ "id": "96",
+ "label": "96"
+ },
+ {
+ "level": 90,
+ "id": "97",
+ "label": "97"
+ },
+ {
+ "level": 91,
+ "id": "98",
+ "label": "98"
+ },
+ {
+ "level": 92,
+ "id": "99",
+ "label": "99"
+ },
+ {
+ "level": 93,
+ "id": "100",
+ "label": "100"
+ },
+ {
+ "level": 94,
+ "id": "101",
+ "label": "101"
+ },
+ {
+ "level": 95,
+ "id": "102",
+ "label": "102"
+ },
+ {
+ "level": 96,
+ "id": "103",
+ "label": "103"
+ },
+ {
+ "level": 97,
+ "id": "104",
+ "label": "104"
+ },
+ {
+ "level": 98,
+ "id": "105",
+ "label": "105"
+ },
+ {
+ "level": 99,
+ "id": "106",
+ "label": "106"
+ },
+ {
+ "level": 100,
+ "id": "107",
+ "label": "107"
+ },
+ {
+ "level": 101,
+ "id": "108",
+ "label": "108"
+ },
+ {
+ "level": 102,
+ "id": "109",
+ "label": "109"
+ },
+ {
+ "level": 103,
+ "id": "110",
+ "label": "110"
+ },
+ {
+ "level": 104,
+ "id": "111",
+ "label": "111"
+ },
+ {
+ "level": 105,
+ "id": "112",
+ "label": "112"
+ },
+ {
+ "level": 106,
+ "id": "113",
+ "label": "113"
+ },
+ {
+ "level": 107,
+ "id": "114",
+ "label": "114"
+ },
+ {
+ "level": 108,
+ "id": "115",
+ "label": "115"
+ },
+ {
+ "level": 109,
+ "id": "116",
+ "label": "116"
+ },
+ {
+ "level": 110,
+ "id": "117",
+ "label": "117"
+ },
+ {
+ "level": 111,
+ "id": "118",
+ "label": "118"
+ },
+ {
+ "level": 112,
+ "id": "119",
+ "label": "119"
+ },
+ {
+ "level": 113,
+ "id": "120",
+ "label": "120"
+ },
+ {
+ "level": 114,
+ "id": "121",
+ "label": "121"
+ },
+ {
+ "level": 115,
+ "id": "122",
+ "label": "122"
+ },
+ {
+ "level": 116,
+ "id": "123",
+ "label": "123"
+ },
+ {
+ "level": 117,
+ "id": "124",
+ "label": "124"
+ },
+ {
+ "level": 118,
+ "id": "125",
+ "label": "125"
+ },
+ {
+ "level": 119,
+ "id": "126",
+ "label": "126"
+ },
+ {
+ "level": 120,
+ "id": "127",
+ "label": "127"
+ },
+ {
+ "level": 121,
+ "id": "128",
+ "label": "128"
+ },
+ {
+ "level": 122,
+ "id": "129",
+ "label": "129"
+ },
+ {
+ "level": 123,
+ "id": "130",
+ "label": "130"
+ },
+ {
+ "level": 124,
+ "id": "131",
+ "label": "131"
+ },
+ {
+ "level": 125,
+ "id": "132",
+ "label": "132"
+ },
+ {
+ "level": 126,
+ "id": "133",
+ "label": "133"
+ },
+ {
+ "level": 126,
+ "id": "134",
+ "label": "134"
+ },
+ {
+ "level": 127,
+ "id": "135",
+ "label": "135"
+ },
+ {
+ "level": 128,
+ "id": "136",
+ "label": "136"
+ },
+ {
+ "level": 129,
+ "id": "137",
+ "label": "137"
+ },
+ {
+ "level": 130,
+ "id": "138",
+ "label": "138"
+ },
+ {
+ "level": 131,
+ "id": "139",
+ "label": "139"
+ },
+ {
+ "level": 131,
+ "id": "140",
+ "label": "140"
+ },
+ {
+ "level": 132,
+ "id": "141",
+ "label": "141"
+ },
+ {
+ "level": 133,
+ "id": "142",
+ "label": "142"
+ },
+ {
+ "level": 134,
+ "id": "143",
+ "label": "143"
+ },
+ {
+ "level": 135,
+ "id": "144",
+ "label": "144"
+ },
+ {
+ "level": 136,
+ "id": "145",
+ "label": "145"
+ },
+ {
+ "level": 137,
+ "id": "146",
+ "label": "146"
+ },
+ {
+ "level": 138,
+ "id": "147",
+ "label": "147"
+ },
+ {
+ "level": 139,
+ "id": "148",
+ "label": "148"
+ },
+ {
+ "level": 140,
+ "id": "149",
+ "label": "149"
+ },
+ {
+ "level": 141,
+ "id": "150",
+ "label": "150"
+ },
+ {
+ "level": 142,
+ "id": "151",
+ "label": "151"
+ },
+ {
+ "level": 143,
+ "id": "152",
+ "label": "152"
+ },
+ {
+ "level": 144,
+ "id": "153",
+ "label": "153"
+ },
+ {
+ "level": 145,
+ "id": "154",
+ "label": "154"
+ },
+ {
+ "level": 146,
+ "id": "155",
+ "label": "155"
+ },
+ {
+ "level": 147,
+ "id": "156",
+ "label": "156"
+ },
+ {
+ "level": 147,
+ "id": "157",
+ "label": "157"
+ },
+ {
+ "level": 148,
+ "id": "158",
+ "label": "158"
+ },
+ {
+ "level": 149,
+ "id": "159",
+ "label": "159"
+ },
+ {
+ "level": 150,
+ "id": "160",
+ "label": "160"
+ },
+ {
+ "level": 151,
+ "id": "161",
+ "label": "161"
+ },
+ {
+ "level": 150,
+ "id": "162",
+ "label": "162"
+ },
+ {
+ "level": 152,
+ "id": "163",
+ "label": "163"
+ },
+ {
+ "level": 151,
+ "id": "164",
+ "label": "164"
+ },
+ {
+ "level": 153,
+ "id": "165",
+ "label": "165"
+ },
+ {
+ "level": 154,
+ "id": "166",
+ "label": "166"
+ },
+ {
+ "level": 155,
+ "id": "167",
+ "label": "167"
+ },
+ {
+ "level": 156,
+ "id": "168",
+ "label": "168"
+ },
+ {
+ "level": 157,
+ "id": "169",
+ "label": "169"
+ },
+ {
+ "level": 157,
+ "id": "170",
+ "label": "170"
+ },
+ {
+ "level": 158,
+ "id": "171",
+ "label": "171"
+ },
+ {
+ "level": 159,
+ "id": "172",
+ "label": "172"
+ },
+ {
+ "level": 160,
+ "id": "173",
+ "label": "173"
+ },
+ {
+ "level": 161,
+ "id": "174",
+ "label": "174"
+ },
+ {
+ "level": 162,
+ "id": "175",
+ "label": "175"
+ },
+ {
+ "level": 163,
+ "id": "176",
+ "label": "176"
+ },
+ {
+ "level": 164,
+ "id": "177",
+ "label": "177"
+ },
+ {
+ "level": 165,
+ "id": "178",
+ "label": "178"
+ },
+ {
+ "level": 166,
+ "id": "179",
+ "label": "179"
+ },
+ {
+ "level": 166,
+ "id": "180",
+ "label": "180"
+ },
+ {
+ "level": 167,
+ "id": "181",
+ "label": "181"
+ },
+ {
+ "level": 168,
+ "id": "182",
+ "label": "182"
+ },
+ {
+ "level": 168,
+ "id": "183",
+ "label": "183"
+ },
+ {
+ "level": 169,
+ "id": "184",
+ "label": "184"
+ },
+ {
+ "level": 170,
+ "id": "185",
+ "label": "185"
+ },
+ {
+ "level": 170,
+ "id": "186",
+ "label": "186"
+ },
+ {
+ "level": 171,
+ "id": "187",
+ "label": "187"
+ },
+ {
+ "level": 172,
+ "id": "188",
+ "label": "188"
+ },
+ {
+ "level": 172,
+ "id": "189",
+ "label": "189"
+ },
+ {
+ "level": 173,
+ "id": "190",
+ "label": "190"
+ },
+ {
+ "level": 174,
+ "id": "191",
+ "label": "191"
+ },
+ {
+ "level": 175,
+ "id": "192",
+ "label": "192"
+ },
+ {
+ "level": 176,
+ "id": "193",
+ "label": "193"
+ },
+ {
+ "level": 177,
+ "id": "194",
+ "label": "194"
+ },
+ {
+ "level": 178,
+ "id": "195",
+ "label": "195"
+ },
+ {
+ "level": 179,
+ "id": "196",
+ "label": "196"
+ },
+ {
+ "level": 179,
+ "id": "197",
+ "label": "197"
+ },
+ {
+ "level": 180,
+ "id": "198",
+ "label": "198"
+ },
+ {
+ "level": 181,
+ "id": "199",
+ "label": "199"
+ },
+ {
+ "level": 182,
+ "id": "200",
+ "label": "200"
+ },
+ {
+ "level": 183,
+ "id": "201",
+ "label": "201"
+ },
+ {
+ "level": 184,
+ "id": "202",
+ "label": "202"
+ },
+ {
+ "level": 185,
+ "id": "203",
+ "label": "203"
+ },
+ {
+ "level": 186,
+ "id": "204",
+ "label": "204"
+ },
+ {
+ "level": 187,
+ "id": "205",
+ "label": "205"
+ },
+ {
+ "level": 188,
+ "id": "206",
+ "label": "206"
+ },
+ {
+ "level": 189,
+ "id": "207",
+ "label": "207"
+ },
+ {
+ "level": 190,
+ "id": "208",
+ "label": "208"
+ },
+ {
+ "level": 191,
+ "id": "209",
+ "label": "209"
+ },
+ {
+ "level": 192,
+ "id": "210",
+ "label": "210"
+ },
+ {
+ "level": 193,
+ "id": "211",
+ "label": "211"
+ },
+ {
+ "level": 194,
+ "id": "212",
+ "label": "212"
+ },
+ {
+ "level": 195,
+ "id": "213",
+ "label": "213"
+ },
+ {
+ "level": 196,
+ "id": "214",
+ "label": "214"
+ },
+ {
+ "level": 197,
+ "id": "215",
+ "label": "215"
+ },
+ {
+ "level": 198,
+ "id": "216",
+ "label": "216"
+ },
+ {
+ "level": 199,
+ "id": "217",
+ "label": "217"
+ },
+ {
+ "level": 200,
+ "id": "218",
+ "label": "218"
+ },
+ {
+ "level": 201,
+ "id": "219",
+ "label": "219"
+ },
+ {
+ "level": 202,
+ "id": "220",
+ "label": "220"
+ },
+ {
+ "level": 203,
+ "id": "221",
+ "label": "221"
+ },
+ {
+ "level": 204,
+ "id": "222",
+ "label": "222"
+ },
+ {
+ "level": 205,
+ "id": "223",
+ "label": "223"
+ },
+ {
+ "level": 206,
+ "id": "224",
+ "label": "224"
+ },
+ {
+ "level": 207,
+ "id": "225",
+ "label": "225"
+ },
+ {
+ "level": 208,
+ "id": "226",
+ "label": "226"
+ },
+ {
+ "level": 209,
+ "id": "227",
+ "label": "227"
+ },
+ {
+ "level": 210,
+ "id": "228",
+ "label": "228"
+ },
+ {
+ "level": 211,
+ "id": "229",
+ "label": "229"
+ },
+ {
+ "level": 212,
+ "id": "230",
+ "label": "230"
+ },
+ {
+ "level": 213,
+ "id": "231",
+ "label": "231"
+ },
+ {
+ "level": 214,
+ "id": "232",
+ "label": "232"
+ },
+ {
+ "level": 215,
+ "id": "233",
+ "label": "233"
+ },
+ {
+ "level": 216,
+ "id": "234",
+ "label": "234"
+ },
+ {
+ "level": 217,
+ "id": "235",
+ "label": "235"
+ },
+ {
+ "level": 218,
+ "id": "236",
+ "label": "236"
+ },
+ {
+ "level": 219,
+ "id": "237",
+ "label": "237"
+ },
+ {
+ "level": 220,
+ "id": "238",
+ "label": "238"
+ },
+ {
+ "level": 221,
+ "id": "239",
+ "label": "239"
+ },
+ {
+ "level": 222,
+ "id": "240",
+ "label": "240"
+ },
+ {
+ "level": 223,
+ "id": "241",
+ "label": "241"
+ },
+ {
+ "level": 212,
+ "id": "242",
+ "label": "242"
+ },
+ {
+ "level": 213,
+ "id": "243",
+ "label": "243"
+ },
+ {
+ "level": 214,
+ "id": "244",
+ "label": "244"
+ },
+ {
+ "level": 215,
+ "id": "245",
+ "label": "245"
+ },
+ {
+ "level": 215,
+ "id": "246",
+ "label": "246"
+ },
+ {
+ "level": 216,
+ "id": "247",
+ "label": "247"
+ },
+ {
+ "level": 217,
+ "id": "248",
+ "label": "248"
+ },
+ {
+ "level": 218,
+ "id": "249",
+ "label": "249"
+ },
+ {
+ "level": 219,
+ "id": "250",
+ "label": "250"
+ },
+ {
+ "level": 220,
+ "id": "251",
+ "label": "251"
+ },
+ {
+ "level": 221,
+ "id": "252",
+ "label": "252"
+ },
+ {
+ "level": 222,
+ "id": "253",
+ "label": "253"
+ },
+ {
+ "level": 223,
+ "id": "254",
+ "label": "254"
+ },
+ {
+ "level": 223,
+ "id": "255",
+ "label": "255"
+ },
+ {
+ "level": 224,
+ "id": "256",
+ "label": "256"
+ },
+ {
+ "level": 225,
+ "id": "257",
+ "label": "257"
+ },
+ {
+ "level": 226,
+ "id": "258",
+ "label": "258"
+ },
+ {
+ "level": 227,
+ "id": "259",
+ "label": "259"
+ },
+ {
+ "level": 228,
+ "id": "260",
+ "label": "260"
+ },
+ {
+ "level": 229,
+ "id": "261",
+ "label": "261"
+ },
+ {
+ "level": 230,
+ "id": "262",
+ "label": "262"
+ },
+ {
+ "level": 231,
+ "id": "263",
+ "label": "263"
+ },
+ {
+ "level": 232,
+ "id": "264",
+ "label": "264"
+ },
+ {
+ "level": 233,
+ "id": "265",
+ "label": "265"
+ },
+ {
+ "level": 234,
+ "id": "266",
+ "label": "266"
+ },
+ {
+ "level": 235,
+ "id": "267",
+ "label": "267"
+ },
+ {
+ "level": 234,
+ "id": "268",
+ "label": "268"
+ },
+ {
+ "level": 236,
+ "id": "269",
+ "label": "269"
+ },
+ {
+ "level": 237,
+ "id": "270",
+ "label": "270"
+ },
+ {
+ "level": 238,
+ "id": "271",
+ "label": "271"
+ },
+ {
+ "level": 239,
+ "id": "272",
+ "label": "272"
+ },
+ {
+ "level": 240,
+ "id": "273",
+ "label": "273"
+ },
+ {
+ "level": 241,
+ "id": "274",
+ "label": "274"
+ },
+ {
+ "level": 242,
+ "id": "275",
+ "label": "275"
+ },
+ {
+ "level": 243,
+ "id": "276",
+ "label": "276"
+ },
+ {
+ "level": 244,
+ "id": "277",
+ "label": "277"
+ },
+ {
+ "level": 245,
+ "id": "278",
+ "label": "278"
+ },
+ {
+ "level": 246,
+ "id": "279",
+ "label": "279"
+ },
+ {
+ "level": 246,
+ "id": "280",
+ "label": "280"
+ },
+ {
+ "level": 247,
+ "id": "281",
+ "label": "281"
+ },
+ {
+ "level": 247,
+ "id": "282",
+ "label": "282"
+ },
+ {
+ "level": 248,
+ "id": "283",
+ "label": "283"
+ },
+ {
+ "level": 248,
+ "id": "284",
+ "label": "284"
+ },
+ {
+ "level": 249,
+ "id": "285",
+ "label": "285"
+ },
+ {
+ "level": 249,
+ "id": "286",
+ "label": "286"
+ },
+ {
+ "level": 250,
+ "id": "287",
+ "label": "287"
+ },
+ {
+ "level": 251,
+ "id": "288",
+ "label": "288"
+ },
+ {
+ "level": 252,
+ "id": "289",
+ "label": "289"
+ },
+ {
+ "level": 253,
+ "id": "290",
+ "label": "290"
+ },
+ {
+ "level": 254,
+ "id": "291",
+ "label": "291"
+ },
+ {
+ "level": 255,
+ "id": "292",
+ "label": "292"
+ },
+ {
+ "level": 256,
+ "id": "293",
+ "label": "293"
+ },
+ {
+ "level": 257,
+ "id": "294",
+ "label": "294"
+ },
+ {
+ "level": 258,
+ "id": "295",
+ "label": "295"
+ },
+ {
+ "level": 259,
+ "id": "296",
+ "label": "296"
+ },
+ {
+ "level": 260,
+ "id": "297",
+ "label": "297"
+ },
+ {
+ "level": 261,
+ "id": "298",
+ "label": "298"
+ },
+ {
+ "level": 262,
+ "id": "299",
+ "label": "299"
+ },
+ {
+ "level": 263,
+ "id": "300",
+ "label": "300"
+ },
+ {
+ "level": 264,
+ "id": "301",
+ "label": "301"
+ },
+ {
+ "level": 265,
+ "id": "302",
+ "label": "302"
+ },
+ {
+ "level": 266,
+ "id": "303",
+ "label": "303"
+ },
+ {
+ "level": 267,
+ "id": "304",
+ "label": "304"
+ },
+ {
+ "level": 268,
+ "id": "305",
+ "label": "305"
+ },
+ {
+ "level": 269,
+ "id": "306",
+ "label": "306"
+ },
+ {
+ "level": 270,
+ "id": "307",
+ "label": "307"
+ },
+ {
+ "level": 271,
+ "id": "308",
+ "label": "308"
+ },
+ {
+ "level": 272,
+ "id": "309",
+ "label": "309"
+ },
+ {
+ "level": 273,
+ "id": "310",
+ "label": "310"
+ },
+ {
+ "level": 274,
+ "id": "311",
+ "label": "311"
+ },
+ {
+ "level": 275,
+ "id": "312",
+ "label": "312"
+ },
+ {
+ "level": 276,
+ "id": "313",
+ "label": "313"
+ },
+ {
+ "level": 277,
+ "id": "314",
+ "label": "314"
+ },
+ {
+ "level": 278,
+ "id": "315",
+ "label": "315"
+ },
+ {
+ "level": 279,
+ "id": "316",
+ "label": "316"
+ },
+ {
+ "level": 280,
+ "id": "317",
+ "label": "317"
+ },
+ {
+ "level": 280,
+ "id": "318",
+ "label": "318"
+ },
+ {
+ "level": 281,
+ "id": "319",
+ "label": "319"
+ },
+ {
+ "level": 282,
+ "id": "320",
+ "label": "320"
+ },
+ {
+ "level": 283,
+ "id": "321",
+ "label": "321"
+ },
+ {
+ "level": 284,
+ "id": "322",
+ "label": "322"
+ },
+ {
+ "level": 285,
+ "id": "323",
+ "label": "323"
+ },
+ {
+ "level": 286,
+ "id": "324",
+ "label": "324"
+ },
+ {
+ "level": 287,
+ "id": "325",
+ "label": "325"
+ },
+ {
+ "level": 288,
+ "id": "326",
+ "label": "326"
+ },
+ {
+ "level": 289,
+ "id": "327",
+ "label": "327"
+ },
+ {
+ "level": 290,
+ "id": "328",
+ "label": "328"
+ },
+ {
+ "level": 291,
+ "id": "329",
+ "label": "329"
+ },
+ {
+ "level": 292,
+ "id": "330",
+ "label": "330"
+ },
+ {
+ "level": 293,
+ "id": "331",
+ "label": "331"
+ },
+ {
+ "level": 281,
+ "id": "332",
+ "label": "332"
+ },
+ {
+ "level": 282,
+ "id": "333",
+ "label": "333"
+ },
+ {
+ "level": 283,
+ "id": "334",
+ "label": "334"
+ },
+ {
+ "level": 284,
+ "id": "335",
+ "label": "335"
+ },
+ {
+ "level": 285,
+ "id": "336",
+ "label": "336"
+ },
+ {
+ "level": 286,
+ "id": "337",
+ "label": "337"
+ },
+ {
+ "level": 287,
+ "id": "338",
+ "label": "338"
+ },
+ {
+ "level": 288,
+ "id": "339",
+ "label": "339"
+ },
+ {
+ "level": 289,
+ "id": "340",
+ "label": "340"
+ },
+ {
+ "level": 290,
+ "id": "341",
+ "label": "341"
+ },
+ {
+ "level": 291,
+ "id": "342",
+ "label": "342"
+ },
+ {
+ "level": 292,
+ "id": "343",
+ "label": "343"
+ },
+ {
+ "level": 293,
+ "id": "344",
+ "label": "344"
+ },
+ {
+ "level": 294,
+ "id": "345",
+ "label": "345"
+ },
+ {
+ "level": 295,
+ "id": "346",
+ "label": "346"
+ },
+ {
+ "level": 296,
+ "id": "347",
+ "label": "347"
+ },
+ {
+ "level": 297,
+ "id": "348",
+ "label": "348"
+ },
+ {
+ "level": 298,
+ "id": "349",
+ "label": "349"
+ },
+ {
+ "level": 299,
+ "id": "350",
+ "label": "350"
+ },
+ {
+ "level": 300,
+ "id": "351",
+ "label": "351"
+ },
+ {
+ "level": 301,
+ "id": "352",
+ "label": "352"
+ },
+ {
+ "level": 302,
+ "id": "353",
+ "label": "353"
+ },
+ {
+ "level": 303,
+ "id": "354",
+ "label": "354"
+ },
+ {
+ "level": 304,
+ "id": "355",
+ "label": "355"
+ },
+ {
+ "level": 305,
+ "id": "356",
+ "label": "356"
+ },
+ {
+ "level": 306,
+ "id": "357",
+ "label": "357"
+ },
+ {
+ "level": 307,
+ "id": "358",
+ "label": "358"
+ },
+ {
+ "level": 308,
+ "id": "359",
+ "label": "359"
+ },
+ {
+ "level": 309,
+ "id": "360",
+ "label": "360"
+ },
+ {
+ "level": 310,
+ "id": "361",
+ "label": "361"
+ },
+ {
+ "level": 311,
+ "id": "362",
+ "label": "362"
+ },
+ {
+ "level": 312,
+ "id": "363",
+ "label": "363"
+ },
+ {
+ "level": 313,
+ "id": "364",
+ "label": "364"
+ },
+ {
+ "level": 314,
+ "id": "365",
+ "label": "365"
+ },
+ {
+ "level": 315,
+ "id": "366",
+ "label": "366"
+ },
+ {
+ "level": 316,
+ "id": "367",
+ "label": "367"
+ },
+ {
+ "level": 317,
+ "id": "368",
+ "label": "368"
+ },
+ {
+ "level": 318,
+ "id": "369",
+ "label": "369"
+ },
+ {
+ "level": 319,
+ "id": "370",
+ "label": "370"
+ },
+ {
+ "level": 320,
+ "id": "371",
+ "label": "371"
+ },
+ {
+ "level": 321,
+ "id": "372",
+ "label": "372"
+ },
+ {
+ "level": 322,
+ "id": "373",
+ "label": "373"
+ },
+ {
+ "level": 323,
+ "id": "374",
+ "label": "374"
+ },
+ {
+ "level": 324,
+ "id": "375",
+ "label": "375"
+ },
+ {
+ "level": 325,
+ "id": "376",
+ "label": "376"
+ },
+ {
+ "level": 326,
+ "id": "377",
+ "label": "377"
+ },
+ {
+ "level": 327,
+ "id": "378",
+ "label": "378"
+ },
+ {
+ "level": 328,
+ "id": "379",
+ "label": "379"
+ },
+ {
+ "level": 329,
+ "id": "380",
+ "label": "380"
+ },
+ {
+ "level": 330,
+ "id": "381",
+ "label": "381"
+ },
+ {
+ "level": 331,
+ "id": "382",
+ "label": "382"
+ },
+ {
+ "level": 332,
+ "id": "383",
+ "label": "383"
+ },
+ {
+ "level": 333,
+ "id": "384",
+ "label": "384"
+ },
+ {
+ "level": 334,
+ "id": "385",
+ "label": "385"
+ },
+ {
+ "level": 14,
+ "id": "386",
+ "label": "386"
+ },
+ {
+ "level": 335,
+ "id": "387",
+ "label": "387"
+ },
+ {
+ "level": 15,
+ "id": "388",
+ "label": "388"
+ },
+ {
+ "level": 336,
+ "id": "389",
+ "label": "389"
+ },
+ {
+ "level": 337,
+ "id": "390",
+ "label": "390"
+ },
+ {
+ "level": 338,
+ "id": "391",
+ "label": "391"
+ },
+ {
+ "level": 339,
+ "id": "392",
+ "label": "392"
+ },
+ {
+ "level": 340,
+ "id": "393",
+ "label": "393"
+ },
+ {
+ "level": 341,
+ "id": "394",
+ "label": "394"
+ },
+ {
+ "level": 342,
+ "id": "395",
+ "label": "395"
+ },
+ {
+ "level": 343,
+ "id": "396",
+ "label": "396"
+ },
+ {
+ "level": 344,
+ "id": "397",
+ "label": "397"
+ },
+ {
+ "level": 345,
+ "id": "398",
+ "label": "398"
+ },
+ {
+ "level": 346,
+ "id": "399",
+ "label": "399"
+ }
+ ],
+ "edges": [
+ {
+ "to": "0",
+ "from": "1"
+ },
+ {
+ "to": "1",
+ "from": "2"
+ },
+ {
+ "to": "2",
+ "from": "3"
+ },
+ {
+ "to": "3",
+ "from": "4"
+ },
+ {
+ "to": "4",
+ "from": "5"
+ },
+ {
+ "to": "5",
+ "from": "6"
+ },
+ {
+ "to": "6",
+ "from": "7"
+ },
+ {
+ "to": "7",
+ "from": "8"
+ },
+ {
+ "to": "8",
+ "from": "10"
+ },
+ {
+ "to": "9",
+ "from": "11"
+ },
+ {
+ "to": "10",
+ "from": "11"
+ },
+ {
+ "to": "11",
+ "from": "12"
+ },
+ {
+ "to": "12",
+ "from": "13"
+ },
+ {
+ "to": "13",
+ "from": "15"
+ },
+ {
+ "to": "13",
+ "from": "14"
+ },
+ {
+ "to": "14",
+ "from": "386"
+ },
+ {
+ "to": "14",
+ "from": "16"
+ },
+ {
+ "to": "15",
+ "from": "386"
+ },
+ {
+ "to": "15",
+ "from": "16"
+ },
+ {
+ "to": "16",
+ "from": "17"
+ },
+ {
+ "to": "17",
+ "from": "18"
+ },
+ {
+ "to": "18",
+ "from": "19"
+ },
+ {
+ "to": "19",
+ "from": "20"
+ },
+ {
+ "to": "20",
+ "from": "21"
+ },
+ {
+ "to": "21",
+ "from": "22"
+ },
+ {
+ "to": "22",
+ "from": "23"
+ },
+ {
+ "to": "23",
+ "from": "24"
+ },
+ {
+ "to": "24",
+ "from": "25"
+ },
+ {
+ "to": "25",
+ "from": "26"
+ },
+ {
+ "to": "26",
+ "from": "27"
+ },
+ {
+ "to": "27",
+ "from": "28"
+ },
+ {
+ "to": "28",
+ "from": "29"
+ },
+ {
+ "to": "29",
+ "from": "30"
+ },
+ {
+ "to": "30",
+ "from": "31"
+ },
+ {
+ "to": "31",
+ "from": "32"
+ },
+ {
+ "to": "32",
+ "from": "33"
+ },
+ {
+ "to": "33",
+ "from": "34"
+ },
+ {
+ "to": "33",
+ "from": "35"
+ },
+ {
+ "to": "33",
+ "from": "37"
+ },
+ {
+ "to": "34",
+ "from": "36"
+ },
+ {
+ "to": "34",
+ "from": "43"
+ },
+ {
+ "to": "35",
+ "from": "36"
+ },
+ {
+ "to": "35",
+ "from": "43"
+ },
+ {
+ "to": "36",
+ "from": "38"
+ },
+ {
+ "to": "37",
+ "from": "39"
+ },
+ {
+ "to": "37",
+ "from": "43"
+ },
+ {
+ "to": "38",
+ "from": "39"
+ },
+ {
+ "to": "39",
+ "from": "40"
+ },
+ {
+ "to": "40",
+ "from": "41"
+ },
+ {
+ "to": "41",
+ "from": "42"
+ },
+ {
+ "to": "42",
+ "from": "44"
+ },
+ {
+ "to": "43",
+ "from": "45"
+ },
+ {
+ "to": "44",
+ "from": "45"
+ },
+ {
+ "to": "45",
+ "from": "46"
+ },
+ {
+ "to": "46",
+ "from": "47"
+ },
+ {
+ "to": "47",
+ "from": "48"
+ },
+ {
+ "to": "48",
+ "from": "49"
+ },
+ {
+ "to": "49",
+ "from": "50"
+ },
+ {
+ "to": "50",
+ "from": "51"
+ },
+ {
+ "to": "51",
+ "from": "52"
+ },
+ {
+ "to": "52",
+ "from": "53"
+ },
+ {
+ "to": "53",
+ "from": "54"
+ },
+ {
+ "to": "54",
+ "from": "55"
+ },
+ {
+ "to": "55",
+ "from": "56"
+ },
+ {
+ "to": "56",
+ "from": "57"
+ },
+ {
+ "to": "57",
+ "from": "58"
+ },
+ {
+ "to": "58",
+ "from": "59"
+ },
+ {
+ "to": "59",
+ "from": "60"
+ },
+ {
+ "to": "59",
+ "from": "65"
+ },
+ {
+ "to": "60",
+ "from": "61"
+ },
+ {
+ "to": "61",
+ "from": "62"
+ },
+ {
+ "to": "62",
+ "from": "63"
+ },
+ {
+ "to": "63",
+ "from": "64"
+ },
+ {
+ "to": "64",
+ "from": "66"
+ },
+ {
+ "to": "65",
+ "from": "67"
+ },
+ {
+ "to": "65",
+ "from": "124"
+ },
+ {
+ "to": "65",
+ "from": "229"
+ },
+ {
+ "to": "65",
+ "from": "322"
+ },
+ {
+ "to": "65",
+ "from": "363"
+ },
+ {
+ "to": "66",
+ "from": "67"
+ },
+ {
+ "to": "67",
+ "from": "68"
+ },
+ {
+ "to": "68",
+ "from": "69"
+ },
+ {
+ "to": "69",
+ "from": "70"
+ },
+ {
+ "to": "70",
+ "from": "71"
+ },
+ {
+ "to": "71",
+ "from": "72"
+ },
+ {
+ "to": "72",
+ "from": "73"
+ },
+ {
+ "to": "73",
+ "from": "74"
+ },
+ {
+ "to": "74",
+ "from": "75"
+ },
+ {
+ "to": "75",
+ "from": "76"
+ },
+ {
+ "to": "76",
+ "from": "77"
+ },
+ {
+ "to": "77",
+ "from": "78"
+ },
+ {
+ "to": "78",
+ "from": "79"
+ },
+ {
+ "to": "79",
+ "from": "80"
+ },
+ {
+ "to": "80",
+ "from": "81"
+ },
+ {
+ "to": "81",
+ "from": "82"
+ },
+ {
+ "to": "82",
+ "from": "83"
+ },
+ {
+ "to": "83",
+ "from": "84"
+ },
+ {
+ "to": "84",
+ "from": "85"
+ },
+ {
+ "to": "85",
+ "from": "91"
+ },
+ {
+ "to": "85",
+ "from": "86"
+ },
+ {
+ "to": "86",
+ "from": "87"
+ },
+ {
+ "to": "87",
+ "from": "88"
+ },
+ {
+ "to": "88",
+ "from": "89"
+ },
+ {
+ "to": "89",
+ "from": "90"
+ },
+ {
+ "to": "90",
+ "from": "92"
+ },
+ {
+ "to": "91",
+ "from": "195"
+ },
+ {
+ "to": "91",
+ "from": "93"
+ },
+ {
+ "to": "91",
+ "from": "397"
+ },
+ {
+ "to": "91",
+ "from": "233"
+ },
+ {
+ "to": "91",
+ "from": "125"
+ },
+ {
+ "to": "92",
+ "from": "93"
+ },
+ {
+ "to": "93",
+ "from": "94"
+ },
+ {
+ "to": "94",
+ "from": "95"
+ },
+ {
+ "to": "95",
+ "from": "96"
+ },
+ {
+ "to": "96",
+ "from": "97"
+ },
+ {
+ "to": "97",
+ "from": "98"
+ },
+ {
+ "to": "98",
+ "from": "99"
+ },
+ {
+ "to": "99",
+ "from": "100"
+ },
+ {
+ "to": "100",
+ "from": "101"
+ },
+ {
+ "to": "101",
+ "from": "102"
+ },
+ {
+ "to": "102",
+ "from": "103"
+ },
+ {
+ "to": "103",
+ "from": "104"
+ },
+ {
+ "to": "104",
+ "from": "105"
+ },
+ {
+ "to": "105",
+ "from": "106"
+ },
+ {
+ "to": "106",
+ "from": "107"
+ },
+ {
+ "to": "107",
+ "from": "108"
+ },
+ {
+ "to": "108",
+ "from": "109"
+ },
+ {
+ "to": "109",
+ "from": "110"
+ },
+ {
+ "to": "110",
+ "from": "111"
+ },
+ {
+ "to": "111",
+ "from": "112"
+ },
+ {
+ "to": "112",
+ "from": "113"
+ },
+ {
+ "to": "113",
+ "from": "114"
+ },
+ {
+ "to": "114",
+ "from": "115"
+ },
+ {
+ "to": "115",
+ "from": "116"
+ },
+ {
+ "to": "116",
+ "from": "117"
+ },
+ {
+ "to": "117",
+ "from": "118"
+ },
+ {
+ "to": "118",
+ "from": "119"
+ },
+ {
+ "to": "119",
+ "from": "120"
+ },
+ {
+ "to": "120",
+ "from": "121"
+ },
+ {
+ "to": "121",
+ "from": "122"
+ },
+ {
+ "to": "122",
+ "from": "123"
+ },
+ {
+ "to": "123",
+ "from": "124"
+ },
+ {
+ "to": "124",
+ "from": "125"
+ },
+ {
+ "to": "125",
+ "from": "126"
+ },
+ {
+ "to": "126",
+ "from": "127"
+ },
+ {
+ "to": "127",
+ "from": "128"
+ },
+ {
+ "to": "128",
+ "from": "129"
+ },
+ {
+ "to": "129",
+ "from": "130"
+ },
+ {
+ "to": "130",
+ "from": "131"
+ },
+ {
+ "to": "131",
+ "from": "132"
+ },
+ {
+ "to": "132",
+ "from": "134"
+ },
+ {
+ "to": "132",
+ "from": "133"
+ },
+ {
+ "to": "133",
+ "from": "135"
+ },
+ {
+ "to": "134",
+ "from": "135"
+ },
+ {
+ "to": "135",
+ "from": "136"
+ },
+ {
+ "to": "136",
+ "from": "137"
+ },
+ {
+ "to": "137",
+ "from": "138"
+ },
+ {
+ "to": "138",
+ "from": "139"
+ },
+ {
+ "to": "138",
+ "from": "140"
+ },
+ {
+ "to": "139",
+ "from": "141"
+ },
+ {
+ "to": "140",
+ "from": "141"
+ },
+ {
+ "to": "141",
+ "from": "142"
+ },
+ {
+ "to": "142",
+ "from": "143"
+ },
+ {
+ "to": "143",
+ "from": "144"
+ },
+ {
+ "to": "144",
+ "from": "145"
+ },
+ {
+ "to": "145",
+ "from": "146"
+ },
+ {
+ "to": "146",
+ "from": "147"
+ },
+ {
+ "to": "147",
+ "from": "148"
+ },
+ {
+ "to": "148",
+ "from": "149"
+ },
+ {
+ "to": "149",
+ "from": "150"
+ },
+ {
+ "to": "150",
+ "from": "151"
+ },
+ {
+ "to": "151",
+ "from": "152"
+ },
+ {
+ "to": "152",
+ "from": "153"
+ },
+ {
+ "to": "153",
+ "from": "154"
+ },
+ {
+ "to": "154",
+ "from": "155"
+ },
+ {
+ "to": "155",
+ "from": "157"
+ },
+ {
+ "to": "155",
+ "from": "156"
+ },
+ {
+ "to": "156",
+ "from": "158"
+ },
+ {
+ "to": "157",
+ "from": "158"
+ },
+ {
+ "to": "158",
+ "from": "159"
+ },
+ {
+ "to": "159",
+ "from": "162"
+ },
+ {
+ "to": "159",
+ "from": "160"
+ },
+ {
+ "to": "160",
+ "from": "164"
+ },
+ {
+ "to": "160",
+ "from": "161"
+ },
+ {
+ "to": "161",
+ "from": "163"
+ },
+ {
+ "to": "162",
+ "from": "164"
+ },
+ {
+ "to": "163",
+ "from": "165"
+ },
+ {
+ "to": "164",
+ "from": "166"
+ },
+ {
+ "to": "165",
+ "from": "166"
+ },
+ {
+ "to": "166",
+ "from": "167"
+ },
+ {
+ "to": "167",
+ "from": "168"
+ },
+ {
+ "to": "168",
+ "from": "170"
+ },
+ {
+ "to": "168",
+ "from": "169"
+ },
+ {
+ "to": "169",
+ "from": "171"
+ },
+ {
+ "to": "170",
+ "from": "171"
+ },
+ {
+ "to": "171",
+ "from": "172"
+ },
+ {
+ "to": "172",
+ "from": "173"
+ },
+ {
+ "to": "173",
+ "from": "174"
+ },
+ {
+ "to": "174",
+ "from": "175"
+ },
+ {
+ "to": "175",
+ "from": "176"
+ },
+ {
+ "to": "176",
+ "from": "177"
+ },
+ {
+ "to": "177",
+ "from": "178"
+ },
+ {
+ "to": "178",
+ "from": "180"
+ },
+ {
+ "to": "178",
+ "from": "179"
+ },
+ {
+ "to": "179",
+ "from": "181"
+ },
+ {
+ "to": "180",
+ "from": "181"
+ },
+ {
+ "to": "181",
+ "from": "183"
+ },
+ {
+ "to": "181",
+ "from": "182"
+ },
+ {
+ "to": "182",
+ "from": "184"
+ },
+ {
+ "to": "183",
+ "from": "184"
+ },
+ {
+ "to": "184",
+ "from": "186"
+ },
+ {
+ "to": "184",
+ "from": "185"
+ },
+ {
+ "to": "185",
+ "from": "187"
+ },
+ {
+ "to": "186",
+ "from": "189"
+ },
+ {
+ "to": "186",
+ "from": "188"
+ },
+ {
+ "to": "187",
+ "from": "188"
+ },
+ {
+ "to": "187",
+ "from": "189"
+ },
+ {
+ "to": "188",
+ "from": "190"
+ },
+ {
+ "to": "189",
+ "from": "191"
+ },
+ {
+ "to": "190",
+ "from": "191"
+ },
+ {
+ "to": "191",
+ "from": "192"
+ },
+ {
+ "to": "192",
+ "from": "193"
+ },
+ {
+ "to": "193",
+ "from": "194"
+ },
+ {
+ "to": "194",
+ "from": "195"
+ },
+ {
+ "to": "195",
+ "from": "197"
+ },
+ {
+ "to": "195",
+ "from": "196"
+ },
+ {
+ "to": "196",
+ "from": "198"
+ },
+ {
+ "to": "197",
+ "from": "198"
+ },
+ {
+ "to": "198",
+ "from": "199"
+ },
+ {
+ "to": "199",
+ "from": "200"
+ },
+ {
+ "to": "200",
+ "from": "201"
+ },
+ {
+ "to": "201",
+ "from": "202"
+ },
+ {
+ "to": "202",
+ "from": "203"
+ },
+ {
+ "to": "203",
+ "from": "204"
+ },
+ {
+ "to": "204",
+ "from": "205"
+ },
+ {
+ "to": "205",
+ "from": "206"
+ },
+ {
+ "to": "206",
+ "from": "207"
+ },
+ {
+ "to": "207",
+ "from": "208"
+ },
+ {
+ "to": "208",
+ "from": "209"
+ },
+ {
+ "to": "209",
+ "from": "210"
+ },
+ {
+ "to": "210",
+ "from": "211"
+ },
+ {
+ "to": "211",
+ "from": "212"
+ },
+ {
+ "to": "212",
+ "from": "213"
+ },
+ {
+ "to": "213",
+ "from": "214"
+ },
+ {
+ "to": "214",
+ "from": "215"
+ },
+ {
+ "to": "215",
+ "from": "216"
+ },
+ {
+ "to": "216",
+ "from": "217"
+ },
+ {
+ "to": "217",
+ "from": "218"
+ },
+ {
+ "to": "218",
+ "from": "219"
+ },
+ {
+ "to": "219",
+ "from": "220"
+ },
+ {
+ "to": "220",
+ "from": "221"
+ },
+ {
+ "to": "221",
+ "from": "222"
+ },
+ {
+ "to": "222",
+ "from": "223"
+ },
+ {
+ "to": "223",
+ "from": "224"
+ },
+ {
+ "to": "224",
+ "from": "225"
+ },
+ {
+ "to": "225",
+ "from": "226"
+ },
+ {
+ "to": "226",
+ "from": "227"
+ },
+ {
+ "to": "227",
+ "from": "228"
+ },
+ {
+ "to": "228",
+ "from": "229"
+ },
+ {
+ "to": "229",
+ "from": "230"
+ },
+ {
+ "to": "229",
+ "from": "242"
+ },
+ {
+ "to": "230",
+ "from": "231"
+ },
+ {
+ "to": "231",
+ "from": "232"
+ },
+ {
+ "to": "232",
+ "from": "233"
+ },
+ {
+ "to": "233",
+ "from": "234"
+ },
+ {
+ "to": "234",
+ "from": "235"
+ },
+ {
+ "to": "235",
+ "from": "236"
+ },
+ {
+ "to": "236",
+ "from": "237"
+ },
+ {
+ "to": "237",
+ "from": "238"
+ },
+ {
+ "to": "238",
+ "from": "239"
+ },
+ {
+ "to": "239",
+ "from": "240"
+ },
+ {
+ "to": "240",
+ "from": "241"
+ },
+ {
+ "to": "242",
+ "from": "243"
+ },
+ {
+ "to": "243",
+ "from": "244"
+ },
+ {
+ "to": "244",
+ "from": "246"
+ },
+ {
+ "to": "244",
+ "from": "245"
+ },
+ {
+ "to": "245",
+ "from": "247"
+ },
+ {
+ "to": "246",
+ "from": "247"
+ },
+ {
+ "to": "247",
+ "from": "248"
+ },
+ {
+ "to": "248",
+ "from": "249"
+ },
+ {
+ "to": "249",
+ "from": "250"
+ },
+ {
+ "to": "250",
+ "from": "251"
+ },
+ {
+ "to": "251",
+ "from": "252"
+ },
+ {
+ "to": "252",
+ "from": "253"
+ },
+ {
+ "to": "253",
+ "from": "254"
+ },
+ {
+ "to": "253",
+ "from": "255"
+ },
+ {
+ "to": "254",
+ "from": "256"
+ },
+ {
+ "to": "255",
+ "from": "256"
+ },
+ {
+ "to": "256",
+ "from": "257"
+ },
+ {
+ "to": "257",
+ "from": "258"
+ },
+ {
+ "to": "258",
+ "from": "259"
+ },
+ {
+ "to": "259",
+ "from": "260"
+ },
+ {
+ "to": "260",
+ "from": "261"
+ },
+ {
+ "to": "261",
+ "from": "262"
+ },
+ {
+ "to": "262",
+ "from": "263"
+ },
+ {
+ "to": "263",
+ "from": "264"
+ },
+ {
+ "to": "264",
+ "from": "265"
+ },
+ {
+ "to": "265",
+ "from": "268"
+ },
+ {
+ "to": "265",
+ "from": "266"
+ },
+ {
+ "to": "266",
+ "from": "267"
+ },
+ {
+ "to": "267",
+ "from": "269"
+ },
+ {
+ "to": "268",
+ "from": "269"
+ },
+ {
+ "to": "269",
+ "from": "270"
+ },
+ {
+ "to": "270",
+ "from": "271"
+ },
+ {
+ "to": "271",
+ "from": "272"
+ },
+ {
+ "to": "272",
+ "from": "273"
+ },
+ {
+ "to": "273",
+ "from": "274"
+ },
+ {
+ "to": "274",
+ "from": "275"
+ },
+ {
+ "to": "275",
+ "from": "276"
+ },
+ {
+ "to": "276",
+ "from": "277"
+ },
+ {
+ "to": "277",
+ "from": "278"
+ },
+ {
+ "to": "278",
+ "from": "280"
+ },
+ {
+ "to": "278",
+ "from": "279"
+ },
+ {
+ "to": "279",
+ "from": "282"
+ },
+ {
+ "to": "280",
+ "from": "281"
+ },
+ {
+ "to": "280",
+ "from": "282"
+ },
+ {
+ "to": "281",
+ "from": "284"
+ },
+ {
+ "to": "281",
+ "from": "283"
+ },
+ {
+ "to": "282",
+ "from": "284"
+ },
+ {
+ "to": "282",
+ "from": "283"
+ },
+ {
+ "to": "283",
+ "from": "286"
+ },
+ {
+ "to": "283",
+ "from": "285"
+ },
+ {
+ "to": "284",
+ "from": "286"
+ },
+ {
+ "to": "284",
+ "from": "285"
+ },
+ {
+ "to": "285",
+ "from": "287"
+ },
+ {
+ "to": "286",
+ "from": "287"
+ },
+ {
+ "to": "287",
+ "from": "288"
+ },
+ {
+ "to": "288",
+ "from": "289"
+ },
+ {
+ "to": "289",
+ "from": "290"
+ },
+ {
+ "to": "290",
+ "from": "291"
+ },
+ {
+ "to": "291",
+ "from": "292"
+ },
+ {
+ "to": "292",
+ "from": "293"
+ },
+ {
+ "to": "293",
+ "from": "294"
+ },
+ {
+ "to": "294",
+ "from": "295"
+ },
+ {
+ "to": "295",
+ "from": "296"
+ },
+ {
+ "to": "296",
+ "from": "297"
+ },
+ {
+ "to": "297",
+ "from": "298"
+ },
+ {
+ "to": "298",
+ "from": "299"
+ },
+ {
+ "to": "299",
+ "from": "300"
+ },
+ {
+ "to": "300",
+ "from": "301"
+ },
+ {
+ "to": "301",
+ "from": "302"
+ },
+ {
+ "to": "302",
+ "from": "303"
+ },
+ {
+ "to": "303",
+ "from": "304"
+ },
+ {
+ "to": "304",
+ "from": "305"
+ },
+ {
+ "to": "305",
+ "from": "306"
+ },
+ {
+ "to": "306",
+ "from": "307"
+ },
+ {
+ "to": "307",
+ "from": "308"
+ },
+ {
+ "to": "308",
+ "from": "309"
+ },
+ {
+ "to": "309",
+ "from": "310"
+ },
+ {
+ "to": "310",
+ "from": "311"
+ },
+ {
+ "to": "311",
+ "from": "312"
+ },
+ {
+ "to": "312",
+ "from": "313"
+ },
+ {
+ "to": "313",
+ "from": "314"
+ },
+ {
+ "to": "314",
+ "from": "315"
+ },
+ {
+ "to": "315",
+ "from": "316"
+ },
+ {
+ "to": "316",
+ "from": "317"
+ },
+ {
+ "to": "316",
+ "from": "318"
+ },
+ {
+ "to": "317",
+ "from": "332"
+ },
+ {
+ "to": "317",
+ "from": "319"
+ },
+ {
+ "to": "318",
+ "from": "319"
+ },
+ {
+ "to": "319",
+ "from": "320"
+ },
+ {
+ "to": "320",
+ "from": "321"
+ },
+ {
+ "to": "321",
+ "from": "322"
+ },
+ {
+ "to": "322",
+ "from": "323"
+ },
+ {
+ "to": "323",
+ "from": "324"
+ },
+ {
+ "to": "324",
+ "from": "325"
+ },
+ {
+ "to": "325",
+ "from": "326"
+ },
+ {
+ "to": "326",
+ "from": "327"
+ },
+ {
+ "to": "327",
+ "from": "328"
+ },
+ {
+ "to": "328",
+ "from": "329"
+ },
+ {
+ "to": "329",
+ "from": "330"
+ },
+ {
+ "to": "330",
+ "from": "331"
+ },
+ {
+ "to": "332",
+ "from": "333"
+ },
+ {
+ "to": "333",
+ "from": "334"
+ },
+ {
+ "to": "334",
+ "from": "335"
+ },
+ {
+ "to": "335",
+ "from": "336"
+ },
+ {
+ "to": "336",
+ "from": "337"
+ },
+ {
+ "to": "337",
+ "from": "338"
+ },
+ {
+ "to": "338",
+ "from": "339"
+ },
+ {
+ "to": "339",
+ "from": "340"
+ },
+ {
+ "to": "340",
+ "from": "341"
+ },
+ {
+ "to": "341",
+ "from": "342"
+ },
+ {
+ "to": "342",
+ "from": "343"
+ },
+ {
+ "to": "343",
+ "from": "344"
+ },
+ {
+ "to": "344",
+ "from": "345"
+ },
+ {
+ "to": "345",
+ "from": "346"
+ },
+ {
+ "to": "346",
+ "from": "347"
+ },
+ {
+ "to": "347",
+ "from": "348"
+ },
+ {
+ "to": "348",
+ "from": "349"
+ },
+ {
+ "to": "349",
+ "from": "350"
+ },
+ {
+ "to": "350",
+ "from": "351"
+ },
+ {
+ "to": "351",
+ "from": "352"
+ },
+ {
+ "to": "352",
+ "from": "353"
+ },
+ {
+ "to": "353",
+ "from": "354"
+ },
+ {
+ "to": "354",
+ "from": "355"
+ },
+ {
+ "to": "355",
+ "from": "356"
+ },
+ {
+ "to": "356",
+ "from": "357"
+ },
+ {
+ "to": "357",
+ "from": "358"
+ },
+ {
+ "to": "358",
+ "from": "359"
+ },
+ {
+ "to": "359",
+ "from": "360"
+ },
+ {
+ "to": "360",
+ "from": "361"
+ },
+ {
+ "to": "361",
+ "from": "362"
+ },
+ {
+ "to": "362",
+ "from": "363"
+ },
+ {
+ "to": "363",
+ "from": "364"
+ },
+ {
+ "to": "364",
+ "from": "365"
+ },
+ {
+ "to": "365",
+ "from": "366"
+ },
+ {
+ "to": "366",
+ "from": "367"
+ },
+ {
+ "to": "367",
+ "from": "368"
+ },
+ {
+ "to": "368",
+ "from": "369"
+ },
+ {
+ "to": "369",
+ "from": "370"
+ },
+ {
+ "to": "370",
+ "from": "371"
+ },
+ {
+ "to": "371",
+ "from": "372"
+ },
+ {
+ "to": "372",
+ "from": "373"
+ },
+ {
+ "to": "373",
+ "from": "374"
+ },
+ {
+ "to": "374",
+ "from": "375"
+ },
+ {
+ "to": "375",
+ "from": "376"
+ },
+ {
+ "to": "376",
+ "from": "377"
+ },
+ {
+ "to": "377",
+ "from": "378"
+ },
+ {
+ "to": "378",
+ "from": "379"
+ },
+ {
+ "to": "379",
+ "from": "380"
+ },
+ {
+ "to": "380",
+ "from": "381"
+ },
+ {
+ "to": "381",
+ "from": "382"
+ },
+ {
+ "to": "382",
+ "from": "383"
+ },
+ {
+ "to": "383",
+ "from": "384"
+ },
+ {
+ "to": "384",
+ "from": "385"
+ },
+ {
+ "to": "385",
+ "from": "387"
+ },
+ {
+ "to": "386",
+ "from": "388"
+ },
+ {
+ "to": "387",
+ "from": "389"
+ },
+ {
+ "to": "388",
+ "from": "390"
+ },
+ {
+ "to": "389",
+ "from": "390"
+ },
+ {
+ "to": "390",
+ "from": "391"
+ },
+ {
+ "to": "391",
+ "from": "392"
+ },
+ {
+ "to": "392",
+ "from": "393"
+ },
+ {
+ "to": "393",
+ "from": "394"
+ },
+ {
+ "to": "394",
+ "from": "395"
+ },
+ {
+ "to": "395",
+ "from": "396"
+ },
+ {
+ "to": "396",
+ "from": "397"
+ },
+ {
+ "to": "397",
+ "from": "398"
+ },
+ {
+ "to": "398",
+ "from": "399"
+ }
+ ]
+} );
diff --git a/examples/network/layout/hierarchicalLayout.html b/examples/network/layout/hierarchicalLayout.html
new file mode 100644
index 0000000000..37d98f3f91
--- /dev/null
+++ b/examples/network/layout/hierarchicalLayout.html
@@ -0,0 +1,114 @@
+
+
+
+ Network | Hierarchical layout
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hierarchical Layout - Scale-Free-Network
+
+
+ This example shows the randomly generated scale-free-network set of nodes and connected edges from example 2.
+ In this example, hierarchical layout has been enabled and the vertical levels are determined automatically.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/layout/hierarchicalLayoutBigUserDefined.html b/examples/network/layout/hierarchicalLayoutBigUserDefined.html
new file mode 100644
index 0000000000..0f529f55ad
--- /dev/null
+++ b/examples/network/layout/hierarchicalLayoutBigUserDefined.html
@@ -0,0 +1,46 @@
+
+
+
+ Network | Hierarchical layout
+
+
+
+
+
+
+
+
+
+
+Hierarchical Layout
+
+
+
+
+
+
+
diff --git a/examples/network/layout/hierarchicalLayoutMethods.html b/examples/network/layout/hierarchicalLayoutMethods.html
new file mode 100644
index 0000000000..8776b57acf
--- /dev/null
+++ b/examples/network/layout/hierarchicalLayoutMethods.html
@@ -0,0 +1,108 @@
+
+
+
+ Network | Hierarchical layout difference
+
+
+
+
+
+
+
+
+
+
+
+Hierarchical layout difference
+
+ This example shows a the effect of the different hierarchical layout methods. Hubsize is based on the amount of edges connected to a node.
+ The node with the most connections (the largest hub) is drawn at the top of the tree. The direction method is based on the direction of the edges.
+ Try switching between the methods with the dropdown box below.
+
+Layout method:
+
+ hubsize
+ directed
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/layout/hierarchicalLayoutUserdefined.html b/examples/network/layout/hierarchicalLayoutUserdefined.html
new file mode 100644
index 0000000000..9bc1de347f
--- /dev/null
+++ b/examples/network/layout/hierarchicalLayoutUserdefined.html
@@ -0,0 +1,152 @@
+
+
+
+ Network | Hierarchical Layout, userDefined
+
+
+
+
+
+
+
+
+
+
+
+Hierarchical Layout - User-defined
+
+
+ This example shows a user-defined hierarchical layout. If the user defines levels for nodes but does not do so for
+ all nodes, an alert will show up and hierarchical layout will be disabled. Either all or none can be defined.
+ If the smooth curves appear to be inverted, the direction of the edge is not in the same direction as the network.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/layout/hierarchicalLayoutWithoutPhysics.html b/examples/network/layout/hierarchicalLayoutWithoutPhysics.html
new file mode 100644
index 0000000000..412f3a2b72
--- /dev/null
+++ b/examples/network/layout/hierarchicalLayoutWithoutPhysics.html
@@ -0,0 +1,89 @@
+
+
+
+ Hierarchical Layout without Physics
+
+
+
+
+
+
+Hierarchical Layout without Physics
+The hierarchical layout can now be controlled without the use of physics. This is much quicker. The options for this are:
+
+
+
+ levelSeparation
+ Distance between levels.
+
+
+ nodeSpacing
+ Minimum distance between nodes on the free axis.
+
+
+ treeSpacing
+ Distance between different trees (independent networks).
+
+
+ blockShifting
+ Method for reducing whitespace. Can be used alone or together with edge minimization. Each node will check for whitespace and will shift
+ it's branch along with it for as far as it can, respecting the nodeSpacing on any level.
+
+
+ edgeMinimization
+ Method for reducing whitespace. Can be used alone or together with block shifting. Enabling block shifting will usually speed up the layout process.
+ Each node will try to move along its free axis to reduce the total length of it's edges.
+
+
+ parentCentralization
+ When true, the parents nodes will be centered again after the the layout algorithm has been finished.
+
+
+
+Play with the settings below the network and see how the layout changes!
+
+
+
+
\ No newline at end of file
diff --git a/examples/network/layout/randomSeed.html b/examples/network/layout/randomSeed.html
new file mode 100644
index 0000000000..7a01a23aca
--- /dev/null
+++ b/examples/network/layout/randomSeed.html
@@ -0,0 +1,60 @@
+
+
+
+ Network | Setting the random seed
+
+
+
+
+
+
+
+
+
+ Create a simple network with some nodes and edges but with a fixed seed. This means the layout will be the same every time the nodes
+ are settled.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/HTMLInNodes.html b/examples/network/nodeStyles/HTMLInNodes.html
new file mode 100644
index 0000000000..27b3af6c40
--- /dev/null
+++ b/examples/network/nodeStyles/HTMLInNodes.html
@@ -0,0 +1,83 @@
+
+
+
+ Network | HTML in nodex
+
+
+
+
+
+
+
+
+
+
+
+
+ This example demonstrates showing custom HTML in Nodes, by using an SVG image.
+
+
+ WARNING: this is currently not supported by all browsers.
+
+
+
+
diff --git a/examples/network/nodeStyles/circularImages.html b/examples/network/nodeStyles/circularImages.html
new file mode 100644
index 0000000000..6f3c5d43bd
--- /dev/null
+++ b/examples/network/nodeStyles/circularImages.html
@@ -0,0 +1,102 @@
+
+
+
+ Network | Circular images
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/colors.html b/examples/network/nodeStyles/colors.html
new file mode 100644
index 0000000000..7cf1091355
--- /dev/null
+++ b/examples/network/nodeStyles/colors.html
@@ -0,0 +1,67 @@
+
+
+
+ Network | Basic usage
+
+
+
+
+
+
+
+
+
+ Nodes can be all kinds of colors. This example shows all possible ways of defining colors. If you supply an object, the undefined fields will assume the default colors.
+ When supplying a hex or rgb format color, it will be parsed and variations will be created for highlight and hover. Edges with inheritColor take the border colors.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/customGroups.html b/examples/network/nodeStyles/customGroups.html
new file mode 100644
index 0000000000..cebdcfb794
--- /dev/null
+++ b/examples/network/nodeStyles/customGroups.html
@@ -0,0 +1,132 @@
+
+
+
+ Network | Custom Groups
+
+
+
+
+
+
+
+
+
+
+
+ We use an icon once in the DOM so the CSS for fontAwesome is loaded.
+
+
+
+
diff --git a/examples/network/nodeStyles/groups.html b/examples/network/nodeStyles/groups.html
new file mode 100644
index 0000000000..47fa5ccc28
--- /dev/null
+++ b/examples/network/nodeStyles/groups.html
@@ -0,0 +1,119 @@
+
+
+
+ Network | Groups
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/icons.html b/examples/network/nodeStyles/icons.html
new file mode 100644
index 0000000000..3d8864dfe0
--- /dev/null
+++ b/examples/network/nodeStyles/icons.html
@@ -0,0 +1,196 @@
+
+
+
+
+
+ Network | node as icon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Icons can be used for nodes as well. This example shows Icons from fontAwesome and Ionicons but it should work with similar packages as well.
+ It uses unicode and css to define the icons. Remember! Unicode in javascript is done like this: \uf274 for the unicode f274.
+ If a node is shown as a rectangle, it means the css is not loaded (or not yet loaded). A redraw will fix that.
+
+
+
+
+ Use FontAwesome-icons for nodes
+
+
+ Use Ionicons-icons for nodes
+
+
+
+
+
diff --git a/examples/network/nodeStyles/images.html b/examples/network/nodeStyles/images.html
new file mode 100644
index 0000000000..7f3ce70e18
--- /dev/null
+++ b/examples/network/nodeStyles/images.html
@@ -0,0 +1,82 @@
+
+
+
+ Network | Images
+
+
+
+
+
+
+
+
+
+
+
+
+ Display nodes as images.
+
+
+
+
+
diff --git a/examples/network/nodeStyles/imagesWithBorders.html b/examples/network/nodeStyles/imagesWithBorders.html
new file mode 100644
index 0000000000..f2a558350f
--- /dev/null
+++ b/examples/network/nodeStyles/imagesWithBorders.html
@@ -0,0 +1,105 @@
+
+
+
+ Network | Images With Borders
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/shadows.html b/examples/network/nodeStyles/shadows.html
new file mode 100644
index 0000000000..70bee96f6a
--- /dev/null
+++ b/examples/network/nodeStyles/shadows.html
@@ -0,0 +1,119 @@
+
+
+
+ Network | Groups
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/shapes.html b/examples/network/nodeStyles/shapes.html
new file mode 100644
index 0000000000..20699b8198
--- /dev/null
+++ b/examples/network/nodeStyles/shapes.html
@@ -0,0 +1,78 @@
+
+
+
+ Network | Shapes
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nodes can have all sorts of shapes. Note the exception where the nodes with text inside and the text type's size are determined by the font size, not the node size.
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/shapesWithDashedBorders.html b/examples/network/nodeStyles/shapesWithDashedBorders.html
new file mode 100644
index 0000000000..57e28cff97
--- /dev/null
+++ b/examples/network/nodeStyles/shapesWithDashedBorders.html
@@ -0,0 +1,62 @@
+
+
+
+ Network | Shapes
+
+
+
+
+
+
+
+
+
+
+
+
+ Nodes can have all sorts of shapes. Note the exception where the nodes with text inside and the text type's size are determined by the font size, not the node size.
+
+
+
+
+
+
diff --git a/examples/network/nodeStyles/widthHeight.html b/examples/network/nodeStyles/widthHeight.html
new file mode 100644
index 0000000000..2a3e8eaf6b
--- /dev/null
+++ b/examples/network/nodeStyles/widthHeight.html
@@ -0,0 +1,121 @@
+
+
+
+ Network | Label Width and Height Settings
+
+
+
+
+
+
+
+
+
+
+Nodes may be set to have fixed, minimum and maximum widths and minimum heights.
+Nodes with minimum heights may also have a vertical alignment set.
+
+Edges may be set to have maximum widths.
+
+
+
+The widthConstraint: value
option means a fixed width, the minimum and maximum width of the element are set to the value (respecting left and right margins). Lines exceeding the maximum width will be broken at space boundaries to fit.
+The widthConstraint: { minimum: value }
option sets the minimum width of the element to the value.
+The widthConstraint: { maximum: value }
option sets the maximum width of the element to the value (respecting left and right margins). Lines exceeding the maximum width will be broken at space boundaries to fit.
+Minimum width line sizing is applied after maximum width line breaking, so counterintuitively, the minimum being greater than the maximum has a meaningful interpretation.
+
+
+
+The heightConstraint: value
option sets the minimum height of the element to the value (respecting top and bottom margins).
+The heightConstraint: { minimum: value }
option also sets the minimum height of the element to the value (respecting top and bottom margins).
+The heightConstraint: { valign: value }
option (with value 'top'
, 'middle'
, or 'bottom'
, sets the alignment of the text in the element's label to the elements top, middle or bottom (respecting top and bottom margins) when it's height is less than the minimum. The middle value is the default.
+
+
+
+Node width and height constraints may both be applied together, of course.
+The constraint options may be applied to elements individually, or at the whole-set level.
+Whole-set node and edge constraints are exclusive.
+
+
+
+
+
diff --git a/examples/network/other/animationShowcase.html b/examples/network/other/animationShowcase.html
new file mode 100644
index 0000000000..22ef47c5ff
--- /dev/null
+++ b/examples/network/other/animationShowcase.html
@@ -0,0 +1,279 @@
+
+
+
+ Network | Animation
+
+
+
+
+
+
+
+
+
+
+
+
+Camera animations
+
+ You can move the view around programmatically using the .moveTo(options) function. The options supplied to this function can
+ also be (partially) supplied to the .fit() and .focusOnNode() methods. These are explained in the docs.
+
+ The buttons below take the fields from the table when they can. For instance, the "Animate with default settings." takes the position, scale and offset while using
+ the default animation values for duration and easing function. The focusOnNode takes everything except the position and the fit takes only the duration and easing function.
+
+ Here you can see a full description of the options you can supply to moveTo:
+
+
+var moveToOptions = {
+ position: {x:x, y:x}, // position to animate to (Numbers)
+ scale: 1.0, // scale to animate to (Number)
+ offset: {x:x, y:y}, // offset from the center in DOM pixels (Numbers)
+ animation: { // animation object, can also be Boolean
+ duration: 1000, // animation duration in milliseconds (Number)
+ easingFunction: "easeInOutQuad" // Animation easing function, available are:
+ } // linear, easeInQuad, easeOutQuad, easeInOutQuad,
+} // easeInCubic, easeOutCubic, easeInOutCubic,
+ // easeInQuart, easeOutQuart, easeInOutQuart,
+ // easeInQuint, easeOutQuint, easeInOutQuint
+
+
+
+
+
diff --git a/examples/network/other/changingClusteredEdgesNodes.html b/examples/network/other/changingClusteredEdgesNodes.html
new file mode 100644
index 0000000000..671c41b51c
--- /dev/null
+++ b/examples/network/other/changingClusteredEdgesNodes.html
@@ -0,0 +1,107 @@
+
+
+
+ Network | Clustering
+
+
+
+
+
+
+
+
+
+
+
+
+Demonstrating getBaseEdges, getClusteredEdges updateEdge and updateClusteredNode.
Clicking on the cluster will change it to a star (updateClusteredNode).
+Clicking on an edge will make it red regardless of whether it is a clusteredEdge or not (updateEdge)
+Clicking on an edge will also show the results of getBaseEdges and getClusteredEdge
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/other/chosen.html b/examples/network/other/chosen.html
new file mode 100644
index 0000000000..7b3d528a92
--- /dev/null
+++ b/examples/network/other/chosen.html
@@ -0,0 +1,466 @@
+
+
+
+ Network | Chosen Elements
+
+
+
+
+
+
+
+
+
+
+When a node or edge is selected or hovered its visible characteristics can be changed.
+
+
+
+In this network, an element (node, edge or label) will change a characteristic when hovered, and it will be locked in when selected.
+ This is managed by setting up a 'chosen' function that will be called when the element containing the function is chosen.
+ These functions may be set on nodes, edges and labels, at the individual or group level.
+
+All states (unselected, hover-over-unselected, selected, and hover-over selected) may be handled as needed by the application using vis, as the select and hover states are passed to the chosen function when called.
+ Additionally, the id of the element is passed to allow context-specific characteristic adjustment on select or hover as needed.
+
+It should be noted that the characteristics which might affect the position of elements have been left out on purpose.
+ While it might be interesting to make them changeable, this is problematic on hovering.
+ Consider that the user hovers over an object.
+ If it changed characteristics that moved it outside of the hover-distance, it would then no longer be hovering.
+ So it would be moved back to its original prosition, within the hover-distance and then again be hovering over the object.
+ This hysteresis loop is kept from occurring by leaving out the characteristics that could cause it.
+ Some seemingly innocuous changes (such as resizing a node's label on hover that would in turn cause the node to resize and move out of hover-distance) may still cause hysteresis, but with care they should be avoidable.
+
+
+
+
+
+
diff --git a/examples/network/other/clustering.html b/examples/network/other/clustering.html
new file mode 100644
index 0000000000..80b6c74737
--- /dev/null
+++ b/examples/network/other/clustering.html
@@ -0,0 +1,141 @@
+
+
+
+ Network | Clustering
+
+
+
+
+
+
+
+
+
+
+
+
+Click any of the buttons below to cluster the network. On every push the network will be reinitialized first. You can click on a cluster to open it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/other/clusteringByZoom.html b/examples/network/other/clusteringByZoom.html
new file mode 100644
index 0000000000..d05a1f3b52
--- /dev/null
+++ b/examples/network/other/clusteringByZoom.html
@@ -0,0 +1,160 @@
+
+
+
+ Network | Clustering
+
+
+
+
+
+
+
+
+
+
+
+
+ You can zoom in and out to cluster/decluster.
+
+Stabilize when clustering:
+
+
+
+
+
+
diff --git a/examples/network/other/clustersOfclusters.html b/examples/network/other/clustersOfclusters.html
new file mode 100644
index 0000000000..b474121da8
--- /dev/null
+++ b/examples/network/other/clustersOfclusters.html
@@ -0,0 +1,75 @@
+
+
+
+
+ Cluster Test
+
+
+
+
+
+
+ Clusters can contain other clusters, but clusters of a single node is only possible by adding
+
allowSingleNodeCluster: true
+to clusterNodeProperties
+In this example repeatedly clicking on the node with open the Clusters.
+
+
+
+
+
+
diff --git a/examples/network/other/configuration.html b/examples/network/other/configuration.html
new file mode 100644
index 0000000000..365cbc6903
--- /dev/null
+++ b/examples/network/other/configuration.html
@@ -0,0 +1,83 @@
+
+
+
+ Network | Playing with Physics
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The configurator can be used to play with the options. In this example, all options that can be configured with this tool are shown.
+ You can also supply a custom filter function or filter string. You can press the generate options button below to have an options object printed. You can then use
+ this in the network.
+
+Note: The configurator is recreated in the dom tree on input change. This may cause undesired scrolls in your application. In order to avoid this, explicitly set the height of the configurator (see this example's source code).
+
+
+
+
+
+
+
diff --git a/examples/network/other/cursorChange.html b/examples/network/other/cursorChange.html
new file mode 100644
index 0000000000..b928c70d21
--- /dev/null
+++ b/examples/network/other/cursorChange.html
@@ -0,0 +1,140 @@
+
+
+
+ Network | Cursor Change
+
+
+
+
+
+
+
+
+Here is a simple network with nodes and edges that demonstrates how to change the cursor on hover for nodes and edges.
+Use the dropdowns and button below to change the cursor type bound to an event.
+
+Event Type -
+
+ hoverNode
+ blurNode
+ hoverEdge
+ blurEdge
+ dragStart
+ dragging
+ dragEnd
+
+
+Cursor Type -
+
+ auto
+ default
+ context-menu
+ help
+ pointer
+ progress
+ wait
+ cell
+ crosshair
+ text
+ vertical-text
+ alias
+ copy
+ move
+ no-drop
+ not-allowed
+ all-scroll
+ col-resize
+ row-resize
+ n-resize
+ e-resize
+ w-resize
+ s-resize
+ ne-resize
+ nw-resize
+ se-resize
+ sw-resize
+ ew-resize
+ ns-resize
+ nesw-resize
+ nwse-resize
+ zoom-in
+ zoom-out
+ grab
+ grabbing
+
+
+
+Change Cursor for Event
+
+
+
+
+
+
+
+
diff --git a/examples/network/other/manipulation.html b/examples/network/other/manipulation.html
new file mode 100644
index 0000000000..3b29d2f116
--- /dev/null
+++ b/examples/network/other/manipulation.html
@@ -0,0 +1,193 @@
+
+
+
+
+ Network | Manipulation
+
+
+
+
+
+
+
+
+
+
+
+Editing the nodes and edges (localized)
+
+ The localization is only relevant to the manipulation buttons.
+
+
+
+ Select a locale:
+
+ en
+ de
+ es
+ it
+ nl
+ pt
+ ru
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/other/manipulationEditEdgeNoDrag.html b/examples/network/other/manipulationEditEdgeNoDrag.html
new file mode 100644
index 0000000000..f256a54523
--- /dev/null
+++ b/examples/network/other/manipulationEditEdgeNoDrag.html
@@ -0,0 +1,255 @@
+
+
+
+
+ Network | Manipulation | Edit Edge Without Drag
+
+
+
+
+
+
+
+
+
+
+
+Editing the nodes and edges-without-drag (localized)
+
+ The localization is only relevant to the manipulation buttons.
+
+
+
+ Select a locale:
+
+ en
+ de
+ es
+ it
+ nl
+ pt
+ ru
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/other/navigation.html b/examples/network/other/navigation.html
new file mode 100644
index 0000000000..39daa89fb2
--- /dev/null
+++ b/examples/network/other/navigation.html
@@ -0,0 +1,135 @@
+
+
+
+ Network | Navigation
+
+
+
+
+
+
+
+
+
+
+
+
+Navigation controls and keyboard navigation
+
+ This example is the same as example 2, except for the navigation controls that have been activated. The navigation controls are described below.
+
+
+ Icons:
+
+
+
+
+
+
+
+
+
+ Keyboard shortcuts:
+ Up arrow
+ Down arrow
+ Left arrow
+ Right arrow
+ = [ Page up
+ - ] Page down
+ None
+
+
+ Description:
+ Move up
+ Move down
+ Move left
+ Move right
+ Zoom in
+ Zoom out
+ Zoom extent
+
+
+
+ Apart from clicking the icons, you can also navigate using the keyboard. The buttons are in table above.
+ Zoom Extends changes the zoom and position of the camera to encompass all visible nodes.
To correctly display the navigation icons, vis.css or vis-network.min.css must be included.
+ The user is free to alter or overload the CSS classes but without them the navigation icons are not visible.
+
+
+
+
+
+
+
diff --git a/examples/network/other/onLoadAnimation.html b/examples/network/other/onLoadAnimation.html
new file mode 100644
index 0000000000..a2d7e646a2
--- /dev/null
+++ b/examples/network/other/onLoadAnimation.html
@@ -0,0 +1,85 @@
+
+
+
+ Network | On Load Animation
+
+
+
+
+
+ Vis.js network onLoad animation
+ easeIn functions accelerate from zero velocity.
+ easeOut functions decelerate to zero velocity.
+ easeInOut functions accelerate from zero till halfway then after the halfway point they decrease until zero.
+
+ Onload Animation Easing Function -
+
+ linear
+ easeInQuad
+ easeOutQuad
+ easeInOutQuad
+ easeInCubic
+ easeOutCubic
+ easeInOutCubic
+ easeInQuart
+ easeOutQuart
+ easeInOutQuart
+ easeInQuint
+ easeOutQuint
+ easeInOutQuint
+
+ Demo Easing Function
+
+ For more information on easing functions check out easings.net
+
+
+
+
+
diff --git a/examples/network/other/performance.html b/examples/network/other/performance.html
new file mode 100644
index 0000000000..47c414448c
--- /dev/null
+++ b/examples/network/other/performance.html
@@ -0,0 +1,91 @@
+
+
+
+ Network | Random nodes
+
+
+
+
+
+
+
+
+
+
+
+
+ Generate a random network with nodes and edges.
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/other/saveAndLoad.html b/examples/network/other/saveAndLoad.html
new file mode 100644
index 0000000000..2ce3dec9de
--- /dev/null
+++ b/examples/network/other/saveAndLoad.html
@@ -0,0 +1,185 @@
+
+
+
+
+
+ Network | Saving and loading networks
+
+
+
+
+
+
+
+
+
+
+
+
+ In this example, the network data can be exported to JSON and imported back into the network.
+
+ Try this out by exporting the network to JSON, clearing the network and then importing it again. The nodes will all appear in the same position as they were before the network was destroyed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/network/physics/physicsConfiguration.html b/examples/network/physics/physicsConfiguration.html
new file mode 100644
index 0000000000..1d460cb60e
--- /dev/null
+++ b/examples/network/physics/physicsConfiguration.html
@@ -0,0 +1,80 @@
+
+
+
+ Network | Playing with Physics
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Playing with Physics
+
+ Every dataset is different. Nodes can have different sizes based on content, interconnectivity can be high or low etc. Because of this, the network configurator can be used
+ to explore which settings may be good for him or her. This is ment to be used during the development phase when you are implementing vis.js. Once you have found
+ settings you are happy with, you can supply them to network using the documented physics options.
+
+
+
+
+
+
+
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000000..06c724bca5
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ vis-network
+
+
+
+
+
\ No newline at end of file
diff --git a/index.js b/index.js
new file mode 100644
index 0000000000..3d9c56cf8a
--- /dev/null
+++ b/index.js
@@ -0,0 +1,26 @@
+// utils
+var util = require('vis-util');
+exports.util = util;
+exports.DOMutil = require('./lib/DOMutil');
+
+// data
+var { DataSet, DataView, Queue } = require('vis-data');
+exports.DataSet = DataSet;
+exports.DataView = DataView;
+exports.Queue = Queue;
+
+// Network.
+exports.Network = require('./lib/network/Network');
+exports.network = {
+ Images: require('./lib/network/Images'),
+ dotparser: require('./lib/network/dotparser'),
+ gephiParser: require('./lib/network/gephiParser'),
+ allOptions: require('./lib/network/options')
+};
+exports.network.convertDot = function (input) {return exports.network.dotparser.DOTToGraph(input)};
+exports.network.convertGephi = function (input,options) {return exports.network.gephiParser.parseGephi(input,options)};
+
+// bundled external libraries
+exports.moment = require('./lib/module/moment');
+exports.Hammer = require('./lib/module/hammer');
+exports.keycharm = require('keycharm');
\ No newline at end of file
diff --git a/jsdoc.json b/jsdoc.json
new file mode 100644
index 0000000000..df0756c69f
--- /dev/null
+++ b/jsdoc.json
@@ -0,0 +1,3 @@
+{
+ "plugins": ["plugins/markdown"]
+}
diff --git a/launch.json b/launch.json
new file mode 100644
index 0000000000..32f05991ac
--- /dev/null
+++ b/launch.json
@@ -0,0 +1,33 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Mocha All",
+ "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
+ "args": [
+ "--timeout",
+ "999999",
+ "--colors",
+ "${workspaceFolder}/test"
+ ],
+ "console": "integratedTerminal",
+ "internalConsoleOptions": "neverOpen"
+ },
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Mocha Current File",
+ "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
+ "args": [
+ "--timeout",
+ "999999",
+ "--colors",
+ "${file}"
+ ],
+ "console": "integratedTerminal",
+ "internalConsoleOptions": "neverOpen"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/lib/DOMutil.js b/lib/DOMutil.js
new file mode 100644
index 0000000000..52d5078063
--- /dev/null
+++ b/lib/DOMutil.js
@@ -0,0 +1,220 @@
+// DOM utility methods
+
+/**
+ * this prepares the JSON container for allocating SVG elements
+ * @param {Object} JSONcontainer
+ * @private
+ */
+exports.prepareElements = function(JSONcontainer) {
+ // cleanup the redundant svgElements;
+ for (var elementType in JSONcontainer) {
+ if (JSONcontainer.hasOwnProperty(elementType)) {
+ JSONcontainer[elementType].redundant = JSONcontainer[elementType].used;
+ JSONcontainer[elementType].used = [];
+ }
+ }
+};
+
+/**
+ * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from
+ * which to remove the redundant elements.
+ *
+ * @param {Object} JSONcontainer
+ * @private
+ */
+exports.cleanupElements = function(JSONcontainer) {
+ // cleanup the redundant svgElements;
+ for (var elementType in JSONcontainer) {
+ if (JSONcontainer.hasOwnProperty(elementType)) {
+ if (JSONcontainer[elementType].redundant) {
+ for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) {
+ JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]);
+ }
+ JSONcontainer[elementType].redundant = [];
+ }
+ }
+ }
+};
+
+/**
+ * Ensures that all elements are removed first up so they can be recreated cleanly
+ * @param {Object} JSONcontainer
+ */
+exports.resetElements = function(JSONcontainer) {
+ exports.prepareElements(JSONcontainer);
+ exports.cleanupElements(JSONcontainer);
+ exports.prepareElements(JSONcontainer);
+};
+
+/**
+ * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer
+ * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this.
+ *
+ * @param {string} elementType
+ * @param {Object} JSONcontainer
+ * @param {Object} svgContainer
+ * @returns {Element}
+ * @private
+ */
+exports.getSVGElement = function (elementType, JSONcontainer, svgContainer) {
+ var element;
+ // allocate SVG element, if it doesnt yet exist, create one.
+ if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before
+ // check if there is an redundant element
+ if (JSONcontainer[elementType].redundant.length > 0) {
+ element = JSONcontainer[elementType].redundant[0];
+ JSONcontainer[elementType].redundant.shift();
+ }
+ else {
+ // create a new element and add it to the SVG
+ element = document.createElementNS('http://www.w3.org/2000/svg', elementType);
+ svgContainer.appendChild(element);
+ }
+ }
+ else {
+ // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it.
+ element = document.createElementNS('http://www.w3.org/2000/svg', elementType);
+ JSONcontainer[elementType] = {used: [], redundant: []};
+ svgContainer.appendChild(element);
+ }
+ JSONcontainer[elementType].used.push(element);
+ return element;
+};
+
+
+/**
+ * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer
+ * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this.
+ *
+ * @param {string} elementType
+ * @param {Object} JSONcontainer
+ * @param {Element} DOMContainer
+ * @param {Element} insertBefore
+ * @returns {*}
+ */
+exports.getDOMElement = function (elementType, JSONcontainer, DOMContainer, insertBefore) {
+ var element;
+ // allocate DOM element, if it doesnt yet exist, create one.
+ if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before
+ // check if there is an redundant element
+ if (JSONcontainer[elementType].redundant.length > 0) {
+ element = JSONcontainer[elementType].redundant[0];
+ JSONcontainer[elementType].redundant.shift();
+ }
+ else {
+ // create a new element and add it to the SVG
+ element = document.createElement(elementType);
+ if (insertBefore !== undefined) {
+ DOMContainer.insertBefore(element, insertBefore);
+ }
+ else {
+ DOMContainer.appendChild(element);
+ }
+ }
+ }
+ else {
+ // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it.
+ element = document.createElement(elementType);
+ JSONcontainer[elementType] = {used: [], redundant: []};
+ if (insertBefore !== undefined) {
+ DOMContainer.insertBefore(element, insertBefore);
+ }
+ else {
+ DOMContainer.appendChild(element);
+ }
+ }
+ JSONcontainer[elementType].used.push(element);
+ return element;
+};
+
+
+
+
+/**
+ * Draw a point object. This is a separate function because it can also be called by the legend.
+ * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions
+ * as well.
+ *
+ * @param {number} x
+ * @param {number} y
+ * @param {Object} groupTemplate: A template containing the necessary information to draw the datapoint e.g., {style: 'circle', size: 5, className: 'className' }
+ * @param {Object} JSONcontainer
+ * @param {Object} svgContainer
+ * @param {Object} labelObj
+ * @returns {vis.PointItem}
+ */
+exports.drawPoint = function(x, y, groupTemplate, JSONcontainer, svgContainer, labelObj) {
+ var point;
+ if (groupTemplate.style == 'circle') {
+ point = exports.getSVGElement('circle', JSONcontainer, svgContainer);
+ point.setAttributeNS(null, "cx", x);
+ point.setAttributeNS(null, "cy", y);
+ point.setAttributeNS(null, "r", 0.5 * groupTemplate.size);
+ }
+ else {
+ point = exports.getSVGElement('rect', JSONcontainer, svgContainer);
+ point.setAttributeNS(null, "x", x - 0.5 * groupTemplate.size);
+ point.setAttributeNS(null, "y", y - 0.5 * groupTemplate.size);
+ point.setAttributeNS(null, "width", groupTemplate.size);
+ point.setAttributeNS(null, "height", groupTemplate.size);
+ }
+
+ if (groupTemplate.styles !== undefined) {
+ point.setAttributeNS(null, "style", groupTemplate.styles);
+ }
+ point.setAttributeNS(null, "class", groupTemplate.className + " vis-point");
+ //handle label
+
+
+ if (labelObj) {
+ var label = exports.getSVGElement('text', JSONcontainer, svgContainer);
+ if (labelObj.xOffset) {
+ x = x + labelObj.xOffset;
+ }
+
+ if (labelObj.yOffset) {
+ y = y + labelObj.yOffset;
+ }
+ if (labelObj.content) {
+ label.textContent = labelObj.content;
+ }
+
+ if (labelObj.className) {
+ label.setAttributeNS(null, "class", labelObj.className + " vis-label");
+ }
+ label.setAttributeNS(null, "x", x);
+ label.setAttributeNS(null, "y", y);
+ }
+
+ return point;
+};
+
+/**
+ * draw a bar SVG element centered on the X coordinate
+ *
+ * @param {number} x
+ * @param {number} y
+ * @param {number} width
+ * @param {number} height
+ * @param {string} className
+ * @param {Object} JSONcontainer
+ * @param {Object} svgContainer
+ * @param {string} style
+ */
+exports.drawBar = function (x, y, width, height, className, JSONcontainer, svgContainer, style) {
+ if (height != 0) {
+ if (height < 0) {
+ height *= -1;
+ y -= height;
+ }
+ var rect = exports.getSVGElement('rect',JSONcontainer, svgContainer);
+ rect.setAttributeNS(null, "x", x - 0.5 * width);
+ rect.setAttributeNS(null, "y", y);
+ rect.setAttributeNS(null, "width", width);
+ rect.setAttributeNS(null, "height", height);
+ rect.setAttributeNS(null, "class", className);
+ if (style) {
+ rect.setAttributeNS(null, "style", style);
+ }
+ }
+};
\ No newline at end of file
diff --git a/lib/hammerUtil.js b/lib/hammerUtil.js
new file mode 100644
index 0000000000..e9cb666551
--- /dev/null
+++ b/lib/hammerUtil.js
@@ -0,0 +1,67 @@
+/**
+ * Register a touch event, taking place before a gesture
+ * @param {Hammer} hammer A hammer instance
+ * @param {function} callback Callback, called as callback(event)
+ */
+exports.onTouch = function (hammer, callback) {
+ callback.inputHandler = function (event) {
+ if (event.isFirst) {
+ callback(event);
+ }
+ };
+
+ hammer.on('hammer.input', callback.inputHandler);
+};
+
+/**
+ * Register a release event, taking place after a gesture
+ * @param {Hammer} hammer A hammer instance
+ * @param {function} callback Callback, called as callback(event)
+ * @returns {*}
+ */
+exports.onRelease = function (hammer, callback) {
+ callback.inputHandler = function (event) {
+ if (event.isFinal) {
+ callback(event);
+ }
+ };
+
+ return hammer.on('hammer.input', callback.inputHandler);
+};
+
+
+/**
+ * Unregister a touch event, taking place before a gesture
+ * @param {Hammer} hammer A hammer instance
+ * @param {function} callback Callback, called as callback(event)
+ */
+exports.offTouch = function (hammer, callback) {
+ hammer.off('hammer.input', callback.inputHandler);
+};
+
+/**
+ * Unregister a release event, taking place before a gesture
+ * @param {Hammer} hammer A hammer instance
+ * @param {function} callback Callback, called as callback(event)
+ */
+exports.offRelease = exports.offTouch;
+
+/**
+ * Hack the PinchRecognizer such that it doesn't prevent default behavior
+ * for vertical panning.
+ *
+ * Yeah ... this is quite a hack ... see https://github.com/hammerjs/hammer.js/issues/932
+ *
+ * @param {Hammer.Pinch} pinchRecognizer
+ * @return {Hammer.Pinch} returns the pinchRecognizer
+ */
+exports.disablePreventDefaultVertically = function (pinchRecognizer) {
+ var TOUCH_ACTION_PAN_Y = 'pan-y';
+
+ pinchRecognizer.getTouchAction = function() {
+ // default method returns [TOUCH_ACTION_NONE]
+ return [TOUCH_ACTION_PAN_Y];
+ };
+
+ return pinchRecognizer;
+};
diff --git a/lib/header.js b/lib/header.js
new file mode 100644
index 0000000000..915256cae8
--- /dev/null
+++ b/lib/header.js
@@ -0,0 +1,42 @@
+import moment from 'moment';
+import pkg from '../package.json';
+
+const header = `
+${ pkg.homepage }
+
+${ pkg.description }
+
+@version ${ pkg.version }
+@date ${ moment().utc().format() }
+
+@copyright (c) 2011-2017 Almende B.V, http://almende.com
+@copyright (c) 2018-2019 visjs contributors, https://github.com/visjs
+
+@license
+vis.js is dual licensed under both
+
+ 1. The Apache 2.0 License
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ and
+
+ 2. The MIT License
+ http://opensource.org/licenses/MIT
+
+vis.js may be distributed under either license.`;
+
+/**
+ * Generate a dynamic header banner.
+ *
+ * @param {String} component
+ * @returns {String} banner
+ */
+function genHeader(component) {
+ return [
+ pkg.name,
+ component ? ' - ' + component : '',
+ header
+ ].join('');
+}
+
+export default genHeader;
\ No newline at end of file
diff --git a/lib/module/hammer.js b/lib/module/hammer.js
new file mode 100644
index 0000000000..7e5e3cae3d
--- /dev/null
+++ b/lib/module/hammer.js
@@ -0,0 +1,38 @@
+/**
+ * Setup a mock hammer.js object, for unit testing.
+ *
+ * Inspiration: https://github.com/uber/deck.gl/pull/658
+ *
+ * @returns {{on: noop, off: noop, destroy: noop, emit: noop, get: get}}
+ */
+function hammerMock() {
+ const noop = () => {};
+
+ return {
+ on: noop,
+ off: noop,
+ destroy: noop,
+ emit: noop,
+
+ get: function(m) { //eslint-disable-line no-unused-vars
+ return {
+ set: noop
+ };
+ }
+ };
+}
+
+
+if (typeof window !== 'undefined') {
+ var propagating = require('propagating-hammerjs');
+ var Hammer = window['Hammer'] || require('hammerjs');
+ module.exports = propagating(Hammer, {
+ preventDefault: 'mouse'
+ });
+}
+else {
+ module.exports = function () {
+ // hammer.js is only available in a browser, not in node.js. Replacing it with a mock object.
+ return hammerMock();
+ }
+}
diff --git a/lib/module/moment.js b/lib/module/moment.js
new file mode 100644
index 0000000000..7a65f58c23
--- /dev/null
+++ b/lib/module/moment.js
@@ -0,0 +1,3 @@
+// first check if moment.js is already loaded in the browser window, if so,
+// use this instance. Else, load via commonjs.
+module.exports = (typeof window !== 'undefined') && window['moment'] || require('moment');
diff --git a/lib/network/CachedImage.js b/lib/network/CachedImage.js
new file mode 100644
index 0000000000..317aa4ce84
--- /dev/null
+++ b/lib/network/CachedImage.js
@@ -0,0 +1,160 @@
+
+/**
+ * Associates a canvas to a given image, containing a number of renderings
+ * of the image at various sizes.
+ *
+ * This technique is known as 'mipmapping'.
+ *
+ * NOTE: Images can also be of type 'data:svg+xml`. This code also works
+ * for svg, but the mipmapping may not be necessary.
+ *
+ * @param {Image} image
+ */
+class CachedImage {
+ /**
+ * @ignore
+ */
+ constructor() { // eslint-disable-line no-unused-vars
+ this.NUM_ITERATIONS = 4; // Number of items in the coordinates array
+
+ this.image = new Image();
+ this.canvas = document.createElement('canvas');
+ }
+
+
+ /**
+ * Called when the image has been successfully loaded.
+ */
+ init() {
+ if (this.initialized()) return;
+
+ this.src = this.image.src; // For same interface with Image
+ var w = this.image.width;
+ var h = this.image.height;
+
+ // Ease external access
+ this.width = w;
+ this.height = h;
+
+ var h2 = Math.floor(h/2);
+ var h4 = Math.floor(h/4);
+ var h8 = Math.floor(h/8);
+ var h16 = Math.floor(h/16);
+
+ var w2 = Math.floor(w/2);
+ var w4 = Math.floor(w/4);
+ var w8 = Math.floor(w/8);
+ var w16 = Math.floor(w/16);
+
+ // Make canvas as small as possible
+ this.canvas.width = 3*w4;
+ this.canvas.height = h2;
+
+ // Coordinates and sizes of images contained in the canvas
+ // Values per row: [top x, left y, width, height]
+
+ this.coordinates = [
+ [ 0 , 0 , w2 , h2],
+ [ w2 , 0 , w4 , h4],
+ [ w2 , h4, w8 , h8],
+ [ 5*w8, h4, w16, h16]
+ ];
+
+ this._fillMipMap();
+ }
+
+
+ /**
+ * @return {Boolean} true if init() has been called, false otherwise.
+ */
+ initialized() {
+ return (this.coordinates !== undefined);
+ }
+
+
+ /**
+ * Redraw main image in various sizes to the context.
+ *
+ * The rationale behind this is to reduce artefacts due to interpolation
+ * at differing zoom levels.
+ *
+ * Source: http://stackoverflow.com/q/18761404/1223531
+ *
+ * This methods takes the resizing out of the drawing loop, in order to
+ * reduce performance overhead.
+ *
+ * TODO: The code assumes that a 2D context can always be gotten. This is
+ * not necessarily true! OTOH, if not true then usage of this class
+ * is senseless.
+ *
+ * @private
+ */
+ _fillMipMap() {
+ var ctx = this.canvas.getContext('2d');
+
+ // First zoom-level comes from the image
+ var to = this.coordinates[0];
+ ctx.drawImage(this.image, to[0], to[1], to[2], to[3]);
+
+ // The rest are copy actions internal to the canvas/context
+ for (let iterations = 1; iterations < this.NUM_ITERATIONS; iterations++) {
+ let from = this.coordinates[iterations - 1];
+ let to = this.coordinates[iterations];
+
+ ctx.drawImage(this.canvas,
+ from[0], from[1], from[2], from[3],
+ to[0], to[1], to[2], to[3]
+ );
+ }
+ }
+
+
+ /**
+ * Draw the image, using the mipmap if necessary.
+ *
+ * MipMap is only used if param factor > 2; otherwise, original bitmap
+ * is resized. This is also used to skip mipmap usage, e.g. by setting factor = 1
+ *
+ * Credits to 'Alex de Mulder' for original implementation.
+ *
+ * @param {CanvasRenderingContext2D} ctx context on which to draw zoomed image
+ * @param {Float} factor scale factor at which to draw
+ * @param {number} left
+ * @param {number} top
+ * @param {number} width
+ * @param {number} height
+ */
+ drawImageAtPosition(ctx, factor, left, top, width, height) {
+
+ if(!this.initialized())
+ return; //can't draw image yet not intialized
+
+ if (factor > 2) {
+ // Determine which zoomed image to use
+ factor *= 0.5;
+ let iterations = 0;
+ while (factor > 2 && iterations < this.NUM_ITERATIONS) {
+ factor *= 0.5;
+ iterations += 1;
+ }
+
+ if (iterations >= this.NUM_ITERATIONS) {
+ iterations = this.NUM_ITERATIONS - 1;
+ }
+ //console.log("iterations: " + iterations);
+
+ let from = this.coordinates[iterations];
+ ctx.drawImage(this.canvas,
+ from[0], from[1], from[2], from[3],
+ left, top, width, height
+ );
+ } else {
+ // Draw image directly
+ ctx.drawImage(this.image, left, top, width, height);
+ }
+ }
+
+}
+
+
+export default CachedImage;
diff --git a/lib/network/Images.js b/lib/network/Images.js
new file mode 100644
index 0000000000..4d556ca183
--- /dev/null
+++ b/lib/network/Images.js
@@ -0,0 +1,115 @@
+import CachedImage from './CachedImage';
+
+/**
+ * This callback is a callback that accepts an Image.
+ * @callback ImageCallback
+ * @param {Image} image
+ */
+
+/**
+ * This class loads images and keeps them stored.
+ *
+ * @param {ImageCallback} callback
+ */
+class Images {
+ /**
+ * @param {ImageCallback} callback
+ */
+ constructor(callback){
+ this.images = {};
+ this.imageBroken = {};
+ this.callback = callback;
+ }
+
+ /**
+ * @param {string} url The original Url that failed to load, if the broken image is successfully loaded it will be added to the cache using this Url as the key so that subsequent requests for this Url will return the broken image
+ * @param {string} brokenUrl Url the broken image to try and load
+ * @param {Image} imageToLoadBrokenUrlOn The image object
+ */
+ _tryloadBrokenUrl (url, brokenUrl, imageToLoadBrokenUrlOn) {
+ //If these parameters aren't specified then exit the function because nothing constructive can be done
+ if (url === undefined || imageToLoadBrokenUrlOn === undefined) return;
+ if (brokenUrl === undefined) {
+ console.warn("No broken url image defined");
+ return;
+ }
+
+ //Clear the old subscription to the error event and put a new in place that only handle errors in loading the brokenImageUrl
+ imageToLoadBrokenUrlOn.image.onerror = () => {
+ console.error("Could not load brokenImage:", brokenUrl);
+ // cache item will contain empty image, this should be OK for default
+ };
+
+ //Set the source of the image to the brokenUrl, this is actually what kicks off the loading of the broken image
+ imageToLoadBrokenUrlOn.image.src = brokenUrl;
+ }
+
+ /**
+ *
+ * @param {vis.Image} imageToRedrawWith
+ * @private
+ */
+ _redrawWithImage (imageToRedrawWith) {
+ if (this.callback) {
+ this.callback(imageToRedrawWith);
+ }
+ }
+
+ /**
+ * @param {string} url Url of the image
+ * @param {string} brokenUrl Url of an image to use if the url image is not found
+ * @return {Image} img The image object
+ */
+ load (url, brokenUrl) {
+ //Try and get the image from the cache, if successful then return the cached image
+ var cachedImage = this.images[url];
+ if (cachedImage) return cachedImage;
+
+ //Create a new image
+ var img = new CachedImage();
+
+ // Need to add to cache here, otherwise final return will spawn different copies of the same image,
+ // Also, there will be multiple loads of the same image.
+ this.images[url] = img;
+
+ //Subscribe to the event that is raised if the image loads successfully
+ img.image.onload = () => {
+ // Properly init the cached item and then request a redraw
+ this._fixImageCoordinates(img.image);
+ img.init();
+ this._redrawWithImage(img);
+ };
+
+ //Subscribe to the event that is raised if the image fails to load
+ img.image.onerror = () => {
+ console.error("Could not load image:", url);
+ //Try and load the image specified by the brokenUrl using
+ this._tryloadBrokenUrl(url, brokenUrl, img);
+ };
+
+ //Set the source of the image to the url, this is what actually kicks off the loading of the image
+ img.image.src = url;
+
+ //Return the new image
+ return img;
+ }
+
+
+ /**
+ * IE11 fix -- thanks dponch!
+ *
+ * Local helper function
+ * @param {vis.Image} imageToCache
+ * @private
+ */
+ _fixImageCoordinates(imageToCache) {
+ if (imageToCache.width === 0) {
+ document.body.appendChild(imageToCache);
+ imageToCache.width = imageToCache.offsetWidth;
+ imageToCache.height = imageToCache.offsetHeight;
+ document.body.removeChild(imageToCache);
+ }
+ }
+}
+
+export default Images;
diff --git a/lib/network/Network.js b/lib/network/Network.js
new file mode 100644
index 0000000000..e4e289032c
--- /dev/null
+++ b/lib/network/Network.js
@@ -0,0 +1,575 @@
+// Load custom shapes into CanvasRenderingContext2D
+import './shapes';
+
+import Emitter from 'emitter-component';
+import util from 'vis-util';
+import dotparser from './dotparser';
+import gephiParser from './gephiParser';
+import Activator from '../shared/Activator';
+import locales from './locales';
+
+import Images from './Images';
+import Groups from './modules/Groups';
+import NodesHandler from './modules/NodesHandler';
+import EdgesHandler from './modules/EdgesHandler';
+import PhysicsEngine from './modules/PhysicsEngine';
+import ClusterEngine from './modules/Clustering';
+import CanvasRenderer from './modules/CanvasRenderer';
+import Canvas from './modules/Canvas';
+import View from './modules/View';
+import InteractionHandler from './modules/InteractionHandler';
+import SelectionHandler from "./modules/SelectionHandler";
+import LayoutEngine from "./modules/LayoutEngine";
+import ManipulationSystem from "./modules/ManipulationSystem";
+import Configurator from "./../shared/Configurator";
+import { Validator, printStyle } from "./../shared/Validator";
+import {allOptions, configureOptions} from './options.js';
+import KamadaKawai from "./modules/KamadaKawai.js";
+
+
+/**
+ * Create a network visualization, displaying nodes and edges.
+ *
+ * @param {Element} container The DOM element in which the Network will
+ * be created. Normally a div element.
+ * @param {Object} data An object containing parameters
+ * {Array} nodes
+ * {Array} edges
+ * @param {Object} options Options
+ * @constructor Network
+ */
+function Network(container, data, options) {
+ if (!(this instanceof Network)) {
+ throw new SyntaxError('Constructor must be called with the new operator');
+ }
+
+ // set constant values
+ this.options = {};
+ this.defaultOptions = {
+ locale: 'en',
+ locales: locales,
+ clickToUse: false
+ };
+ util.extend(this.options, this.defaultOptions);
+
+ /**
+ * Containers for nodes and edges.
+ *
+ * 'edges' and 'nodes' contain the full definitions of all the network elements.
+ * 'nodeIndices' and 'edgeIndices' contain the id's of the active elements.
+ *
+ * The distinction is important, because a defined node need not be active, i.e.
+ * visible on the canvas. This happens in particular when clusters are defined, in
+ * that case there will be nodes and edges not displayed.
+ * The bottom line is that all code with actions related to visibility, *must* use
+ * 'nodeIndices' and 'edgeIndices', not 'nodes' and 'edges' directly.
+ */
+ this.body = {
+ container: container,
+
+ // See comment above for following fields
+ nodes: {},
+ nodeIndices: [],
+ edges: {},
+ edgeIndices: [],
+
+ emitter: {
+ on: this.on.bind(this),
+ off: this.off.bind(this),
+ emit: this.emit.bind(this),
+ once: this.once.bind(this)
+ },
+ eventListeners: {
+ onTap: function() {},
+ onTouch: function() {},
+ onDoubleTap: function() {},
+ onHold: function() {},
+ onDragStart: function() {},
+ onDrag: function() {},
+ onDragEnd: function() {},
+ onMouseWheel: function() {},
+ onPinch: function() {},
+ onMouseMove: function() {},
+ onRelease: function() {},
+ onContext: function() {}
+ },
+ data: {
+ nodes: null, // A DataSet or DataView
+ edges: null // A DataSet or DataView
+ },
+ functions: {
+ createNode: function() {},
+ createEdge: function() {},
+ getPointer: function() {}
+ },
+ modules: {},
+ view: {
+ scale: 1,
+ translation: {x: 0, y: 0}
+ }
+ };
+
+
+
+ // bind the event listeners
+ this.bindEventListeners();
+
+ // setting up all modules
+ this.images = new Images(() => this.body.emitter.emit("_requestRedraw")); // object with images
+ this.groups = new Groups(); // object with groups
+ this.canvas = new Canvas(this.body); // DOM handler
+ this.selectionHandler = new SelectionHandler(this.body, this.canvas); // Selection handler
+ this.interactionHandler = new InteractionHandler(this.body, this.canvas, this.selectionHandler); // Interaction handler handles all the hammer bindings (that are bound by canvas), key
+ this.view = new View(this.body, this.canvas); // camera handler, does animations and zooms
+ this.renderer = new CanvasRenderer(this.body, this.canvas); // renderer, starts renderloop, has events that modules can hook into
+ this.physics = new PhysicsEngine(this.body); // physics engine, does all the simulations
+ this.layoutEngine = new LayoutEngine(this.body); // layout engine for inital layout and hierarchical layout
+ this.clustering = new ClusterEngine(this.body); // clustering api
+ this.manipulation = new ManipulationSystem(this.body, this.canvas, this.selectionHandler); // data manipulation system
+
+ this.nodesHandler = new NodesHandler(this.body, this.images, this.groups, this.layoutEngine); // Handle adding, deleting and updating of nodes as well as global options
+ this.edgesHandler = new EdgesHandler(this.body, this.images, this.groups); // Handle adding, deleting and updating of edges as well as global options
+
+ this.body.modules["kamadaKawai"] = new KamadaKawai(this.body,150,0.05); // Layouting algorithm.
+ this.body.modules["clustering"] = this.clustering;
+
+ // create the DOM elements
+ this.canvas._create();
+
+ // apply options
+ this.setOptions(options);
+
+ // load data (the disable start variable will be the same as the enabled clustering)
+ this.setData(data);
+
+}
+
+// Extend Network with an Emitter mixin
+Emitter(Network.prototype);
+
+
+/**
+ * Set options
+ * @param {Object} options
+ */
+Network.prototype.setOptions = function (options) {
+ if (options === null) {
+ options = undefined; // This ensures that options handling doesn't crash in the handling
+ }
+
+ if (options !== undefined) {
+ let errorFound = Validator.validate(options, allOptions);
+ if (errorFound === true) {
+ console.log('%cErrors have been found in the supplied options object.', printStyle);
+ }
+
+ // copy the global fields over
+ let fields = ['locale','locales','clickToUse'];
+ util.selectiveDeepExtend(fields,this.options, options);
+
+ // the hierarchical system can adapt the edges and the physics to it's own options because not all combinations work with the hierarichical system.
+ options = this.layoutEngine.setOptions(options.layout, options);
+
+ this.canvas.setOptions(options); // options for canvas are in globals
+
+ // pass the options to the modules
+ this.groups.setOptions(options.groups);
+ this.nodesHandler.setOptions(options.nodes);
+ this.edgesHandler.setOptions(options.edges);
+ this.physics.setOptions(options.physics);
+ this.manipulation.setOptions(options.manipulation, options, this.options); // manipulation uses the locales in the globals
+
+ this.interactionHandler.setOptions(options.interaction);
+ this.renderer.setOptions(options.interaction); // options for rendering are in interaction
+ this.selectionHandler.setOptions(options.interaction); // options for selection are in interaction
+
+ // reload the settings of the nodes to apply changes in groups that are not referenced by pointer.
+ if (options.groups !== undefined) {
+ this.body.emitter.emit("refreshNodes");
+ }
+ // these two do not have options at the moment, here for completeness
+ //this.view.setOptions(options.view);
+ //this.clustering.setOptions(options.clustering);
+
+ if ('configure' in options) {
+ if (!this.configurator) {
+ this.configurator = new Configurator(this, this.body.container, configureOptions, this.canvas.pixelRatio);
+ }
+
+ this.configurator.setOptions(options.configure);
+ }
+
+ // if the configuration system is enabled, copy all options and put them into the config system
+ if (this.configurator && this.configurator.options.enabled === true) {
+ let networkOptions = {nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};
+ util.deepExtend(networkOptions.nodes, this.nodesHandler.options);
+ util.deepExtend(networkOptions.edges, this.edgesHandler.options);
+ util.deepExtend(networkOptions.layout, this.layoutEngine.options);
+ // load the selectionHandler and render default options in to the interaction group
+ util.deepExtend(networkOptions.interaction, this.selectionHandler.options);
+ util.deepExtend(networkOptions.interaction, this.renderer.options);
+
+ util.deepExtend(networkOptions.interaction, this.interactionHandler.options);
+ util.deepExtend(networkOptions.manipulation, this.manipulation.options);
+ util.deepExtend(networkOptions.physics, this.physics.options);
+
+ // load globals into the global object
+ util.deepExtend(networkOptions.global, this.canvas.options);
+ util.deepExtend(networkOptions.global, this.options);
+
+ this.configurator.setModuleOptions(networkOptions);
+ }
+
+ // handle network global options
+ if (options.clickToUse !== undefined) {
+ if (options.clickToUse === true) {
+ if (this.activator === undefined) {
+ this.activator = new Activator(this.canvas.frame);
+ this.activator.on('change', () => {this.body.emitter.emit("activate")});
+ }
+ }
+ else {
+ if (this.activator !== undefined) {
+ this.activator.destroy();
+ delete this.activator;
+ }
+ this.body.emitter.emit("activate");
+ }
+ }
+ else {
+ this.body.emitter.emit("activate");
+ }
+
+ this.canvas.setSize();
+ // start the physics simulation. Can be safely called multiple times.
+ this.body.emitter.emit("startSimulation");
+ }
+};
+
+
+/**
+ * Update the visible nodes and edges list with the most recent node state.
+ *
+ * Visible nodes are stored in this.body.nodeIndices.
+ * Visible edges are stored in this.body.edgeIndices.
+ * A node or edges is visible if it is not hidden or clustered.
+ *
+ * @private
+ */
+Network.prototype._updateVisibleIndices = function () {
+ let nodes = this.body.nodes;
+ let edges = this.body.edges;
+ this.body.nodeIndices = [];
+ this.body.edgeIndices = [];
+
+ for (let nodeId in nodes) {
+ if (nodes.hasOwnProperty(nodeId)) {
+ if (!this.clustering._isClusteredNode(nodeId) && nodes[nodeId].options.hidden === false) {
+ this.body.nodeIndices.push(nodes[nodeId].id);
+ }
+ }
+ }
+
+ for (let edgeId in edges) {
+ if (edges.hasOwnProperty(edgeId)) {
+ let edge = edges[edgeId];
+
+ // It can happen that this is executed *after* a node edge has been removed,
+ // but *before* the edge itself has been removed. Taking this into account.
+ let fromNode = nodes[edge.fromId];
+ let toNode = nodes[edge.toId];
+ let edgeNodesPresent = (fromNode !== undefined) && (toNode !== undefined);
+
+ let isVisible =
+ !this.clustering._isClusteredEdge(edgeId)
+ && edge.options.hidden === false
+ && edgeNodesPresent
+ && fromNode.options.hidden === false // Also hidden if any of its connecting nodes are hidden
+ && toNode.options.hidden === false; // idem
+
+ if (isVisible) {
+ this.body.edgeIndices.push(edge.id);
+ }
+ }
+ }
+};
+
+
+/**
+ * Bind all events
+ */
+Network.prototype.bindEventListeners = function () {
+ // This event will trigger a rebuilding of the cache everything.
+ // Used when nodes or edges have been added or removed.
+ this.body.emitter.on("_dataChanged", () => {
+ this.edgesHandler._updateState();
+ this.body.emitter.emit("_dataUpdated");
+ });
+
+ // this is called when options of EXISTING nodes or edges have changed.
+ this.body.emitter.on("_dataUpdated", () => {
+ // Order important in following block
+ this.clustering._updateState();
+ this._updateVisibleIndices();
+
+ this._updateValueRange(this.body.nodes);
+ this._updateValueRange(this.body.edges);
+ // start simulation (can be called safely, even if already running)
+ this.body.emitter.emit("startSimulation");
+ this.body.emitter.emit("_requestRedraw");
+ });
+};
+
+
+/**
+ * Set nodes and edges, and optionally options as well.
+ *
+ * @param {Object} data Object containing parameters:
+ * {Array | DataSet | DataView} [nodes] Array with nodes
+ * {Array | DataSet | DataView} [edges] Array with edges
+ * {String} [dot] String containing data in DOT format
+ * {String} [gephi] String containing data in gephi JSON format
+ * {Options} [options] Object with options
+ */
+Network.prototype.setData = function (data) {
+ // reset the physics engine.
+ this.body.emitter.emit("resetPhysics");
+ this.body.emitter.emit("_resetData");
+
+ // unselect all to ensure no selections from old data are carried over.
+ this.selectionHandler.unselectAll();
+
+ if (data && data.dot && (data.nodes || data.edges)) {
+ throw new SyntaxError('Data must contain either parameter "dot" or ' +
+ ' parameter pair "nodes" and "edges", but not both.');
+ }
+
+ // set options
+ this.setOptions(data && data.options);
+ // set all data
+ if (data && data.dot) {
+ console.log('The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);');
+ // parse DOT file
+ var dotData = dotparser.DOTToGraph(data.dot);
+ this.setData(dotData);
+ return;
+ }
+ else if (data && data.gephi) {
+ // parse DOT file
+ console.log('The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);');
+ var gephiData = gephiParser.parseGephi(data.gephi);
+ this.setData(gephiData);
+ return;
+ }
+ else {
+ this.nodesHandler.setData(data && data.nodes, true);
+ this.edgesHandler.setData(data && data.edges, true);
+ }
+
+ // emit change in data
+ this.body.emitter.emit("_dataChanged");
+
+ // emit data loaded
+ this.body.emitter.emit("_dataLoaded");
+
+ // find a stable position or start animating to a stable position
+ this.body.emitter.emit("initPhysics");
+};
+
+
+/**
+ * Cleans up all bindings of the network, removing it fully from the memory IF the variable is set to null after calling this function.
+ * var network = new vis.Network(..);
+ * network.destroy();
+ * network = null;
+ */
+Network.prototype.destroy = function () {
+ this.body.emitter.emit("destroy");
+ // clear events
+ this.body.emitter.off();
+ this.off();
+
+ // delete modules
+ delete this.groups;
+ delete this.canvas;
+ delete this.selectionHandler;
+ delete this.interactionHandler;
+ delete this.view;
+ delete this.renderer;
+ delete this.physics;
+ delete this.layoutEngine;
+ delete this.clustering;
+ delete this.manipulation;
+ delete this.nodesHandler;
+ delete this.edgesHandler;
+ delete this.configurator;
+ delete this.images;
+
+ for (var nodeId in this.body.nodes) {
+ if (!this.body.nodes.hasOwnProperty(nodeId)) continue;
+ delete this.body.nodes[nodeId];
+ }
+
+ for (var edgeId in this.body.edges) {
+ if (!this.body.edges.hasOwnProperty(edgeId)) continue;
+ delete this.body.edges[edgeId];
+ }
+
+ // remove the container and everything inside it recursively
+ util.recursiveDOMDelete(this.body.container);
+};
+
+
+/**
+ * Update the values of all object in the given array according to the current
+ * value range of the objects in the array.
+ * @param {Object} obj An object containing a set of Edges or Nodes
+ * The objects must have a method getValue() and
+ * setValueRange(min, max).
+ * @private
+ */
+Network.prototype._updateValueRange = function (obj) {
+ var id;
+
+ // determine the range of the objects
+ var valueMin = undefined;
+ var valueMax = undefined;
+ var valueTotal = 0;
+ for (id in obj) {
+ if (obj.hasOwnProperty(id)) {
+ var value = obj[id].getValue();
+ if (value !== undefined) {
+ valueMin = (valueMin === undefined) ? value : Math.min(value, valueMin);
+ valueMax = (valueMax === undefined) ? value : Math.max(value, valueMax);
+ valueTotal += value;
+ }
+ }
+ }
+
+ // adjust the range of all objects
+ if (valueMin !== undefined && valueMax !== undefined) {
+ for (id in obj) {
+ if (obj.hasOwnProperty(id)) {
+ obj[id].setValueRange(valueMin, valueMax, valueTotal);
+ }
+ }
+ }
+};
+
+
+/**
+ * Returns true when the Network is active.
+ * @returns {boolean}
+ */
+Network.prototype.isActive = function () {
+ return !this.activator || this.activator.active;
+};
+
+
+Network.prototype.setSize = function() {return this.canvas.setSize.apply(this.canvas,arguments);};
+Network.prototype.canvasToDOM = function() {return this.canvas.canvasToDOM.apply(this.canvas,arguments);};
+Network.prototype.DOMtoCanvas = function() {return this.canvas.DOMtoCanvas.apply(this.canvas,arguments);};
+
+
+/**
+ * Nodes can be in clusters. Clusters can also be in clusters. This function returns and array of
+ * nodeIds showing where the node is.
+ *
+ * If any nodeId in the chain, especially the first passed in as a parameter, is not present in
+ * the current nodes list, an empty array is returned.
+ *
+ * Example:
+ * cluster 'A' contains cluster 'B',
+ * cluster 'B' contains cluster 'C',
+ * cluster 'C' contains node 'fred'.
+ * `jsnetwork.clustering.findNode('fred')` will return `['A','B','C','fred']`.
+ *
+ * @param {string|number} nodeId
+ * @returns {Array}
+ */
+Network.prototype.findNode = function() {return this.clustering.findNode.apply(this.clustering,arguments);};
+
+
+Network.prototype.isCluster = function() {return this.clustering.isCluster.apply(this.clustering,arguments);};
+Network.prototype.openCluster = function() {return this.clustering.openCluster.apply(this.clustering,arguments);};
+Network.prototype.cluster = function() {return this.clustering.cluster.apply(this.clustering,arguments);};
+Network.prototype.getNodesInCluster = function() {return this.clustering.getNodesInCluster.apply(this.clustering,arguments);};
+Network.prototype.clusterByConnection = function() {return this.clustering.clusterByConnection.apply(this.clustering,arguments);};
+Network.prototype.clusterByHubsize = function() {return this.clustering.clusterByHubsize.apply(this.clustering,arguments);};
+
+/**
+ * This method will cluster all nodes with 1 edge with their respective connected node.
+ * The options object is explained in full below .
+ *
+ * @param {object} [options]
+ * @returns {undefined}
+ */
+Network.prototype.clusterOutliers = function() {return this.clustering.clusterOutliers.apply(this.clustering,arguments);};
+
+Network.prototype.getSeed = function() {return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments);};
+Network.prototype.enableEditMode = function() {return this.manipulation.enableEditMode.apply(this.manipulation,arguments);};
+Network.prototype.disableEditMode = function() {return this.manipulation.disableEditMode.apply(this.manipulation,arguments);};
+Network.prototype.addNodeMode = function() {return this.manipulation.addNodeMode.apply(this.manipulation,arguments);};
+Network.prototype.editNode = function() {return this.manipulation.editNode.apply(this.manipulation,arguments);};
+Network.prototype.editNodeMode = function() {console.log("Deprecated: Please use editNode instead of editNodeMode."); return this.manipulation.editNode.apply(this.manipulation,arguments);};
+Network.prototype.addEdgeMode = function() {return this.manipulation.addEdgeMode.apply(this.manipulation,arguments);};
+Network.prototype.editEdgeMode = function() {return this.manipulation.editEdgeMode.apply(this.manipulation,arguments);};
+Network.prototype.deleteSelected = function() {return this.manipulation.deleteSelected.apply(this.manipulation,arguments);};
+Network.prototype.getPositions = function() {return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments);};
+Network.prototype.storePositions = function() {return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments);};
+Network.prototype.moveNode = function() {return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments);};
+Network.prototype.getBoundingBox = function() {return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments);};
+Network.prototype.getConnectedNodes = function(objectId) {
+ if (this.body.nodes[objectId] !== undefined) {
+ return this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments);
+ }
+ else {
+ return this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments);
+ }
+};
+Network.prototype.getConnectedEdges = function() {return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments);};
+Network.prototype.startSimulation = function() {return this.physics.startSimulation.apply(this.physics,arguments);};
+Network.prototype.stopSimulation = function() {return this.physics.stopSimulation.apply(this.physics,arguments);};
+Network.prototype.stabilize = function() {return this.physics.stabilize.apply(this.physics,arguments);};
+Network.prototype.getSelection = function() {return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments);};
+Network.prototype.setSelection = function() {return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments);};
+Network.prototype.getSelectedNodes = function() {return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments);};
+Network.prototype.getSelectedEdges = function() {return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments);};
+Network.prototype.getNodeAt = function() {
+ var node = this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);
+ if (node !== undefined && node.id !== undefined) {
+ return node.id;
+ }
+ return node;
+};
+Network.prototype.getEdgeAt = function() {
+ var edge = this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);
+ if (edge !== undefined && edge.id !== undefined) {
+ return edge.id;
+ }
+ return edge;
+ };
+Network.prototype.selectNodes = function() {return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments);};
+Network.prototype.selectEdges = function() {return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments);};
+Network.prototype.unselectAll = function() {
+ this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments);
+ this.redraw();
+};
+Network.prototype.redraw = function() {return this.renderer.redraw.apply(this.renderer,arguments);};
+Network.prototype.getScale = function() {return this.view.getScale.apply(this.view,arguments);};
+Network.prototype.getViewPosition = function() {return this.view.getViewPosition.apply(this.view,arguments);};
+Network.prototype.fit = function() {return this.view.fit.apply(this.view,arguments);};
+Network.prototype.moveTo = function() {return this.view.moveTo.apply(this.view,arguments);};
+Network.prototype.focus = function() {return this.view.focus.apply(this.view,arguments);};
+Network.prototype.releaseNode = function() {return this.view.releaseNode.apply(this.view,arguments);};
+Network.prototype.getOptionsFromConfigurator = function() {
+ let options = {};
+ if (this.configurator) {
+ options = this.configurator.getOptions.apply(this.configurator);
+ }
+ return options;
+};
+
+
+
+export default Network;
diff --git a/lib/network/NetworkUtil.js b/lib/network/NetworkUtil.js
new file mode 100644
index 0000000000..9f350a039f
--- /dev/null
+++ b/lib/network/NetworkUtil.js
@@ -0,0 +1,115 @@
+import util from 'vis-util';
+
+/**
+ * Utility Class
+ */
+class NetworkUtil {
+ /**
+ * @ignore
+ */
+ constructor() {}
+
+ /**
+ * Find the center position of the network considering the bounding boxes
+ *
+ * @param {Array.} allNodes
+ * @param {Array.} [specificNodes=[]]
+ * @returns {{minX: number, maxX: number, minY: number, maxY: number}}
+ * @static
+ */
+ static getRange(allNodes, specificNodes = []) {
+ var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node;
+ if (specificNodes.length > 0) {
+ for (var i = 0; i < specificNodes.length; i++) {
+ node = allNodes[specificNodes[i]];
+ if (minX > node.shape.boundingBox.left) {
+ minX = node.shape.boundingBox.left;
+ }
+ if (maxX < node.shape.boundingBox.right) {
+ maxX = node.shape.boundingBox.right;
+ }
+ if (minY > node.shape.boundingBox.top) {
+ minY = node.shape.boundingBox.top;
+ } // top is negative, bottom is positive
+ if (maxY < node.shape.boundingBox.bottom) {
+ maxY = node.shape.boundingBox.bottom;
+ } // top is negative, bottom is positive
+ }
+ }
+
+ if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) {
+ minY = 0, maxY = 0, minX = 0, maxX = 0;
+ }
+ return {minX: minX, maxX: maxX, minY: minY, maxY: maxY};
+ }
+
+ /**
+ * Find the center position of the network
+ *
+ * @param {Array.} allNodes
+ * @param {Array.} [specificNodes=[]]
+ * @returns {{minX: number, maxX: number, minY: number, maxY: number}}
+ * @static
+ */
+ static getRangeCore(allNodes, specificNodes = []) {
+ var minY = 1e9, maxY = -1e9, minX = 1e9, maxX = -1e9, node;
+ if (specificNodes.length > 0) {
+ for (var i = 0; i < specificNodes.length; i++) {
+ node = allNodes[specificNodes[i]];
+ if (minX > node.x) {
+ minX = node.x;
+ }
+ if (maxX < node.x) {
+ maxX = node.x;
+ }
+ if (minY > node.y) {
+ minY = node.y;
+ } // top is negative, bottom is positive
+ if (maxY < node.y) {
+ maxY = node.y;
+ } // top is negative, bottom is positive
+ }
+ }
+
+ if (minX === 1e9 && maxX === -1e9 && minY === 1e9 && maxY === -1e9) {
+ minY = 0, maxY = 0, minX = 0, maxX = 0;
+ }
+ return {minX: minX, maxX: maxX, minY: minY, maxY: maxY};
+ }
+
+
+ /**
+ * @param {object} range = {minX: minX, maxX: maxX, minY: minY, maxY: maxY};
+ * @returns {{x: number, y: number}}
+ * @static
+ */
+ static findCenter(range) {
+ return {x: (0.5 * (range.maxX + range.minX)),
+ y: (0.5 * (range.maxY + range.minY))};
+ }
+
+
+ /**
+ * This returns a clone of the options or options of the edge or node to be used for construction of new edges or check functions for new nodes.
+ * @param {vis.Item} item
+ * @param {'node'|undefined} type
+ * @returns {{}}
+ * @static
+ */
+ static cloneOptions(item, type) {
+ let clonedOptions = {};
+ if (type === undefined || type === 'node') {
+ util.deepExtend(clonedOptions, item.options, true);
+ clonedOptions.x = item.x;
+ clonedOptions.y = item.y;
+ clonedOptions.amountOfConnections = item.edges.length;
+ }
+ else {
+ util.deepExtend(clonedOptions, item.options, true);
+ }
+ return clonedOptions;
+ }
+
+}
+
+export default NetworkUtil;
\ No newline at end of file
diff --git a/lib/network/css/network-colorpicker.css b/lib/network/css/network-colorpicker.css
new file mode 100644
index 0000000000..07406fa859
--- /dev/null
+++ b/lib/network/css/network-colorpicker.css
@@ -0,0 +1,178 @@
+
+div.vis-color-picker {
+ position:absolute;
+ top: 0px;
+ left: 30px;
+ margin-top:-140px;
+ margin-left:30px;
+ width:310px;
+ height:444px;
+ z-index: 1;
+ padding: 10px;
+ border-radius:15px;
+ background-color:#ffffff;
+ display: none;
+ box-shadow: rgba(0,0,0,0.5) 0px 0px 10px 0px;
+}
+
+div.vis-color-picker div.vis-arrow {
+ position: absolute;
+ top:147px;
+ left:5px;
+}
+
+div.vis-color-picker div.vis-arrow::after,
+div.vis-color-picker div.vis-arrow::before {
+ right: 100%;
+ top: 50%;
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+}
+
+div.vis-color-picker div.vis-arrow:after {
+ border-color: rgba(255, 255, 255, 0);
+ border-right-color: #ffffff;
+ border-width: 30px;
+ margin-top: -30px;
+}
+
+div.vis-color-picker div.vis-color {
+ position:absolute;
+ width: 289px;
+ height: 289px;
+ cursor: pointer;
+}
+
+
+
+div.vis-color-picker div.vis-brightness {
+ position: absolute;
+ top:313px;
+}
+
+div.vis-color-picker div.vis-opacity {
+ position:absolute;
+ top:350px;
+}
+
+div.vis-color-picker div.vis-selector {
+ position:absolute;
+ top:137px;
+ left:137px;
+ width:15px;
+ height:15px;
+ border-radius:15px;
+ border:1px solid #ffffff;
+ background: #4c4c4c; /* Old browsers */
+ background: -moz-linear-gradient(top, #4c4c4c 0%, #595959 12%, #666666 25%, #474747 39%, #2c2c2c 50%, #000000 51%, #111111 60%, #2b2b2b 76%, #1c1c1c 91%, #131313 100%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4c4c4c), color-stop(12%,#595959), color-stop(25%,#666666), color-stop(39%,#474747), color-stop(50%,#2c2c2c), color-stop(51%,#000000), color-stop(60%,#111111), color-stop(76%,#2b2b2b), color-stop(91%,#1c1c1c), color-stop(100%,#131313)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #4c4c4c 0%,#595959 12%,#666666 25%,#474747 39%,#2c2c2c 50%,#000000 51%,#111111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(top, #4c4c4c 0%,#595959 12%,#666666 25%,#474747 39%,#2c2c2c 50%,#000000 51%,#111111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #4c4c4c 0%,#595959 12%,#666666 25%,#474747 39%,#2c2c2c 50%,#000000 51%,#111111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%); /* IE10+ */
+ background: linear-gradient(to bottom, #4c4c4c 0%,#595959 12%,#666666 25%,#474747 39%,#2c2c2c 50%,#000000 51%,#111111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4c4c4c', endColorstr='#131313',GradientType=0 ); /* IE6-9 */
+}
+
+
+
+div.vis-color-picker div.vis-new-color {
+ position:absolute;
+ width:140px;
+ height:20px;
+ border:1px solid rgba(0,0,0,0.1);
+ border-radius:5px;
+ top:380px;
+ left:159px;
+ text-align:right;
+ padding-right:2px;
+ font-size:10px;
+ color:rgba(0,0,0,0.4);
+ vertical-align:middle;
+ line-height:20px;
+
+}
+
+div.vis-color-picker div.vis-initial-color {
+ position:absolute;
+ width:140px;
+ height:20px;
+ border:1px solid rgba(0,0,0,0.1);
+ border-radius:5px;
+ top:380px;
+ left:10px;
+ text-align:left;
+ padding-left:2px;
+ font-size:10px;
+ color:rgba(0,0,0,0.4);
+ vertical-align:middle;
+ line-height:20px;
+}
+
+div.vis-color-picker div.vis-label {
+ position:absolute;
+ width:300px;
+ left:10px;
+}
+
+div.vis-color-picker div.vis-label.vis-brightness {
+ top:300px;
+}
+
+div.vis-color-picker div.vis-label.vis-opacity {
+ top:338px;
+}
+
+div.vis-color-picker div.vis-button {
+ position:absolute;
+ width:68px;
+ height:25px;
+ border-radius:10px;
+ vertical-align: middle;
+ text-align:center;
+ line-height: 25px;
+ top:410px;
+ border:2px solid #d9d9d9;
+ background-color: #f7f7f7;
+ cursor:pointer;
+}
+
+div.vis-color-picker div.vis-button.vis-cancel {
+ /*border:2px solid #ff4e33;*/
+ /*background-color: #ff7761;*/
+ left:5px;
+}
+div.vis-color-picker div.vis-button.vis-load {
+ /*border:2px solid #a153e6;*/
+ /*background-color: #cb8dff;*/
+ left:82px;
+}
+div.vis-color-picker div.vis-button.vis-apply {
+ /*border:2px solid #4588e6;*/
+ /*background-color: #82b6ff;*/
+ left:159px;
+}
+div.vis-color-picker div.vis-button.vis-save {
+ /*border:2px solid #45e655;*/
+ /*background-color: #6dff7c;*/
+ left:236px;
+}
+
+
+div.vis-color-picker input.vis-range {
+ width: 290px;
+ height:20px;
+}
+
+/* TODO: is this redundant?
+div.vis-color-picker input.vis-range-brightness {
+ width: 289px !important;
+}
+
+
+div.vis-color-picker input.vis-saturation-range {
+ width: 289px !important;
+}*/
\ No newline at end of file
diff --git a/lib/network/css/network-manipulation.css b/lib/network/css/network-manipulation.css
new file mode 100644
index 0000000000..d40de077fc
--- /dev/null
+++ b/lib/network/css/network-manipulation.css
@@ -0,0 +1,151 @@
+div.vis-network div.vis-manipulation {
+ box-sizing: content-box;
+
+ border-width: 0;
+ border-bottom: 1px;
+ border-style:solid;
+ border-color: #d6d9d8;
+ background: #ffffff; /* Old browsers */
+ background: -moz-linear-gradient(top, #ffffff 0%, #fcfcfc 48%, #fafafa 50%, #fcfcfc 100%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(48%,#fcfcfc), color-stop(50%,#fafafa), color-stop(100%,#fcfcfc)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(top, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* IE10+ */
+ background: linear-gradient(to bottom, #ffffff 0%,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fcfcfc',GradientType=0 ); /* IE6-9 */
+
+ padding-top:4px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 28px;
+}
+
+div.vis-network div.vis-edit-mode {
+ position:absolute;
+ left: 0;
+ top: 5px;
+ height: 30px;
+}
+
+/* FIXME: shouldn't the vis-close button be a child of the vis-manipulation div? */
+
+div.vis-network div.vis-close {
+ position:absolute;
+ right: 0;
+ top: 0;
+ width: 30px;
+ height: 30px;
+
+ background-position: 20px 3px;
+ background-repeat: no-repeat;
+ background-image: url("img/network/cross.png");
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.vis-network div.vis-close:hover {
+ opacity: 0.6;
+}
+
+div.vis-network div.vis-manipulation div.vis-button,
+div.vis-network div.vis-edit-mode div.vis-button {
+ float:left;
+ font-family: verdana;
+ font-size: 12px;
+ -moz-border-radius: 15px;
+ border-radius: 15px;
+ display:inline-block;
+ background-position: 0px 0px;
+ background-repeat:no-repeat;
+ height:24px;
+ margin-left: 10px;
+ /*vertical-align:middle;*/
+ cursor: pointer;
+ padding: 0px 8px 0px 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.vis-network div.vis-manipulation div.vis-button:hover {
+ box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.20);
+}
+
+div.vis-network div.vis-manipulation div.vis-button:active {
+ box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.50);
+}
+
+div.vis-network div.vis-manipulation div.vis-button.vis-back {
+ background-image: url("img/network/backIcon.png");
+}
+
+div.vis-network div.vis-manipulation div.vis-button.vis-none:hover {
+ box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.0);
+ cursor: default;
+}
+div.vis-network div.vis-manipulation div.vis-button.vis-none:active {
+ box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.0);
+}
+div.vis-network div.vis-manipulation div.vis-button.vis-none {
+ padding: 0;
+}
+div.vis-network div.vis-manipulation div.notification {
+ margin: 2px;
+ font-weight: bold;
+}
+
+div.vis-network div.vis-manipulation div.vis-button.vis-add {
+ background-image: url("img/network/addNodeIcon.png");
+}
+
+div.vis-network div.vis-manipulation div.vis-button.vis-edit,
+div.vis-network div.vis-edit-mode div.vis-button.vis-edit {
+ background-image: url("img/network/editIcon.png");
+}
+
+div.vis-network div.vis-edit-mode div.vis-button.vis-edit.vis-edit-mode {
+ background-color: #fcfcfc;
+ border: 1px solid #cccccc;
+}
+
+div.vis-network div.vis-manipulation div.vis-button.vis-connect {
+ background-image: url("img/network/connectIcon.png");
+}
+
+div.vis-network div.vis-manipulation div.vis-button.vis-delete {
+ background-image: url("img/network/deleteIcon.png");
+}
+/* top right bottom left */
+div.vis-network div.vis-manipulation div.vis-label,
+div.vis-network div.vis-edit-mode div.vis-label {
+ margin: 0 0 0 23px;
+ line-height: 25px;
+}
+div.vis-network div.vis-manipulation div.vis-separator-line {
+ float:left;
+ display:inline-block;
+ width:1px;
+ height:21px;
+ background-color: #bdbdbd;
+ margin: 0px 7px 0 15px; /*top right bottom left*/
+}
+
+/* TODO: is this redundant?
+div.network-navigation_wrapper {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+}
+*/
diff --git a/lib/network/css/network-navigation.css b/lib/network/css/network-navigation.css
new file mode 100644
index 0000000000..62d0363aec
--- /dev/null
+++ b/lib/network/css/network-navigation.css
@@ -0,0 +1,61 @@
+div.vis-network div.vis-navigation div.vis-button {
+ width:34px;
+ height:34px;
+ -moz-border-radius: 17px;
+ border-radius: 17px;
+ position:absolute;
+ display:inline-block;
+ background-position: 2px 2px;
+ background-repeat:no-repeat;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.vis-network div.vis-navigation div.vis-button:hover {
+ box-shadow: 0 0 3px 3px rgba(56, 207, 21, 0.30);
+}
+
+div.vis-network div.vis-navigation div.vis-button:active {
+ box-shadow: 0 0 1px 3px rgba(56, 207, 21, 0.95);
+}
+
+div.vis-network div.vis-navigation div.vis-button.vis-up {
+ background-image: url("img/network/upArrow.png");
+ bottom:50px;
+ left:55px;
+}
+div.vis-network div.vis-navigation div.vis-button.vis-down {
+ background-image: url("img/network/downArrow.png");
+ bottom:10px;
+ left:55px;
+}
+div.vis-network div.vis-navigation div.vis-button.vis-left {
+ background-image: url("img/network/leftArrow.png");
+ bottom:10px;
+ left:15px;
+}
+div.vis-network div.vis-navigation div.vis-button.vis-right {
+ background-image: url("img/network/rightArrow.png");
+ bottom:10px;
+ left:95px;
+}
+div.vis-network div.vis-navigation div.vis-button.vis-zoomIn {
+ background-image: url("img/network/plus.png");
+ bottom:10px;
+ right:15px;
+}
+div.vis-network div.vis-navigation div.vis-button.vis-zoomOut {
+ background-image: url("img/network/minus.png");
+ bottom:10px;
+ right:55px;
+}
+div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends {
+ background-image: url("img/network/zoomExtends.png");
+ bottom:50px;
+ right:15px;
+}
\ No newline at end of file
diff --git a/lib/network/dotparser.js b/lib/network/dotparser.js
new file mode 100644
index 0000000000..2efd580b11
--- /dev/null
+++ b/lib/network/dotparser.js
@@ -0,0 +1,982 @@
+/**
+ * Parse a text source containing data in DOT language into a JSON object.
+ * The object contains two lists: one with nodes and one with edges.
+ *
+ * DOT language reference: http://www.graphviz.org/doc/info/lang.html
+ *
+ * DOT language attributes: http://graphviz.org/content/attrs
+ *
+ * @param {string} data Text containing a graph in DOT-notation
+ * @return {Object} graph An object containing two parameters:
+ * {Object[]} nodes
+ * {Object[]} edges
+ *
+ * -------------------------------------------
+ * TODO
+ * ====
+ *
+ * For label handling, this is an incomplete implementation. From docs (quote #3015):
+ *
+ * > the escape sequences "\n", "\l" and "\r" divide the label into lines, centered,
+ * > left-justified, and right-justified, respectively.
+ *
+ * Source: http://www.graphviz.org/content/attrs#kescString
+ *
+ * > As another aid for readability, dot allows double-quoted strings to span multiple physical
+ * > lines using the standard C convention of a backslash immediately preceding a newline
+ * > character
+ * > In addition, double-quoted strings can be concatenated using a '+' operator.
+ * > As HTML strings can contain newline characters, which are used solely for formatting,
+ * > the language does not allow escaped newlines or concatenation operators to be used
+ * > within them.
+ *
+ * - Currently, only '\\n' is handled
+ * - Note that text explicitly says 'labels'; the dot parser currently handles escape
+ * sequences in **all** strings.
+ */
+function parseDOT (data) {
+ dot = data;
+ return parseGraph();
+}
+
+// mapping of attributes from DOT (the keys) to vis.js (the values)
+var NODE_ATTR_MAPPING = {
+ 'fontsize': 'font.size',
+ 'fontcolor': 'font.color',
+ 'labelfontcolor': 'font.color',
+ 'fontname': 'font.face',
+ 'color': ['color.border', 'color.background'],
+ 'fillcolor': 'color.background',
+ 'tooltip': 'title',
+ 'labeltooltip': 'title'
+};
+var EDGE_ATTR_MAPPING = Object.create(NODE_ATTR_MAPPING);
+EDGE_ATTR_MAPPING.color = 'color.color';
+EDGE_ATTR_MAPPING.style = 'dashes';
+
+// token types enumeration
+var TOKENTYPE = {
+ NULL : 0,
+ DELIMITER : 1,
+ IDENTIFIER: 2,
+ UNKNOWN : 3
+};
+
+// map with all delimiters
+var DELIMITERS = {
+ '{': true,
+ '}': true,
+ '[': true,
+ ']': true,
+ ';': true,
+ '=': true,
+ ',': true,
+
+ '->': true,
+ '--': true
+};
+
+var dot = ''; // current dot file
+var index = 0; // current index in dot file
+var c = ''; // current token character in expr
+var token = ''; // current token
+var tokenType = TOKENTYPE.NULL; // type of the token
+
+/**
+ * Get the first character from the dot file.
+ * The character is stored into the char c. If the end of the dot file is
+ * reached, the function puts an empty string in c.
+ */
+function first() {
+ index = 0;
+ c = dot.charAt(0);
+}
+
+/**
+ * Get the next character from the dot file.
+ * The character is stored into the char c. If the end of the dot file is
+ * reached, the function puts an empty string in c.
+ */
+function next() {
+ index++;
+ c = dot.charAt(index);
+}
+
+/**
+ * Preview the next character from the dot file.
+ * @return {string} cNext
+ */
+function nextPreview() {
+ return dot.charAt(index + 1);
+}
+
+var regexAlphaNumeric = /[a-zA-Z_0-9.:#]/;
+/**
+ * Test whether given character is alphabetic or numeric
+ * @param {string} c
+ * @return {Boolean} isAlphaNumeric
+ */
+function isAlphaNumeric(c) {
+ return regexAlphaNumeric.test(c);
+}
+
+/**
+ * Merge all options of object b into object b
+ * @param {Object} a
+ * @param {Object} b
+ * @return {Object} a
+ */
+function merge (a, b) {
+ if (!a) {
+ a = {};
+ }
+
+ if (b) {
+ for (var name in b) {
+ if (b.hasOwnProperty(name)) {
+ a[name] = b[name];
+ }
+ }
+ }
+ return a;
+}
+
+/**
+ * Set a value in an object, where the provided parameter name can be a
+ * path with nested parameters. For example:
+ *
+ * var obj = {a: 2};
+ * setValue(obj, 'b.c', 3); // obj = {a: 2, b: {c: 3}}
+ *
+ * @param {Object} obj
+ * @param {string} path A parameter name or dot-separated parameter path,
+ * like "color.highlight.border".
+ * @param {*} value
+ */
+function setValue(obj, path, value) {
+ var keys = path.split('.');
+ var o = obj;
+ while (keys.length) {
+ var key = keys.shift();
+ if (keys.length) {
+ // this isn't the end point
+ if (!o[key]) {
+ o[key] = {};
+ }
+ o = o[key];
+ }
+ else {
+ // this is the end point
+ o[key] = value;
+ }
+ }
+}
+
+/**
+ * Add a node to a graph object. If there is already a node with
+ * the same id, their attributes will be merged.
+ * @param {Object} graph
+ * @param {Object} node
+ */
+function addNode(graph, node) {
+ var i, len;
+ var current = null;
+
+ // find root graph (in case of subgraph)
+ var graphs = [graph]; // list with all graphs from current graph to root graph
+ var root = graph;
+ while (root.parent) {
+ graphs.push(root.parent);
+ root = root.parent;
+ }
+
+ // find existing node (at root level) by its id
+ if (root.nodes) {
+ for (i = 0, len = root.nodes.length; i < len; i++) {
+ if (node.id === root.nodes[i].id) {
+ current = root.nodes[i];
+ break;
+ }
+ }
+ }
+
+ if (!current) {
+ // this is a new node
+ current = {
+ id: node.id
+ };
+ if (graph.node) {
+ // clone default attributes
+ current.attr = merge(current.attr, graph.node);
+ }
+ }
+
+ // add node to this (sub)graph and all its parent graphs
+ for (i = graphs.length - 1; i >= 0; i--) {
+ var g = graphs[i];
+
+ if (!g.nodes) {
+ g.nodes = [];
+ }
+ if (g.nodes.indexOf(current) === -1) {
+ g.nodes.push(current);
+ }
+ }
+
+ // merge attributes
+ if (node.attr) {
+ current.attr = merge(current.attr, node.attr);
+ }
+}
+
+/**
+ * Add an edge to a graph object
+ * @param {Object} graph
+ * @param {Object} edge
+ */
+function addEdge(graph, edge) {
+ if (!graph.edges) {
+ graph.edges = [];
+ }
+ graph.edges.push(edge);
+ if (graph.edge) {
+ var attr = merge({}, graph.edge); // clone default attributes
+ edge.attr = merge(attr, edge.attr); // merge attributes
+ }
+}
+
+/**
+ * Create an edge to a graph object
+ * @param {Object} graph
+ * @param {string | number | Object} from
+ * @param {string | number | Object} to
+ * @param {string} type
+ * @param {Object | null} attr
+ * @return {Object} edge
+ */
+function createEdge(graph, from, to, type, attr) {
+ var edge = {
+ from: from,
+ to: to,
+ type: type
+ };
+
+ if (graph.edge) {
+ edge.attr = merge({}, graph.edge); // clone default attributes
+ }
+ edge.attr = merge(edge.attr || {}, attr); // merge attributes
+
+ // Move arrows attribute from attr to edge temporally created in
+ // parseAttributeList().
+ if (attr != null) {
+ if (attr.hasOwnProperty('arrows')) {
+ edge['arrows'] = {to: {enabled: true, type: attr.arrows.type}};
+ attr['arrows'] = null;
+ }
+ }
+ return edge;
+}
+
+/**
+ * Get next token in the current dot file.
+ * The token and token type are available as token and tokenType
+ */
+function getToken() {
+ tokenType = TOKENTYPE.NULL;
+ token = '';
+
+ // skip over whitespaces
+ while (c === ' ' || c === '\t' || c === '\n' || c === '\r') { // space, tab, enter
+ next();
+ }
+
+ do {
+ var isComment = false;
+
+ // skip comment
+ if (c === '#') {
+ // find the previous non-space character
+ var i = index - 1;
+ while (dot.charAt(i) === ' ' || dot.charAt(i) === '\t') {
+ i--;
+ }
+ if (dot.charAt(i) === '\n' || dot.charAt(i) === '') {
+ // the # is at the start of a line, this is indeed a line comment
+ while (c != '' && c != '\n') {
+ next();
+ }
+ isComment = true;
+ }
+ }
+ if (c === '/' && nextPreview() === '/') {
+ // skip line comment
+ while (c != '' && c != '\n') {
+ next();
+ }
+ isComment = true;
+ }
+ if (c === '/' && nextPreview() === '*') {
+ // skip block comment
+ while (c != '') {
+ if (c === '*' && nextPreview() === '/') {
+ // end of block comment found. skip these last two characters
+ next();
+ next();
+ break;
+ }
+ else {
+ next();
+ }
+ }
+ isComment = true;
+ }
+
+ // skip over whitespaces
+ while (c === ' ' || c === '\t' || c === '\n' || c === '\r') { // space, tab, enter
+ next();
+ }
+ }
+ while (isComment);
+
+ // check for end of dot file
+ if (c === '') {
+ // token is still empty
+ tokenType = TOKENTYPE.DELIMITER;
+ return;
+ }
+
+ // check for delimiters consisting of 2 characters
+ var c2 = c + nextPreview();
+ if (DELIMITERS[c2]) {
+ tokenType = TOKENTYPE.DELIMITER;
+ token = c2;
+ next();
+ next();
+ return;
+ }
+
+ // check for delimiters consisting of 1 character
+ if (DELIMITERS[c]) {
+ tokenType = TOKENTYPE.DELIMITER;
+ token = c;
+ next();
+ return;
+ }
+
+ // check for an identifier (number or string)
+ // TODO: more precise parsing of numbers/strings (and the port separator ':')
+ if (isAlphaNumeric(c) || c === '-') {
+ token += c;
+ next();
+
+ while (isAlphaNumeric(c)) {
+ token += c;
+ next();
+ }
+ if (token === 'false') {
+ token = false; // convert to boolean
+ }
+ else if (token === 'true') {
+ token = true; // convert to boolean
+ }
+ else if (!isNaN(Number(token))) {
+ token = Number(token); // convert to number
+ }
+ tokenType = TOKENTYPE.IDENTIFIER;
+ return;
+ }
+
+ // check for a string enclosed by double quotes
+ if (c === '"') {
+ next();
+ while (c != '' && (c != '"' || (c === '"' && nextPreview() === '"'))) {
+ if (c === '"') { // skip the escape character
+ token += c;
+ next();
+ } else if (c === '\\' && nextPreview() === 'n') { // Honor a newline escape sequence
+ token += '\n';
+ next();
+ } else {
+ token += c;
+ }
+ next();
+ }
+ if (c != '"') {
+ throw newSyntaxError('End of string " expected');
+ }
+ next();
+ tokenType = TOKENTYPE.IDENTIFIER;
+ return;
+ }
+
+ // something unknown is found, wrong characters, a syntax error
+ tokenType = TOKENTYPE.UNKNOWN;
+ while (c != '') {
+ token += c;
+ next();
+ }
+ throw new SyntaxError('Syntax error in part "' + chop(token, 30) + '"');
+}
+
+/**
+ * Parse a graph.
+ * @returns {Object} graph
+ */
+function parseGraph() {
+ var graph = {};
+
+ first();
+ getToken();
+
+ // optional strict keyword
+ if (token === 'strict') {
+ graph.strict = true;
+ getToken();
+ }
+
+ // graph or digraph keyword
+ if (token === 'graph' || token === 'digraph') {
+ graph.type = token;
+ getToken();
+ }
+
+ // optional graph id
+ if (tokenType === TOKENTYPE.IDENTIFIER) {
+ graph.id = token;
+ getToken();
+ }
+
+ // open angle bracket
+ if (token != '{') {
+ throw newSyntaxError('Angle bracket { expected');
+ }
+ getToken();
+
+ // statements
+ parseStatements(graph);
+
+ // close angle bracket
+ if (token != '}') {
+ throw newSyntaxError('Angle bracket } expected');
+ }
+ getToken();
+
+ // end of file
+ if (token !== '') {
+ throw newSyntaxError('End of file expected');
+ }
+ getToken();
+
+ // remove temporary default options
+ delete graph.node;
+ delete graph.edge;
+ delete graph.graph;
+
+ return graph;
+}
+
+/**
+ * Parse a list with statements.
+ * @param {Object} graph
+ */
+function parseStatements (graph) {
+ while (token !== '' && token != '}') {
+ parseStatement(graph);
+ if (token === ';') {
+ getToken();
+ }
+ }
+}
+
+/**
+ * Parse a single statement. Can be a an attribute statement, node
+ * statement, a series of node statements and edge statements, or a
+ * parameter.
+ * @param {Object} graph
+ */
+function parseStatement(graph) {
+ // parse subgraph
+ var subgraph = parseSubgraph(graph);
+ if (subgraph) {
+ // edge statements
+ parseEdge(graph, subgraph);
+
+ return;
+ }
+
+ // parse an attribute statement
+ var attr = parseAttributeStatement(graph);
+ if (attr) {
+ return;
+ }
+
+ // parse node
+ if (tokenType != TOKENTYPE.IDENTIFIER) {
+ throw newSyntaxError('Identifier expected');
+ }
+ var id = token; // id can be a string or a number
+ getToken();
+
+ if (token === '=') {
+ // id statement
+ getToken();
+ if (tokenType != TOKENTYPE.IDENTIFIER) {
+ throw newSyntaxError('Identifier expected');
+ }
+ graph[id] = token;
+ getToken();
+ // TODO: implement comma separated list with "a_list: ID=ID [','] [a_list] "
+ }
+ else {
+ parseNodeStatement(graph, id);
+ }
+}
+
+/**
+ * Parse a subgraph
+ * @param {Object} graph parent graph object
+ * @return {Object | null} subgraph
+ */
+function parseSubgraph (graph) {
+ var subgraph = null;
+
+ // optional subgraph keyword
+ if (token === 'subgraph') {
+ subgraph = {};
+ subgraph.type = 'subgraph';
+ getToken();
+
+ // optional graph id
+ if (tokenType === TOKENTYPE.IDENTIFIER) {
+ subgraph.id = token;
+ getToken();
+ }
+ }
+
+ // open angle bracket
+ if (token === '{') {
+ getToken();
+
+ if (!subgraph) {
+ subgraph = {};
+ }
+ subgraph.parent = graph;
+ subgraph.node = graph.node;
+ subgraph.edge = graph.edge;
+ subgraph.graph = graph.graph;
+
+ // statements
+ parseStatements(subgraph);
+
+ // close angle bracket
+ if (token != '}') {
+ throw newSyntaxError('Angle bracket } expected');
+ }
+ getToken();
+
+ // remove temporary default options
+ delete subgraph.node;
+ delete subgraph.edge;
+ delete subgraph.graph;
+ delete subgraph.parent;
+
+ // register at the parent graph
+ if (!graph.subgraphs) {
+ graph.subgraphs = [];
+ }
+ graph.subgraphs.push(subgraph);
+ }
+
+ return subgraph;
+}
+
+/**
+ * parse an attribute statement like "node [shape=circle fontSize=16]".
+ * Available keywords are 'node', 'edge', 'graph'.
+ * The previous list with default attributes will be replaced
+ * @param {Object} graph
+ * @returns {String | null} keyword Returns the name of the parsed attribute
+ * (node, edge, graph), or null if nothing
+ * is parsed.
+ */
+function parseAttributeStatement (graph) {
+ // attribute statements
+ if (token === 'node') {
+ getToken();
+
+ // node attributes
+ graph.node = parseAttributeList();
+ return 'node';
+ }
+ else if (token === 'edge') {
+ getToken();
+
+ // edge attributes
+ graph.edge = parseAttributeList();
+ return 'edge';
+ }
+ else if (token === 'graph') {
+ getToken();
+
+ // graph attributes
+ graph.graph = parseAttributeList();
+ return 'graph';
+ }
+
+ return null;
+}
+
+/**
+ * parse a node statement
+ * @param {Object} graph
+ * @param {string | number} id
+ */
+function parseNodeStatement(graph, id) {
+ // node statement
+ var node = {
+ id: id
+ };
+ var attr = parseAttributeList();
+ if (attr) {
+ node.attr = attr;
+ }
+ addNode(graph, node);
+
+ // edge statements
+ parseEdge(graph, id);
+}
+
+/**
+ * Parse an edge or a series of edges
+ * @param {Object} graph
+ * @param {string | number} from Id of the from node
+ */
+function parseEdge(graph, from) {
+ while (token === '->' || token === '--') {
+ var to;
+ var type = token;
+ getToken();
+
+ var subgraph = parseSubgraph(graph);
+ if (subgraph) {
+ to = subgraph;
+ }
+ else {
+ if (tokenType != TOKENTYPE.IDENTIFIER) {
+ throw newSyntaxError('Identifier or subgraph expected');
+ }
+ to = token;
+ addNode(graph, {
+ id: to
+ });
+ getToken();
+ }
+
+ // parse edge attributes
+ var attr = parseAttributeList();
+
+ // create edge
+ var edge = createEdge(graph, from, to, type, attr);
+ addEdge(graph, edge);
+
+ from = to;
+ }
+}
+
+/**
+ * Parse a set with attributes,
+ * for example [label="1.000", shape=solid]
+ * @return {Object | null} attr
+ */
+function parseAttributeList() {
+ var attr = null;
+
+ // edge styles of dot and vis
+ var edgeStyles = {
+ 'dashed': true,
+ 'solid': false,
+ 'dotted': [1, 5]
+ };
+
+ while (token === '[') {
+ getToken();
+ attr = {};
+ while (token !== '' && token != ']') {
+ if (tokenType != TOKENTYPE.IDENTIFIER) {
+ throw newSyntaxError('Attribute name expected');
+ }
+ var name = token;
+
+ getToken();
+ if (token != '=') {
+ throw newSyntaxError('Equal sign = expected');
+ }
+ getToken();
+
+ if (tokenType != TOKENTYPE.IDENTIFIER) {
+ throw newSyntaxError('Attribute value expected');
+ }
+ var value = token;
+
+ // convert from dot style to vis
+ if (name === 'style') {
+ value = edgeStyles[value];
+ }
+
+ // Define arrow types.
+ // vis.js currently supports types defined in 'arrowTypes'.
+ // Details of arrow shapes are described in
+ // http://www.graphviz.org/content/arrow-shapes
+ var arrowTypes = {
+ dot: 'circle',
+ box: 'box',
+ crow: 'crow',
+ curve: 'curve',
+ icurve: 'inv_curve',
+ normal: 'triangle',
+ inv: 'inv_triangle',
+ diamond: 'diamond',
+ tee: 'bar',
+ vee: 'vee'
+ };
+
+ if (name === 'arrowhead') {
+ var arrowType = arrowTypes[value];
+ name = 'arrows';
+ value = {to: {enabled:true, type: arrowType}};
+ }
+
+ setValue(attr, name, value); // name can be a path
+
+ getToken();
+ if (token ==',') {
+ getToken();
+ }
+ }
+
+ if (token != ']') {
+ throw newSyntaxError('Bracket ] expected');
+ }
+ getToken();
+ }
+
+ return attr;
+}
+
+/**
+ * Create a syntax error with extra information on current token and index.
+ * @param {string} message
+ * @returns {SyntaxError} err
+ */
+function newSyntaxError(message) {
+ return new SyntaxError(message + ', got "' + chop(token, 30) + '" (char ' + index + ')');
+}
+
+/**
+ * Chop off text after a maximum length
+ * @param {string} text
+ * @param {number} maxLength
+ * @returns {String}
+ */
+function chop (text, maxLength) {
+ return (text.length <= maxLength) ? text : (text.substr(0, 27) + '...');
+}
+
+/**
+ * Execute a function fn for each pair of elements in two arrays
+ * @param {Array | *} array1
+ * @param {Array | *} array2
+ * @param {function} fn
+ */
+function forEach2(array1, array2, fn) {
+ if (Array.isArray(array1)) {
+ array1.forEach(function (elem1) {
+ if (Array.isArray(array2)) {
+ array2.forEach(function (elem2) {
+ fn(elem1, elem2);
+ });
+ }
+ else {
+ fn(elem1, array2);
+ }
+ });
+ }
+ else {
+ if (Array.isArray(array2)) {
+ array2.forEach(function (elem2) {
+ fn(array1, elem2);
+ });
+ }
+ else {
+ fn(array1, array2);
+ }
+ }
+}
+
+/**
+ * Set a nested property on an object
+ * When nested objects are missing, they will be created.
+ * For example setProp({}, 'font.color', 'red') will return {font: {color: 'red'}}
+ * @param {Object} object
+ * @param {string} path A dot separated string like 'font.color'
+ * @param {*} value Value for the property
+ * @return {Object} Returns the original object, allows for chaining.
+ */
+function setProp(object, path, value) {
+ var names = path.split('.');
+ var prop = names.pop();
+
+ // traverse over the nested objects
+ var obj = object;
+ for (var i = 0; i < names.length; i++) {
+ var name = names[i];
+ if (!(name in obj)) {
+ obj[name] = {};
+ }
+ obj = obj[name];
+ }
+
+ // set the property value
+ obj[prop] = value;
+
+ return object;
+}
+
+/**
+ * Convert an object with DOT attributes to their vis.js equivalents.
+ * @param {Object} attr Object with DOT attributes
+ * @param {Object} mapping
+ * @return {Object} Returns an object with vis.js attributes
+ */
+function convertAttr (attr, mapping) {
+ var converted = {};
+
+ for (var prop in attr) {
+ if (attr.hasOwnProperty(prop)) {
+ var visProp = mapping[prop];
+ if (Array.isArray(visProp)) {
+ visProp.forEach(function (visPropI) {
+ setProp(converted, visPropI, attr[prop]);
+ })
+ }
+ else if (typeof visProp === 'string') {
+ setProp(converted, visProp, attr[prop]);
+ }
+ else {
+ setProp(converted, prop, attr[prop]);
+ }
+ }
+ }
+
+ return converted;
+}
+
+/**
+ * Convert a string containing a graph in DOT language into a map containing
+ * with nodes and edges in the format of graph.
+ * @param {string} data Text containing a graph in DOT-notation
+ * @return {Object} graphData
+ */
+function DOTToGraph (data) {
+ // parse the DOT file
+ var dotData = parseDOT(data);
+ var graphData = {
+ nodes: [],
+ edges: [],
+ options: {}
+ };
+
+ // copy the nodes
+ if (dotData.nodes) {
+ dotData.nodes.forEach(function (dotNode) {
+ var graphNode = {
+ id: dotNode.id,
+ label: String(dotNode.label || dotNode.id)
+ };
+ merge(graphNode, convertAttr(dotNode.attr, NODE_ATTR_MAPPING));
+ if (graphNode.image) {
+ graphNode.shape = 'image';
+ }
+ graphData.nodes.push(graphNode);
+ });
+ }
+
+ // copy the edges
+ if (dotData.edges) {
+ /**
+ * Convert an edge in DOT format to an edge with VisGraph format
+ * @param {Object} dotEdge
+ * @returns {Object} graphEdge
+ */
+ var convertEdge = function (dotEdge) {
+ var graphEdge = {
+ from: dotEdge.from,
+ to: dotEdge.to
+ };
+ merge(graphEdge, convertAttr(dotEdge.attr, EDGE_ATTR_MAPPING));
+
+ // Add arrows attribute to default styled arrow.
+ // The reason why default style is not added in parseAttributeList() is
+ // because only default is cleared before here.
+ if (graphEdge.arrows == null && dotEdge.type === '->') {
+ graphEdge.arrows = 'to';
+ }
+
+ return graphEdge;
+ };
+
+ dotData.edges.forEach(function (dotEdge) {
+ var from, to;
+ if (dotEdge.from instanceof Object) {
+ from = dotEdge.from.nodes;
+ }
+ else {
+ from = {
+ id: dotEdge.from
+ }
+ }
+
+ // TODO: support for attributes 'dir' (edge arrows)
+
+ if (dotEdge.to instanceof Object) {
+ to = dotEdge.to.nodes;
+ }
+ else {
+ to = {
+ id: dotEdge.to
+ }
+ }
+
+ if (dotEdge.from instanceof Object && dotEdge.from.edges) {
+ dotEdge.from.edges.forEach(function (subEdge) {
+ var graphEdge = convertEdge(subEdge);
+ graphData.edges.push(graphEdge);
+ });
+ }
+
+ forEach2(from, to, function (from, to) {
+ var subEdge = createEdge(graphData, from.id, to.id, dotEdge.type, dotEdge.attr);
+ var graphEdge = convertEdge(subEdge);
+ graphData.edges.push(graphEdge);
+ });
+
+ if (dotEdge.to instanceof Object && dotEdge.to.edges) {
+ dotEdge.to.edges.forEach(function (subEdge) {
+ var graphEdge = convertEdge(subEdge);
+ graphData.edges.push(graphEdge);
+ });
+ }
+ });
+ }
+
+ // copy the options
+ if (dotData.attr) {
+ graphData.options = dotData.attr;
+ }
+
+ return graphData;
+}
+
+// exports
+exports.parseDOT = parseDOT;
+exports.DOTToGraph = DOTToGraph;
diff --git a/lib/network/gephiParser.js b/lib/network/gephiParser.js
new file mode 100644
index 0000000000..807cffbc70
--- /dev/null
+++ b/lib/network/gephiParser.js
@@ -0,0 +1,71 @@
+/**
+ *
+ * @param {json} gephiJSON
+ * @param {obj} optionsObj
+ * @returns {{nodes: Array, edges: Array}}
+ */
+function parseGephi(gephiJSON, optionsObj) {
+ var edges = [];
+ var nodes = [];
+ var options = {
+ edges: {
+ inheritColor: false
+ },
+ nodes: {
+ fixed: false,
+ parseColor: false
+ }
+ };
+
+ if (optionsObj !== undefined) {
+ if (optionsObj.fixed !== undefined) {options.nodes.fixed = optionsObj.fixed}
+ if (optionsObj.parseColor !== undefined) {options.nodes.parseColor = optionsObj.parseColor}
+ if (optionsObj.inheritColor !== undefined) {options.edges.inheritColor = optionsObj.inheritColor}
+ }
+
+ var gEdges = gephiJSON.edges;
+ var gNodes = gephiJSON.nodes;
+ for (var i = 0; i < gEdges.length; i++) {
+ var edge = {};
+ var gEdge = gEdges[i];
+ edge['id'] = gEdge.id;
+ edge['from'] = gEdge.source;
+ edge['to'] = gEdge.target;
+ edge['attributes'] = gEdge.attributes;
+ edge['label'] = gEdge.label;
+ edge['title'] = gEdge.attributes !== undefined ? gEdge.attributes.title : undefined;
+ if (gEdge['type'] === 'Directed') {
+ edge['arrows'] = 'to';
+ }
+// edge['value'] = gEdge.attributes !== undefined ? gEdge.attributes.Weight : undefined;
+// edge['width'] = edge['value'] !== undefined ? undefined : edgegEdge.size;
+ if (gEdge.color && options.inheritColor === false) {
+ edge['color'] = gEdge.color;
+ }
+ edges.push(edge);
+ }
+
+ for (var j = 0; j < gNodes.length; j++) {
+ var node = {};
+ var gNode = gNodes[j];
+ node['id'] = gNode.id;
+ node['attributes'] = gNode.attributes;
+ node['x'] = gNode.x;
+ node['y'] = gNode.y;
+ node['label'] = gNode.label;
+ node['title'] = gNode.attributes !== undefined ? gNode.attributes.title : gNode.title;
+ if (options.nodes.parseColor === true) {
+ node['color'] = gNode.color;
+ }
+ else {
+ node['color'] = gNode.color !== undefined ? {background:gNode.color, border:gNode.color, highlight: {background:gNode.color, border:gNode.color}, hover:{background:gNode.color, border:gNode.color}} : undefined;
+ }
+ node['size'] = gNode.size;
+ node['fixed'] = options.nodes.fixed && gNode.x !== undefined && gNode.y !== undefined;
+ nodes.push(node);
+ }
+
+ return {nodes:nodes, edges:edges};
+}
+
+exports.parseGephi = parseGephi;
diff --git a/lib/network/img/acceptDeleteIcon.png b/lib/network/img/acceptDeleteIcon.png
new file mode 100644
index 0000000000..02a062852c
Binary files /dev/null and b/lib/network/img/acceptDeleteIcon.png differ
diff --git a/lib/network/img/addNodeIcon.png b/lib/network/img/addNodeIcon.png
new file mode 100644
index 0000000000..6fa30613f9
Binary files /dev/null and b/lib/network/img/addNodeIcon.png differ
diff --git a/lib/network/img/backIcon.png b/lib/network/img/backIcon.png
new file mode 100644
index 0000000000..e2f99126e5
Binary files /dev/null and b/lib/network/img/backIcon.png differ
diff --git a/lib/network/img/connectIcon.png b/lib/network/img/connectIcon.png
new file mode 100644
index 0000000000..4164da1f7a
Binary files /dev/null and b/lib/network/img/connectIcon.png differ
diff --git a/lib/network/img/cross.png b/lib/network/img/cross.png
new file mode 100644
index 0000000000..9cbd189ab6
Binary files /dev/null and b/lib/network/img/cross.png differ
diff --git a/lib/network/img/cross2.png b/lib/network/img/cross2.png
new file mode 100644
index 0000000000..9fc4b95c3e
Binary files /dev/null and b/lib/network/img/cross2.png differ
diff --git a/lib/network/img/deleteIcon.png b/lib/network/img/deleteIcon.png
new file mode 100644
index 0000000000..5402564791
Binary files /dev/null and b/lib/network/img/deleteIcon.png differ
diff --git a/lib/network/img/downArrow.png b/lib/network/img/downArrow.png
new file mode 100644
index 0000000000..e77d5e6d41
Binary files /dev/null and b/lib/network/img/downArrow.png differ
diff --git a/lib/network/img/editIcon.png b/lib/network/img/editIcon.png
new file mode 100644
index 0000000000..494d0f00c0
Binary files /dev/null and b/lib/network/img/editIcon.png differ
diff --git a/lib/network/img/leftArrow.png b/lib/network/img/leftArrow.png
new file mode 100644
index 0000000000..3823536e38
Binary files /dev/null and b/lib/network/img/leftArrow.png differ
diff --git a/lib/network/img/minus.png b/lib/network/img/minus.png
new file mode 100644
index 0000000000..30698076b9
Binary files /dev/null and b/lib/network/img/minus.png differ
diff --git a/lib/network/img/plus.png b/lib/network/img/plus.png
new file mode 100644
index 0000000000..f7ab2a334e
Binary files /dev/null and b/lib/network/img/plus.png differ
diff --git a/lib/network/img/rightArrow.png b/lib/network/img/rightArrow.png
new file mode 100644
index 0000000000..c3a209d8b0
Binary files /dev/null and b/lib/network/img/rightArrow.png differ
diff --git a/lib/network/img/upArrow.png b/lib/network/img/upArrow.png
new file mode 100644
index 0000000000..8aedced7fd
Binary files /dev/null and b/lib/network/img/upArrow.png differ
diff --git a/lib/network/img/zoomExtends.png b/lib/network/img/zoomExtends.png
new file mode 100644
index 0000000000..74595c6358
Binary files /dev/null and b/lib/network/img/zoomExtends.png differ
diff --git a/lib/network/locales.js b/lib/network/locales.js
new file mode 100644
index 0000000000..003497785c
--- /dev/null
+++ b/lib/network/locales.js
@@ -0,0 +1,165 @@
+// English
+exports['en'] = {
+ edit: 'Edit',
+ del: 'Delete selected',
+ back: 'Back',
+ addNode: 'Add Node',
+ addEdge: 'Add Edge',
+ editNode: 'Edit Node',
+ editEdge: 'Edit Edge',
+ addDescription: 'Click in an empty space to place a new node.',
+ edgeDescription: 'Click on a node and drag the edge to another node to connect them.',
+ editEdgeDescription: 'Click on the control points and drag them to a node to connect to it.',
+ createEdgeError: 'Cannot link edges to a cluster.',
+ deleteClusterError: 'Clusters cannot be deleted.',
+ editClusterError: 'Clusters cannot be edited.'
+};
+exports['en_EN'] = exports['en'];
+exports['en_US'] = exports['en'];
+
+// German
+exports['de'] = {
+ edit: 'Editieren',
+ del: 'L\u00f6sche Auswahl',
+ back: 'Zur\u00fcck',
+ addNode: 'Knoten hinzuf\u00fcgen',
+ addEdge: 'Kante hinzuf\u00fcgen',
+ editNode: 'Knoten editieren',
+ editEdge: 'Kante editieren',
+ addDescription: 'Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.',
+ edgeDescription: 'Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.',
+ editEdgeDescription: 'Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.',
+ createEdgeError: 'Es ist nicht m\u00f6glich, Kanten mit Clustern zu verbinden.',
+ deleteClusterError: 'Cluster k\u00f6nnen nicht gel\u00f6scht werden.',
+ editClusterError: 'Cluster k\u00f6nnen nicht editiert werden.'
+};
+exports['de_DE'] = exports['de'];
+
+// Spanish
+exports['es'] = {
+ edit: 'Editar',
+ del: 'Eliminar selecci\u00f3n',
+ back: 'Atr\u00e1s',
+ addNode: 'A\u00f1adir nodo',
+ addEdge: 'A\u00f1adir arista',
+ editNode: 'Editar nodo',
+ editEdge: 'Editar arista',
+ addDescription: 'Haga clic en un lugar vac\u00edo para colocar un nuevo nodo.',
+ edgeDescription: 'Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.',
+ editEdgeDescription: 'Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.',
+ createEdgeError: 'No se puede conectar una arista a un grupo.',
+ deleteClusterError: 'No es posible eliminar grupos.',
+ editClusterError: 'No es posible editar grupos.'
+};
+exports['es_ES'] = exports['es'];
+
+//Italiano
+exports['it'] = {
+ edit: 'Modifica',
+ del: 'Cancella la selezione',
+ back: 'Indietro',
+ addNode: 'Aggiungi un nodo',
+ addEdge: 'Aggiungi un vertice',
+ editNode: 'Modifica il nodo',
+ editEdge: 'Modifica il vertice',
+ addDescription: 'Clicca per aggiungere un nuovo nodo',
+ edgeDescription: 'Clicca su un nodo e trascinalo ad un altro nodo per connetterli.',
+ editEdgeDescription: 'Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.',
+ createEdgeError: 'Non si possono collegare vertici ad un cluster',
+ deleteClusterError: 'I cluster non possono essere cancellati',
+ editClusterError: 'I clusters non possono essere modificati.'
+};
+exports['it_IT'] = exports['it'];
+
+// Dutch
+exports['nl'] = {
+ edit: 'Wijzigen',
+ del: 'Selectie verwijderen',
+ back: 'Terug',
+ addNode: 'Node toevoegen',
+ addEdge: 'Link toevoegen',
+ editNode: 'Node wijzigen',
+ editEdge: 'Link wijzigen',
+ addDescription: 'Klik op een leeg gebied om een nieuwe node te maken.',
+ edgeDescription: 'Klik op een node en sleep de link naar een andere node om ze te verbinden.',
+ editEdgeDescription: 'Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.',
+ createEdgeError: 'Kan geen link maken naar een cluster.',
+ deleteClusterError: 'Clusters kunnen niet worden verwijderd.',
+ editClusterError: 'Clusters kunnen niet worden aangepast.'
+};
+exports['nl_NL'] = exports['nl'];
+exports['nl_BE'] = exports['nl'];
+
+// Portuguese Brazil
+exports['pt-br'] = {
+ edit: 'Editar',
+ del: 'Remover selecionado',
+ back: 'Voltar',
+ addNode: 'Adicionar nó',
+ addEdge: 'Adicionar aresta',
+ editNode: 'Editar nó',
+ editEdge: 'Editar aresta',
+ addDescription: 'Clique em um espaço em branco para adicionar um novo nó',
+ edgeDescription: 'Clique em um nó e arraste a aresta até outro nó para conectá-los',
+ editEdgeDescription: 'Clique nos pontos de controle e os arraste para um nó para conectá-los',
+ createEdgeError: 'Não foi possÃvel linkar arestas a um cluster.',
+ deleteClusterError: 'Clusters não puderam ser removidos.',
+ editClusterError: 'Clusters não puderam ser editados.'
+};
+exports['pt-BR'] = exports['pt-br'];
+exports['pt_BR'] = exports['pt-br'];
+exports['pt_br'] = exports['pt-br'];
+
+// Russian
+exports['ru'] = {
+ edit: 'Редактировать',
+ del: 'Удалить выбранное',
+ back: 'Ðазад',
+ addNode: 'Добавить узел',
+ addEdge: 'Добавить ребро',
+ editNode: 'Редактировать узел',
+ editEdge: 'Редактировать ребро',
+ addDescription: 'Кликните в Ñвободное меÑто, чтобы добавить новый узел.',
+ edgeDescription: 'Кликните на узел и протÑните ребро к другому узлу, чтобы Ñоединить их.',
+ editEdgeDescription: 'Кликните на контрольные точки и перетащите их в узел, чтобы подключитьÑÑ Ðº нему.',
+ createEdgeError: 'Ðевозможно Ñоединить ребра в клаÑтер.',
+ deleteClusterError: 'КлаÑтеры не могут быть удалены',
+ editClusterError: 'КлаÑтеры недоÑтупны Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.'
+};
+exports['ru_RU'] = exports['ru'];
+
+// Chinese
+exports['cn'] = {
+ edit: '编辑',
+ del: 'åˆ é™¤é€‰å®š',
+ back: '返回',
+ addNode: 'æ·»åŠ èŠ‚ç‚¹',
+ addEdge: 'æ·»åŠ è¿žæŽ¥çº¿',
+ editNode: '编辑节点',
+ editEdge: '编辑连接线',
+ addDescription: 'å•å‡»ç©ºç™½å¤„放置新节点。',
+ edgeDescription: 'å•å‡»æŸä¸ªèŠ‚点并将该连接线拖动到å¦ä¸€ä¸ªèŠ‚点以连接它们。',
+ editEdgeDescription: 'å•å‡»æŽ§åˆ¶èŠ‚点并将它们拖到节点上连接。',
+ createEdgeError: 'æ— æ³•å°†è¿žæŽ¥çº¿è¿žæŽ¥åˆ°ç¾¤é›†ã€‚',
+ deleteClusterError: 'æ— æ³•åˆ é™¤ç¾¤é›†ã€‚',
+ editClusterError: 'æ— æ³•ç¼–è¾‘ç¾¤é›†ã€‚'
+};
+exports['zh_CN'] = exports['cn'];
+
+// Ukrainian
+exports['uk'] = {
+ edit: 'Редагувати',
+ del: 'Видалити обране',
+ back: 'Ðазад',
+ addNode: 'Додати вузол',
+ addEdge: 'Додати край',
+ editNode: 'Редагувати вузол',
+ editEdge: 'Редагувати край',
+ addDescription: 'Kлікніть на вільне міÑце, щоб додати новий вузол.',
+ edgeDescription: 'Клікніть на вузол Ñ– перетÑгніть край до іншого вузла, щоб Ñ—Ñ… з\'єднати.',
+ editEdgeDescription: 'Клікніть на контрольні точки Ñ– перетÑгніть Ñ—Ñ… у вузол, щоб підключитиÑÑ Ð´Ð¾ нього.',
+ createEdgeError: 'Ðе можливо об\'єднати краї в групу.',
+ deleteClusterError: 'Групи не можуть бути видалені.',
+ editClusterError: 'Групи недоÑтупні Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ.'
+};
+exports['uk_UA'] = exports['uk'];
diff --git a/lib/network/modules/Canvas.js b/lib/network/modules/Canvas.js
new file mode 100644
index 0000000000..46305f38e8
--- /dev/null
+++ b/lib/network/modules/Canvas.js
@@ -0,0 +1,477 @@
+import Hammer from '../../module/hammer';
+import hammerUtil from '../../hammerUtil';
+
+import util from 'vis-util';
+
+/**
+ * Create the main frame for the Network.
+ * This function is executed once when a Network object is created. The frame
+ * contains a canvas, and this canvas contains all objects like the axis and
+ * nodes.
+ */
+class Canvas {
+ /**
+ * @param {Object} body
+ */
+ constructor(body) {
+ this.body = body;
+ this.pixelRatio = 1;
+ this.resizeTimer = undefined;
+ this.resizeFunction = this._onResize.bind(this);
+ this.cameraState = {};
+ this.initialized = false;
+ this.canvasViewCenter = {};
+
+ this.options = {};
+ this.defaultOptions = {
+ autoResize: true,
+ height: '100%',
+ width: '100%'
+ };
+ util.extend(this.options, this.defaultOptions);
+
+ this.bindEventListeners();
+ }
+
+ /**
+ * Binds event listeners
+ */
+ bindEventListeners() {
+ // bind the events
+ this.body.emitter.once("resize", (obj) => {
+ if (obj.width !== 0) {
+ this.body.view.translation.x = obj.width * 0.5;
+ }
+ if (obj.height !== 0) {
+ this.body.view.translation.y = obj.height * 0.5;
+ }
+ });
+ this.body.emitter.on("setSize", this.setSize.bind(this));
+ this.body.emitter.on("destroy", () => {
+ this.hammerFrame.destroy();
+ this.hammer.destroy();
+ this._cleanUp();
+ });
+ }
+
+ /**
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ let fields = ['width','height','autoResize'];
+ util.selectiveDeepExtend(fields,this.options, options);
+ }
+
+ if (this.options.autoResize === true) {
+ // automatically adapt to a changing size of the browser.
+ this._cleanUp();
+ this.resizeTimer = setInterval(() => {
+ let changed = this.setSize();
+ if (changed === true) {
+ this.body.emitter.emit("_requestRedraw");
+ }
+ }, 1000);
+ this.resizeFunction = this._onResize.bind(this);
+ util.addEventListener(window,'resize',this.resizeFunction);
+ }
+ }
+
+ /**
+ * @private
+ */
+ _cleanUp() {
+ // automatically adapt to a changing size of the browser.
+ if (this.resizeTimer !== undefined) {
+ clearInterval(this.resizeTimer);
+ }
+ util.removeEventListener(window,'resize',this.resizeFunction);
+ this.resizeFunction = undefined;
+ }
+
+ /**
+ * @private
+ */
+ _onResize() {
+ this.setSize();
+ this.body.emitter.emit("_redraw");
+ }
+
+ /**
+ * Get and store the cameraState
+ *
+ * @param {number} [pixelRatio=this.pixelRatio]
+ * @private
+ */
+ _getCameraState(pixelRatio = this.pixelRatio) {
+ if (this.initialized === true) {
+ this.cameraState.previousWidth = this.frame.canvas.width / pixelRatio;
+ this.cameraState.previousHeight = this.frame.canvas.height / pixelRatio;
+ this.cameraState.scale = this.body.view.scale;
+ this.cameraState.position = this.DOMtoCanvas({
+ x: 0.5 * this.frame.canvas.width / pixelRatio,
+ y: 0.5 * this.frame.canvas.height / pixelRatio
+ });
+ }
+ }
+
+ /**
+ * Set the cameraState
+ * @private
+ */
+ _setCameraState() {
+ if (this.cameraState.scale !== undefined &&
+ this.frame.canvas.clientWidth !== 0 &&
+ this.frame.canvas.clientHeight !== 0 &&
+ this.pixelRatio !== 0 &&
+ this.cameraState.previousWidth > 0) {
+
+ let widthRatio = (this.frame.canvas.width / this.pixelRatio) / this.cameraState.previousWidth;
+ let heightRatio = (this.frame.canvas.height / this.pixelRatio) / this.cameraState.previousHeight;
+ let newScale = this.cameraState.scale;
+
+ if (widthRatio != 1 && heightRatio != 1) {
+ newScale = this.cameraState.scale * 0.5 * (widthRatio + heightRatio);
+ }
+ else if (widthRatio != 1) {
+ newScale = this.cameraState.scale * widthRatio;
+ }
+ else if (heightRatio != 1) {
+ newScale = this.cameraState.scale * heightRatio;
+ }
+
+ this.body.view.scale = newScale;
+ // this comes from the view module.
+ var currentViewCenter = this.DOMtoCanvas({
+ x: 0.5 * this.frame.canvas.clientWidth,
+ y: 0.5 * this.frame.canvas.clientHeight
+ });
+
+ var distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node
+ x: currentViewCenter.x - this.cameraState.position.x,
+ y: currentViewCenter.y - this.cameraState.position.y
+ };
+ this.body.view.translation.x += distanceFromCenter.x * this.body.view.scale;
+ this.body.view.translation.y += distanceFromCenter.y * this.body.view.scale;
+ }
+ }
+
+ /**
+ *
+ * @param {number|string} value
+ * @returns {string}
+ * @private
+ */
+ _prepareValue(value) {
+ if (typeof value === 'number') {
+ return value + 'px';
+ }
+ else if (typeof value === 'string') {
+ if (value.indexOf('%') !== -1 || value.indexOf('px') !== -1) {
+ return value;
+ }
+ else if (value.indexOf('%') === -1) {
+ return value + 'px';
+ }
+ }
+ throw new Error('Could not use the value supplied for width or height:' + value);
+ }
+
+
+ /**
+ * Create the HTML
+ */
+ _create() {
+ // remove all elements from the container element.
+ while (this.body.container.hasChildNodes()) {
+ this.body.container.removeChild(this.body.container.firstChild);
+ }
+
+ this.frame = document.createElement('div');
+ this.frame.className = 'vis-network';
+ this.frame.style.position = 'relative';
+ this.frame.style.overflow = 'hidden';
+ this.frame.tabIndex = 900; // tab index is required for keycharm to bind keystrokes to the div instead of the window
+
+ //////////////////////////////////////////////////////////////////
+
+ this.frame.canvas = document.createElement("canvas");
+ this.frame.canvas.style.position = 'relative';
+ this.frame.appendChild(this.frame.canvas);
+
+ if (!this.frame.canvas.getContext) {
+ let noCanvas = document.createElement( 'DIV' );
+ noCanvas.style.color = 'red';
+ noCanvas.style.fontWeight = 'bold' ;
+ noCanvas.style.padding = '10px';
+ noCanvas.innerHTML = 'Error: your browser does not support HTML canvas';
+ this.frame.canvas.appendChild(noCanvas);
+ }
+ else {
+ this._setPixelRatio();
+ this.setTransform();
+ }
+
+ // add the frame to the container element
+ this.body.container.appendChild(this.frame);
+
+ this.body.view.scale = 1;
+ this.body.view.translation = {x: 0.5 * this.frame.canvas.clientWidth,y: 0.5 * this.frame.canvas.clientHeight};
+
+ this._bindHammer();
+ }
+
+
+ /**
+ * This function binds hammer, it can be repeated over and over due to the uniqueness check.
+ * @private
+ */
+ _bindHammer() {
+ if (this.hammer !== undefined) {
+ this.hammer.destroy();
+ }
+ this.drag = {};
+ this.pinch = {};
+
+ // init hammer
+ this.hammer = new Hammer(this.frame.canvas);
+ this.hammer.get('pinch').set({enable: true});
+ // enable to get better response, todo: test on mobile.
+ this.hammer.get('pan').set({threshold:5, direction: Hammer.DIRECTION_ALL});
+
+ hammerUtil.onTouch(this.hammer, (event) => {this.body.eventListeners.onTouch(event)});
+ this.hammer.on('tap', (event) => {this.body.eventListeners.onTap(event)});
+ this.hammer.on('doubletap', (event) => {this.body.eventListeners.onDoubleTap(event)});
+ this.hammer.on('press', (event) => {this.body.eventListeners.onHold(event)});
+ this.hammer.on('panstart', (event) => {this.body.eventListeners.onDragStart(event)});
+ this.hammer.on('panmove', (event) => {this.body.eventListeners.onDrag(event)});
+ this.hammer.on('panend', (event) => {this.body.eventListeners.onDragEnd(event)});
+ this.hammer.on('pinch', (event) => {this.body.eventListeners.onPinch(event)});
+
+ // TODO: neatly cleanup these handlers when re-creating the Canvas, IF these are done with hammer, event.stopPropagation will not work?
+ this.frame.canvas.addEventListener('mousewheel', (event) => {this.body.eventListeners.onMouseWheel(event)});
+ this.frame.canvas.addEventListener('DOMMouseScroll', (event) => {this.body.eventListeners.onMouseWheel(event)});
+
+ this.frame.canvas.addEventListener('mousemove', (event) => {this.body.eventListeners.onMouseMove(event)});
+ this.frame.canvas.addEventListener('contextmenu', (event) => {this.body.eventListeners.onContext(event)});
+
+ this.hammerFrame = new Hammer(this.frame);
+ hammerUtil.onRelease(this.hammerFrame, (event) => {this.body.eventListeners.onRelease(event)});
+ }
+
+
+ /**
+ * Set a new size for the network
+ * @param {string} width Width in pixels or percentage (for example '800px'
+ * or '50%')
+ * @param {string} height Height in pixels or percentage (for example '400px'
+ * or '30%')
+ * @returns {boolean}
+ */
+ setSize(width = this.options.width, height = this.options.height) {
+ width = this._prepareValue(width);
+ height= this._prepareValue(height);
+
+ let emitEvent = false;
+ let oldWidth = this.frame.canvas.width;
+ let oldHeight = this.frame.canvas.height;
+
+ // update the pixel ratio
+ //
+ // NOTE: Comment in following is rather inconsistent; this is the ONLY place in the code
+ // where it is assumed that the pixel ratio could change at runtime.
+ // The only way I can think of this happening is a rotating screen or tablet; but then
+ // there should be a mechanism for reloading the data (TODO: check if this is present).
+ //
+ // If the assumption is true (i.e. pixel ratio can change at runtime), then *all* usage
+ // of pixel ratio must be overhauled for this.
+ //
+ // For the time being, I will humor the assumption here, and in the rest of the code assume it is
+ // constant.
+ let previousRatio = this.pixelRatio; // we cache this because the camera state storage needs the old value
+ this._setPixelRatio();
+
+ if (width != this.options.width || height != this.options.height || this.frame.style.width != width || this.frame.style.height != height) {
+ this._getCameraState(previousRatio);
+
+ this.frame.style.width = width;
+ this.frame.style.height = height;
+
+ this.frame.canvas.style.width = '100%';
+ this.frame.canvas.style.height = '100%';
+
+ this.frame.canvas.width = Math.round(this.frame.canvas.clientWidth * this.pixelRatio);
+ this.frame.canvas.height = Math.round(this.frame.canvas.clientHeight * this.pixelRatio);
+
+ this.options.width = width;
+ this.options.height = height;
+
+ this.canvasViewCenter = {
+ x: 0.5 * this.frame.clientWidth,
+ y: 0.5 * this.frame.clientHeight
+ };
+
+ emitEvent = true;
+ }
+ else {
+ // this would adapt the width of the canvas to the width from 100% if and only if
+ // there is a change.
+
+ let newWidth = Math.round(this.frame.canvas.clientWidth * this.pixelRatio);
+ let newHeight = Math.round(this.frame.canvas.clientHeight * this.pixelRatio);
+
+ // store the camera if there is a change in size.
+ if (this.frame.canvas.width !== newWidth || this.frame.canvas.height !== newHeight) {
+ this._getCameraState(previousRatio);
+ }
+
+ if (this.frame.canvas.width !== newWidth) {
+ this.frame.canvas.width = newWidth;
+ emitEvent = true;
+ }
+ if (this.frame.canvas.height !== newHeight) {
+ this.frame.canvas.height = newHeight;
+ emitEvent = true;
+ }
+ }
+
+ if (emitEvent === true) {
+ this.body.emitter.emit('resize', {
+ width : Math.round(this.frame.canvas.width / this.pixelRatio),
+ height : Math.round(this.frame.canvas.height / this.pixelRatio),
+ oldWidth : Math.round(oldWidth / this.pixelRatio),
+ oldHeight: Math.round(oldHeight / this.pixelRatio)
+ });
+
+ // restore the camera on change.
+ this._setCameraState();
+ }
+
+
+ // set initialized so the get and set camera will work from now on.
+ this.initialized = true;
+ return emitEvent;
+ }
+
+ /**
+ *
+ * @returns {CanvasRenderingContext2D}
+ */
+ getContext() {
+ return this.frame.canvas.getContext("2d");
+ }
+
+ /**
+ * Determine the pixel ratio for various browsers.
+ *
+ * @returns {number}
+ * @private
+ */
+ _determinePixelRatio() {
+ let ctx = this.getContext();
+ if (ctx === undefined) {
+ throw new Error("Could not get canvax context");
+ }
+
+ var numerator = 1;
+ if(typeof window !== 'undefined') { // (window !== undefined) doesn't work here!
+ // Protection during unit tests, where 'window' can be missing
+ numerator = (window.devicePixelRatio || 1);
+ }
+
+ var denominator = (ctx.webkitBackingStorePixelRatio ||
+ ctx.mozBackingStorePixelRatio ||
+ ctx.msBackingStorePixelRatio ||
+ ctx.oBackingStorePixelRatio ||
+ ctx.backingStorePixelRatio || 1);
+
+ return numerator / denominator;
+ }
+
+ /**
+ * Lazy determination of pixel ratio.
+ *
+ * @private
+ */
+ _setPixelRatio() {
+ this.pixelRatio = this._determinePixelRatio();
+ }
+
+ /**
+ * Set the transform in the contained context, based on its pixelRatio
+ */
+ setTransform() {
+ let ctx = this.getContext();
+ if (ctx === undefined) {
+ throw new Error("Could not get canvax context");
+ }
+
+ ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);
+ }
+
+
+ /**
+ * Convert the X coordinate in DOM-space (coordinate point in browser relative to the container div) to
+ * the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon)
+ * @param {number} x
+ * @returns {number}
+ * @private
+ */
+ _XconvertDOMtoCanvas(x) {
+ return (x - this.body.view.translation.x) / this.body.view.scale;
+ }
+
+ /**
+ * Convert the X coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to
+ * the X coordinate in DOM-space (coordinate point in browser relative to the container div)
+ * @param {number} x
+ * @returns {number}
+ * @private
+ */
+ _XconvertCanvasToDOM(x) {
+ return x * this.body.view.scale + this.body.view.translation.x;
+ }
+
+ /**
+ * Convert the Y coordinate in DOM-space (coordinate point in browser relative to the container div) to
+ * the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon)
+ * @param {number} y
+ * @returns {number}
+ * @private
+ */
+ _YconvertDOMtoCanvas(y) {
+ return (y - this.body.view.translation.y) / this.body.view.scale;
+ }
+
+ /**
+ * Convert the Y coordinate in canvas-space (the simulation sandbox, which the camera looks upon) to
+ * the Y coordinate in DOM-space (coordinate point in browser relative to the container div)
+ * @param {number} y
+ * @returns {number}
+ * @private
+ */
+ _YconvertCanvasToDOM(y) {
+ return y * this.body.view.scale + this.body.view.translation.y;
+ }
+
+
+ /**
+ * @param {point} pos
+ * @returns {point}
+ */
+ canvasToDOM (pos) {
+ return {x: this._XconvertCanvasToDOM(pos.x), y: this._YconvertCanvasToDOM(pos.y)};
+ }
+
+ /**
+ *
+ * @param {point} pos
+ * @returns {point}
+ */
+ DOMtoCanvas (pos) {
+ return {x: this._XconvertDOMtoCanvas(pos.x), y: this._YconvertDOMtoCanvas(pos.y)};
+ }
+
+}
+
+export default Canvas;
diff --git a/lib/network/modules/CanvasRenderer.js b/lib/network/modules/CanvasRenderer.js
new file mode 100644
index 0000000000..14e15a93bf
--- /dev/null
+++ b/lib/network/modules/CanvasRenderer.js
@@ -0,0 +1,410 @@
+/**
+ * Initializes window.requestAnimationFrame() to a usable form.
+ *
+ * Specifically, set up this method for the case of running on node.js with jsdom enabled.
+ *
+ * NOTES:
+ *
+ * * On node.js, when calling this directly outside of this class, `window` is not defined.
+ * This happens even if jsdom is used.
+ * * For node.js + jsdom, `window` is available at the moment the constructor is called.
+ * For this reason, the called is placed within the constructor.
+ * * Even then, `window.requestAnimationFrame()` is not defined, so it still needs to be added.
+ * * During unit testing, it happens that the window object is reset during execution, causing
+ * a runtime error due to missing `requestAnimationFrame()`. This needs to be compensated for,
+ * see `_requestNextFrame()`.
+ * * Since this is a global object, it may affect other modules besides `Network`. With normal
+ * usage, this does not cause any problems. During unit testing, errors may occur. These have
+ * been compensated for, see comment block in _requestNextFrame().
+ *
+ * @private
+ */
+function _initRequestAnimationFrame() {
+ var func;
+
+ if (window !== undefined) {
+ func = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame;
+ }
+
+ if (func === undefined) {
+ // window or method not present, setting mock requestAnimationFrame
+ window.requestAnimationFrame =
+ function(callback) {
+ //console.log("Called mock requestAnimationFrame");
+ callback();
+ }
+ } else {
+ window.requestAnimationFrame = func;
+ }
+}
+
+import util from 'vis-util';
+
+/**
+ * The canvas renderer
+ */
+class CanvasRenderer {
+ /**
+ * @param {Object} body
+ * @param {Canvas} canvas
+ */
+ constructor(body, canvas) {
+ _initRequestAnimationFrame();
+ this.body = body;
+ this.canvas = canvas;
+
+ this.redrawRequested = false;
+ this.renderTimer = undefined;
+ this.requiresTimeout = true;
+ this.renderingActive = false;
+ this.renderRequests = 0;
+ this.allowRedraw = true;
+
+ this.dragging = false;
+ this.options = {};
+ this.defaultOptions = {
+ hideEdgesOnDrag: false,
+ hideNodesOnDrag: false
+ };
+ util.extend(this.options, this.defaultOptions);
+
+ this._determineBrowserMethod();
+ this.bindEventListeners();
+ }
+
+ /**
+ * Binds event listeners
+ */
+ bindEventListeners() {
+ this.body.emitter.on("dragStart", () => { this.dragging = true; });
+ this.body.emitter.on("dragEnd", () => { this.dragging = false; });
+ this.body.emitter.on("_resizeNodes", () => { this._resizeNodes(); });
+ this.body.emitter.on("_redraw", () => {
+ if (this.renderingActive === false) {
+ this._redraw();
+ }
+ });
+ this.body.emitter.on("_blockRedraw", () => {this.allowRedraw = false;});
+ this.body.emitter.on("_allowRedraw", () => {this.allowRedraw = true; this.redrawRequested = false;});
+ this.body.emitter.on("_requestRedraw", this._requestRedraw.bind(this));
+ this.body.emitter.on("_startRendering", () => {
+ this.renderRequests += 1;
+ this.renderingActive = true;
+ this._startRendering();
+ });
+ this.body.emitter.on("_stopRendering", () => {
+ this.renderRequests -= 1;
+ this.renderingActive = this.renderRequests > 0;
+ this.renderTimer = undefined;
+ });
+ this.body.emitter.on('destroy', () => {
+ this.renderRequests = 0;
+ this.allowRedraw = false;
+ this.renderingActive = false;
+ if (this.requiresTimeout === true) {
+ clearTimeout(this.renderTimer);
+ }
+ else {
+ window.cancelAnimationFrame(this.renderTimer);
+ }
+ this.body.emitter.off();
+ });
+
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ let fields = ['hideEdgesOnDrag','hideNodesOnDrag'];
+ util.selectiveDeepExtend(fields,this.options, options);
+ }
+ }
+
+
+ /**
+ * Prepare the drawing of the next frame.
+ *
+ * Calls the callback when the next frame can or will be drawn.
+ *
+ * @param {function} callback
+ * @param {number} delay - timeout case only, wait this number of milliseconds
+ * @returns {function|undefined}
+ * @private
+ */
+ _requestNextFrame(callback, delay) {
+ // During unit testing, it happens that the mock window object is reset while
+ // the next frame is still pending. Then, either 'window' is not present, or
+ // 'requestAnimationFrame()' is not present because it is not defined on the
+ // mock window object.
+ //
+ // As a consequence, unrelated unit tests may appear to fail, even if the problem
+ // described happens in the current unit test.
+ //
+ // This is not something that will happen in normal operation, but we still need
+ // to take it into account.
+ //
+ if (typeof window === 'undefined') return; // Doing `if (window === undefined)` does not work here!
+
+ let timer;
+
+ var myWindow = window; // Grab a reference to reduce the possibility that 'window' is reset
+ // while running this method.
+
+ if (this.requiresTimeout === true) {
+ // wait given number of milliseconds and perform the animation step function
+ timer = myWindow.setTimeout(callback, delay);
+ } else {
+ if (myWindow.requestAnimationFrame) {
+ timer = myWindow.requestAnimationFrame(callback);
+ }
+ }
+
+ return timer;
+ }
+
+ /**
+ *
+ * @private
+ */
+ _startRendering() {
+ if (this.renderingActive === true) {
+ if (this.renderTimer === undefined) {
+ this.renderTimer = this._requestNextFrame(this._renderStep.bind(this), this.simulationInterval);
+ }
+ }
+ }
+
+ /**
+ *
+ * @private
+ */
+ _renderStep() {
+ if (this.renderingActive === true) {
+ // reset the renderTimer so a new scheduled animation step can be set
+ this.renderTimer = undefined;
+
+ if (this.requiresTimeout === true) {
+ // this schedules a new simulation step
+ this._startRendering();
+ }
+
+ this._redraw();
+
+ if (this.requiresTimeout === false) {
+ // this schedules a new simulation step
+ this._startRendering();
+ }
+ }
+ }
+
+ /**
+ * Redraw the network with the current data
+ * chart will be resized too.
+ */
+ redraw() {
+ this.body.emitter.emit('setSize');
+ this._redraw();
+ }
+
+ /**
+ * Redraw the network with the current data
+ * @private
+ */
+ _requestRedraw() {
+ if (this.redrawRequested !== true && this.renderingActive === false && this.allowRedraw === true) {
+ this.redrawRequested = true;
+ this._requestNextFrame(() => {this._redraw(false);}, 0);
+ }
+ }
+
+ /**
+ * Redraw the network with the current data
+ * @param {boolean} [hidden=false] | Used to get the first estimate of the node sizes.
+ * Only the nodes are drawn after which they are quickly drawn over.
+ * @private
+ */
+ _redraw(hidden = false) {
+ if (this.allowRedraw === true) {
+ this.body.emitter.emit("initRedraw");
+
+ this.redrawRequested = false;
+
+ // when the container div was hidden, this fixes it back up!
+ if (this.canvas.frame.canvas.width === 0 || this.canvas.frame.canvas.height === 0) {
+ this.canvas.setSize();
+ }
+
+ this.canvas.setTransform();
+
+ let ctx = this.canvas.getContext();
+
+ // clear the canvas
+ let w = this.canvas.frame.canvas.clientWidth;
+ let h = this.canvas.frame.canvas.clientHeight;
+ ctx.clearRect(0, 0, w, h);
+
+ // if the div is hidden, we stop the redraw here for performance.
+ if (this.canvas.frame.clientWidth === 0) {
+ return;
+ }
+
+ // set scaling and translation
+ ctx.save();
+ ctx.translate(this.body.view.translation.x, this.body.view.translation.y);
+ ctx.scale(this.body.view.scale, this.body.view.scale);
+
+ ctx.beginPath();
+ this.body.emitter.emit("beforeDrawing", ctx);
+ ctx.closePath();
+
+ if (hidden === false) {
+ if (this.dragging === false || (this.dragging === true && this.options.hideEdgesOnDrag === false)) {
+ this._drawEdges(ctx);
+ }
+ }
+
+ if (this.dragging === false || (this.dragging === true && this.options.hideNodesOnDrag === false)) {
+ this._drawNodes(ctx, hidden);
+ }
+
+ ctx.beginPath();
+ this.body.emitter.emit("afterDrawing", ctx);
+ ctx.closePath();
+
+
+ // restore original scaling and translation
+ ctx.restore();
+ if (hidden === true) {
+ ctx.clearRect(0, 0, w, h);
+ }
+ }
+ }
+
+
+ /**
+ * Redraw all nodes
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} [alwaysShow]
+ * @private
+ */
+ _resizeNodes() {
+ this.canvas.setTransform();
+ let ctx = this.canvas.getContext();
+ ctx.save();
+ ctx.translate(this.body.view.translation.x, this.body.view.translation.y);
+ ctx.scale(this.body.view.scale, this.body.view.scale);
+
+ let nodes = this.body.nodes;
+ let node;
+
+ // resize all nodes
+ for (let nodeId in nodes) {
+ if (nodes.hasOwnProperty(nodeId)) {
+ node = nodes[nodeId];
+ node.resize(ctx);
+ node.updateBoundingBox(ctx, node.selected);
+ }
+ }
+
+ // restore original scaling and translation
+ ctx.restore();
+ }
+
+ /**
+ * Redraw all nodes
+ *
+ * @param {CanvasRenderingContext2D} ctx 2D context of a HTML canvas
+ * @param {boolean} [alwaysShow]
+ * @private
+ */
+ _drawNodes(ctx, alwaysShow = false) {
+ let nodes = this.body.nodes;
+ let nodeIndices = this.body.nodeIndices;
+ let node;
+ let selected = [];
+ let margin = 20;
+ let topLeft = this.canvas.DOMtoCanvas({x:-margin,y:-margin});
+ let bottomRight = this.canvas.DOMtoCanvas({
+ x: this.canvas.frame.canvas.clientWidth+margin,
+ y: this.canvas.frame.canvas.clientHeight+margin
+ });
+ let viewableArea = {top:topLeft.y,left:topLeft.x,bottom:bottomRight.y,right:bottomRight.x};
+
+ // draw unselected nodes;
+ for (let i = 0; i < nodeIndices.length; i++) {
+ node = nodes[nodeIndices[i]];
+ // set selected nodes aside
+ if (node.isSelected()) {
+ selected.push(nodeIndices[i]);
+ }
+ else {
+ if (alwaysShow === true) {
+ node.draw(ctx);
+ }
+ else if (node.isBoundingBoxOverlappingWith(viewableArea) === true) {
+ node.draw(ctx);
+ }
+ else {
+ node.updateBoundingBox(ctx, node.selected);
+ }
+ }
+ }
+
+ // draw the selected nodes on top
+ for (let i = 0; i < selected.length; i++) {
+ node = nodes[selected[i]];
+ node.draw(ctx);
+ }
+ }
+
+
+ /**
+ * Redraw all edges
+ * @param {CanvasRenderingContext2D} ctx 2D context of a HTML canvas
+ * @private
+ */
+ _drawEdges(ctx) {
+ let edges = this.body.edges;
+ let edgeIndices = this.body.edgeIndices;
+ let edge;
+
+ for (let i = 0; i < edgeIndices.length; i++) {
+ edge = edges[edgeIndices[i]];
+ if (edge.connected === true) {
+ edge.draw(ctx);
+ }
+ }
+ }
+
+ /**
+ * Determine if the browser requires a setTimeout or a requestAnimationFrame. This was required because
+ * some implementations (safari and IE9) did not support requestAnimationFrame
+ * @private
+ */
+ _determineBrowserMethod() {
+ if (typeof window !== 'undefined') {
+ let browserType = navigator.userAgent.toLowerCase();
+ this.requiresTimeout = false;
+ if (browserType.indexOf('msie 9.0') != -1) { // IE 9
+ this.requiresTimeout = true;
+ }
+ else if (browserType.indexOf('safari') != -1) { // safari
+ if (browserType.indexOf('chrome') <= -1) {
+ this.requiresTimeout = true;
+ }
+ }
+ }
+ else {
+ this.requiresTimeout = true;
+ }
+ }
+}
+
+export default CanvasRenderer;
diff --git a/lib/network/modules/Clustering.js b/lib/network/modules/Clustering.js
new file mode 100644
index 0000000000..5da3932b1d
--- /dev/null
+++ b/lib/network/modules/Clustering.js
@@ -0,0 +1,1446 @@
+/* ===========================================================================
+
+# TODO
+
+- `edgeReplacedById` not cleaned up yet on cluster edge removal
+- allowSingleNodeCluster could be a global option as well; currently needs to always
+ be passed to clustering methods
+
+----------------------------------------------
+
+# State Model for Clustering
+
+The total state for clustering is non-trivial. It is useful to have a model
+available as to how it works. The following documents the relevant state items.
+
+
+## Network State
+
+The following `network`-members are relevant to clustering:
+
+- `body.nodes` - all nodes actively participating in the network
+- `body.edges` - same for edges
+- `body.nodeIndices` - id's of nodes that are visible at a given moment
+- `body.edgeIndices` - same for edges
+
+This includes:
+
+- helper nodes for dragging in `manipulation`
+- helper nodes for edge type `dynamic`
+- cluster nodes and edges
+- there may be more than this.
+
+A node/edge may be missing in the `Indices` member if:
+
+- it is a helper node
+- the node or edge state has option `hidden` set
+- It is not visible due to clustering
+
+
+## Clustering State
+
+For the hashes, the id's of the nodes/edges are used as key.
+
+Member `network.clustering` contains the following items:
+
+- `clusteredNodes` - hash with values: { clusterId: , node: }
+- `clusteredEdges` - hash with values: restore information for given edge
+
+
+Due to nesting of clusters, these members can contain cluster nodes and edges as well.
+
+The important thing to note here, is that the clustered nodes and edges also
+appear in the members of the cluster nodes. For data update, it is therefore
+important to scan these lists as well as the cluster nodes.
+
+
+### Cluster Node
+
+A cluster node has the following extra fields:
+
+- `isCluster : true` - indication that this is a cluster node
+- `containedNodes` - hash of nodes contained in this cluster
+- `containedEdges` - same for edges
+- `edges` - array of cluster edges for this node
+
+
+**NOTE:**
+
+- `containedEdges` can also contain edges which are not clustered; e.g. an edge
+ connecting two nodes in the same cluster.
+
+
+### Cluster Edge
+
+These are the items in the `edges` member of a clustered node. They have the
+following relevant members:
+
+- 'clusteringEdgeReplacingIds` - array of id's of edges replaced by this edge
+
+Note that it's possible to nest clusters, so that `clusteringEdgeReplacingIds`
+can contain edge id's of other clusters.
+
+
+### Clustered Edge
+
+This is any edge contained by a cluster edge. It gets the following additional
+member:
+
+- `edgeReplacedById` - id of the cluster edge in which current edge is clustered
+
+
+ =========================================================================== */
+import util from 'vis-util';
+import NetworkUtil from'../NetworkUtil';
+import Cluster from'./components/nodes/Cluster';
+import Edge from './components/Edge'; // Only needed for check on type!
+import Node from './components/Node'; // Only needed for check on type!
+
+/**
+ * The clustering engine
+ */
+class ClusterEngine {
+ /**
+ * @param {Object} body
+ */
+ constructor(body) {
+ this.body = body;
+ this.clusteredNodes = {}; // key: node id, value: { clusterId: , node: }
+ this.clusteredEdges = {}; // key: edge id, value: restore information for given edge
+
+ this.options = {};
+ this.defaultOptions = {};
+ util.extend(this.options, this.defaultOptions);
+
+ this.body.emitter.on('_resetData', () => {this.clusteredNodes = {}; this.clusteredEdges = {};})
+ }
+
+ /**
+ *
+ * @param {number} hubsize
+ * @param {Object} options
+ */
+ clusterByHubsize(hubsize, options) {
+ if (hubsize === undefined) {
+ hubsize = this._getHubSize();
+ }
+ else if (typeof(hubsize) === "object") {
+ options = this._checkOptions(hubsize);
+ hubsize = this._getHubSize();
+ }
+
+ let nodesToCluster = [];
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ let node = this.body.nodes[this.body.nodeIndices[i]];
+ if (node.edges.length >= hubsize) {
+ nodesToCluster.push(node.id);
+ }
+ }
+
+ for (let i = 0; i < nodesToCluster.length; i++) {
+ this.clusterByConnection(nodesToCluster[i],options,true);
+ }
+
+ this.body.emitter.emit('_dataChanged');
+ }
+
+
+ /**
+ * loop over all nodes, check if they adhere to the condition and cluster if needed.
+ * @param {Object} options
+ * @param {boolean} [refreshData=true]
+ */
+ cluster(options = {}, refreshData = true) {
+ if (options.joinCondition === undefined) {throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");}
+
+ // check if the options object is fine, append if needed
+ options = this._checkOptions(options);
+
+ let childNodesObj = {};
+ let childEdgesObj = {};
+
+ // collect the nodes that will be in the cluster
+ util.forEach(this.body.nodes, (node, nodeId) => {
+ if (node.options && options.joinCondition(node.options) === true) {
+ childNodesObj[nodeId] = node;
+
+ // collect the edges that will be in the cluster
+ util.forEach(node.edges, (edge) => {
+ if (this.clusteredEdges[edge.id] === undefined) {
+ childEdgesObj[edge.id] = edge;
+ }
+ });
+ }
+ });
+
+ this._cluster(childNodesObj, childEdgesObj, options, refreshData);
+ }
+
+
+ /**
+ * Cluster all nodes in the network that have only X edges
+ * @param {number} edgeCount
+ * @param {Object} options
+ * @param {boolean} [refreshData=true]
+ */
+ clusterByEdgeCount(edgeCount, options, refreshData = true) {
+ options = this._checkOptions(options);
+ let clusters = [];
+ let usedNodes = {};
+ let edge, edges, relevantEdgeCount;
+ // collect the nodes that will be in the cluster
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ let childNodesObj = {};
+ let childEdgesObj = {};
+ let nodeId = this.body.nodeIndices[i];
+ let node = this.body.nodes[nodeId];
+
+ // if this node is already used in another cluster this session, we do not have to re-evaluate it.
+ if (usedNodes[nodeId] === undefined) {
+ relevantEdgeCount = 0;
+ edges = [];
+ for (let j = 0; j < node.edges.length; j++) {
+ edge = node.edges[j];
+ if (this.clusteredEdges[edge.id] === undefined) {
+ if (edge.toId !== edge.fromId) {
+ relevantEdgeCount++;
+ }
+ edges.push(edge);
+ }
+ }
+
+ // this node qualifies, we collect its neighbours to start the clustering process.
+ if (relevantEdgeCount === edgeCount) {
+ var checkJoinCondition = function(node) {
+ if (options.joinCondition === undefined || options.joinCondition === null) {
+ return true;
+ }
+
+ let clonedOptions = NetworkUtil.cloneOptions(node);
+ return options.joinCondition(clonedOptions);
+ }
+
+ let gatheringSuccessful = true;
+ for (let j = 0; j < edges.length; j++) {
+ edge = edges[j];
+ let childNodeId = this._getConnectedId(edge, nodeId);
+ // add the nodes to the list by the join condition.
+ if (checkJoinCondition(node)) {
+ childEdgesObj[edge.id] = edge;
+ childNodesObj[nodeId] = node;
+ childNodesObj[childNodeId] = this.body.nodes[childNodeId];
+ usedNodes[nodeId] = true;
+ } else {
+ // this node does not qualify after all.
+ gatheringSuccessful = false;
+ break;
+ }
+ }
+
+ // add to the cluster queue
+ if (Object.keys(childNodesObj).length > 0 && Object.keys(childEdgesObj).length > 0 && gatheringSuccessful === true) {
+ /**
+ * Search for cluster data that contains any of the node id's
+ * @returns {Boolean} true if no joinCondition, otherwise return value of joinCondition
+ */
+ var findClusterData = function() {
+ for (let n = 0; n < clusters.length; ++n) {
+ // Search for a cluster containing any of the node id's
+ for (var m in childNodesObj) {
+ if (clusters[n].nodes[m] !== undefined) {
+ return clusters[n];
+ }
+ }
+ }
+
+ return undefined;
+ };
+
+
+ // If any of the found nodes is part of a cluster found in this method,
+ // add the current values to that cluster
+ var foundCluster = findClusterData();
+ if (foundCluster !== undefined) {
+ // Add nodes to found cluster if not present
+ for (let m in childNodesObj) {
+ if (foundCluster.nodes[m] === undefined) {
+ foundCluster.nodes[m] = childNodesObj[m];
+ }
+ }
+
+ // Add edges to found cluster, if not present
+ for (let m in childEdgesObj) {
+ if (foundCluster.edges[m] === undefined) {
+ foundCluster.edges[m] = childEdgesObj[m];
+ }
+ }
+ } else {
+ // Create a new cluster group
+ clusters.push({nodes: childNodesObj, edges: childEdgesObj})
+ }
+ }
+ }
+ }
+ }
+
+ for (let i = 0; i < clusters.length; i++) {
+ this._cluster(clusters[i].nodes, clusters[i].edges, options, false)
+ }
+
+ if (refreshData === true) {
+ this.body.emitter.emit('_dataChanged');
+ }
+ }
+
+ /**
+ * Cluster all nodes in the network that have only 1 edge
+ * @param {Object} options
+ * @param {boolean} [refreshData=true]
+ */
+ clusterOutliers(options, refreshData = true) {
+ this.clusterByEdgeCount(1,options,refreshData);
+ }
+
+ /**
+ * Cluster all nodes in the network that have only 2 edge
+ * @param {Object} options
+ * @param {boolean} [refreshData=true]
+ */
+ clusterBridges(options, refreshData = true) {
+ this.clusterByEdgeCount(2,options,refreshData);
+ }
+
+
+
+ /**
+ * suck all connected nodes of a node into the node.
+ * @param {Node.id} nodeId
+ * @param {Object} options
+ * @param {boolean} [refreshData=true]
+ */
+ clusterByConnection(nodeId, options, refreshData = true) {
+ // kill conditions
+ if (nodeId === undefined) {throw new Error("No nodeId supplied to clusterByConnection!");}
+ if (this.body.nodes[nodeId] === undefined) {throw new Error("The nodeId given to clusterByConnection does not exist!");}
+
+ let node = this.body.nodes[nodeId];
+ options = this._checkOptions(options, node);
+ if (options.clusterNodeProperties.x === undefined) {options.clusterNodeProperties.x = node.x;}
+ if (options.clusterNodeProperties.y === undefined) {options.clusterNodeProperties.y = node.y;}
+ if (options.clusterNodeProperties.fixed === undefined) {
+ options.clusterNodeProperties.fixed = {};
+ options.clusterNodeProperties.fixed.x = node.options.fixed.x;
+ options.clusterNodeProperties.fixed.y = node.options.fixed.y;
+ }
+
+
+ let childNodesObj = {};
+ let childEdgesObj = {};
+ let parentNodeId = node.id;
+ let parentClonedOptions = NetworkUtil.cloneOptions(node);
+ childNodesObj[parentNodeId] = node;
+
+ // collect the nodes that will be in the cluster
+ for (let i = 0; i < node.edges.length; i++) {
+ let edge = node.edges[i];
+ if (this.clusteredEdges[edge.id] === undefined) {
+ let childNodeId = this._getConnectedId(edge, parentNodeId);
+
+ // if the child node is not in a cluster
+ if (this.clusteredNodes[childNodeId] === undefined) {
+ if (childNodeId !== parentNodeId) {
+ if (options.joinCondition === undefined) {
+ childEdgesObj[edge.id] = edge;
+ childNodesObj[childNodeId] = this.body.nodes[childNodeId];
+ }
+ else {
+ // clone the options and insert some additional parameters that could be interesting.
+ let childClonedOptions = NetworkUtil.cloneOptions(this.body.nodes[childNodeId]);
+ if (options.joinCondition(parentClonedOptions, childClonedOptions) === true) {
+ childEdgesObj[edge.id] = edge;
+ childNodesObj[childNodeId] = this.body.nodes[childNodeId];
+ }
+ }
+ }
+ else {
+ // swallow the edge if it is self-referencing.
+ childEdgesObj[edge.id] = edge;
+ }
+ }
+ }
+ }
+ var childNodeIDs = Object.keys(childNodesObj).map(function(childNode){
+ return childNodesObj[childNode].id;
+ })
+
+ for (childNode in childNodesObj) {
+ if (!childNodesObj.hasOwnProperty(childNode)) continue;
+
+ var childNode = childNodesObj[childNode];
+ for (var y=0; y < childNode.edges.length; y++){
+ var childEdge = childNode.edges[y];
+ if (childNodeIDs.indexOf(this._getConnectedId(childEdge,childNode.id)) > -1){
+ childEdgesObj[childEdge.id] = childEdge;
+ }
+ }
+ }
+ this._cluster(childNodesObj, childEdgesObj, options, refreshData);
+ }
+
+
+ /**
+ * This function creates the edges that will be attached to the cluster
+ * It looks for edges that are connected to the nodes from the "outside' of the cluster.
+ *
+ * @param {{Node.id: vis.Node}} childNodesObj
+ * @param {{vis.Edge.id: vis.Edge}} childEdgesObj
+ * @param {Object} clusterNodeProperties
+ * @param {Object} clusterEdgeProperties
+ * @private
+ */
+ _createClusterEdges (childNodesObj, childEdgesObj, clusterNodeProperties, clusterEdgeProperties) {
+ let edge, childNodeId, childNode, toId, fromId, otherNodeId;
+
+ // loop over all child nodes and their edges to find edges going out of the cluster
+ // these edges will be replaced by clusterEdges.
+ let childKeys = Object.keys(childNodesObj);
+ let createEdges = [];
+ for (let i = 0; i < childKeys.length; i++) {
+ childNodeId = childKeys[i];
+ childNode = childNodesObj[childNodeId];
+
+ // construct new edges from the cluster to others
+ for (let j = 0; j < childNode.edges.length; j++) {
+ edge = childNode.edges[j];
+ // we only handle edges that are visible to the system, not the disabled ones from the clustering process.
+ if (this.clusteredEdges[edge.id] === undefined) {
+ // self-referencing edges will be added to the "hidden" list
+ if (edge.toId == edge.fromId) {
+ childEdgesObj[edge.id] = edge;
+ }
+ else {
+ // set up the from and to.
+ if (edge.toId == childNodeId) { // this is a double equals because ints and strings can be interchanged here.
+ toId = clusterNodeProperties.id;
+ fromId = edge.fromId;
+ otherNodeId = fromId;
+ }
+ else {
+ toId = edge.toId;
+ fromId = clusterNodeProperties.id;
+ otherNodeId = toId;
+ }
+ }
+
+ // Only edges from the cluster outwards are being replaced.
+ if (childNodesObj[otherNodeId] === undefined) {
+ createEdges.push({edge: edge, fromId: fromId, toId: toId});
+ }
+ }
+ }
+ }
+
+
+ //
+ // Here we actually create the replacement edges.
+ //
+ // We could not do this in the loop above as the creation process
+ // would add an edge to the edges array we are iterating over.
+ //
+ // NOTE: a clustered edge can have multiple base edges!
+ //
+ var newEdges = [];
+
+ /**
+ * Find a cluster edge which matches the given created edge.
+ * @param {vis.Edge} createdEdge
+ * @returns {vis.Edge}
+ */
+ var getNewEdge = function(createdEdge) {
+ for (let j = 0; j < newEdges.length; j++) {
+ let newEdge = newEdges[j];
+
+ // We replace both to and from edges with a single cluster edge
+ let matchToDirection = (createdEdge.fromId === newEdge.fromId && createdEdge.toId === newEdge.toId);
+ let matchFromDirection = (createdEdge.fromId === newEdge.toId && createdEdge.toId === newEdge.fromId);
+
+ if (matchToDirection || matchFromDirection ) {
+ return newEdge;
+ }
+ }
+
+ return null;
+ };
+
+
+ for (let j = 0; j < createEdges.length; j++) {
+ let createdEdge = createEdges[j];
+ let edge = createdEdge.edge;
+ let newEdge = getNewEdge(createdEdge);
+
+ if (newEdge === null) {
+ // Create a clustered edge for this connection
+ newEdge = this._createClusteredEdge(
+ createdEdge.fromId,
+ createdEdge.toId,
+ edge,
+ clusterEdgeProperties);
+
+ newEdges.push(newEdge);
+ } else {
+ newEdge.clusteringEdgeReplacingIds.push(edge.id);
+ }
+
+ // also reference the new edge in the old edge
+ this.body.edges[edge.id].edgeReplacedById = newEdge.id;
+
+ // hide the replaced edge
+ this._backupEdgeOptions(edge);
+ edge.setOptions({physics:false});
+ }
+ }
+
+ /**
+ * This function checks the options that can be supplied to the different cluster functions
+ * for certain fields and inserts defaults if needed
+ * @param {Object} options
+ * @returns {*}
+ * @private
+ */
+ _checkOptions(options = {}) {
+ if (options.clusterEdgeProperties === undefined) {options.clusterEdgeProperties = {};}
+ if (options.clusterNodeProperties === undefined) {options.clusterNodeProperties = {};}
+
+ return options;
+ }
+
+ /**
+ *
+ * @param {Object} childNodesObj | object with node objects, id as keys, same as childNodes except it also contains a source node
+ * @param {Object} childEdgesObj | object with edge objects, id as keys
+ * @param {Array} options | object with {clusterNodeProperties, clusterEdgeProperties, processProperties}
+ * @param {boolean} refreshData | when true, do not wrap up
+ * @private
+ */
+ _cluster(childNodesObj, childEdgesObj, options, refreshData = true) {
+ // Remove nodes which are already clustered
+ var tmpNodesToRemove = []
+ for (let nodeId in childNodesObj) {
+ if (childNodesObj.hasOwnProperty(nodeId)) {
+ if (this.clusteredNodes[nodeId] !== undefined) {
+ tmpNodesToRemove.push(nodeId);
+ }
+ }
+ }
+
+ for (var n = 0; n < tmpNodesToRemove.length; ++n) {
+ delete childNodesObj[tmpNodesToRemove[n]];
+ }
+
+ // kill condition: no nodes don't bother
+ if (Object.keys(childNodesObj).length == 0) {return;}
+
+ // allow clusters of 1 if options allow
+ if (Object.keys(childNodesObj).length == 1 && options.clusterNodeProperties.allowSingleNodeCluster != true) {return;}
+
+ let clusterNodeProperties = util.deepExtend({},options.clusterNodeProperties);
+
+ // construct the clusterNodeProperties
+ if (options.processProperties !== undefined) {
+ // get the childNode options
+ let childNodesOptions = [];
+ for (let nodeId in childNodesObj) {
+ if (childNodesObj.hasOwnProperty(nodeId)) {
+ let clonedOptions = NetworkUtil.cloneOptions(childNodesObj[nodeId]);
+ childNodesOptions.push(clonedOptions);
+ }
+ }
+
+ // get cluster properties based on childNodes
+ let childEdgesOptions = [];
+ for (let edgeId in childEdgesObj) {
+ if (childEdgesObj.hasOwnProperty(edgeId)) {
+ // these cluster edges will be removed on creation of the cluster.
+ if (edgeId.substr(0, 12) !== "clusterEdge:") {
+ let clonedOptions = NetworkUtil.cloneOptions(childEdgesObj[edgeId], 'edge');
+ childEdgesOptions.push(clonedOptions);
+ }
+ }
+ }
+
+ clusterNodeProperties = options.processProperties(clusterNodeProperties, childNodesOptions, childEdgesOptions);
+ if (!clusterNodeProperties) {
+ throw new Error("The processProperties function does not return properties!");
+ }
+ }
+
+ // check if we have an unique id;
+ if (clusterNodeProperties.id === undefined) {clusterNodeProperties.id = 'cluster:' + util.randomUUID();}
+ let clusterId = clusterNodeProperties.id;
+
+ if (clusterNodeProperties.label === undefined) {
+ clusterNodeProperties.label = 'cluster';
+ }
+
+
+ // give the clusterNode a position if it does not have one.
+ let pos = undefined;
+ if (clusterNodeProperties.x === undefined) {
+ pos = this._getClusterPosition(childNodesObj);
+ clusterNodeProperties.x = pos.x;
+ }
+ if (clusterNodeProperties.y === undefined) {
+ if (pos === undefined) {pos = this._getClusterPosition(childNodesObj);}
+ clusterNodeProperties.y = pos.y;
+ }
+
+ // force the ID to remain the same
+ clusterNodeProperties.id = clusterId;
+
+ // create the cluster Node
+ // Note that allowSingleNodeCluster, if present, is stored in the options as well
+ let clusterNode = this.body.functions.createNode(clusterNodeProperties, Cluster);
+ clusterNode.containedNodes = childNodesObj;
+ clusterNode.containedEdges = childEdgesObj;
+ // cache a copy from the cluster edge properties if we have to reconnect others later on
+ clusterNode.clusterEdgeProperties = options.clusterEdgeProperties;
+
+ // finally put the cluster node into global
+ this.body.nodes[clusterNodeProperties.id] = clusterNode;
+
+ this._clusterEdges(childNodesObj, childEdgesObj, clusterNodeProperties, options.clusterEdgeProperties);
+
+ // set ID to undefined so no duplicates arise
+ clusterNodeProperties.id = undefined;
+
+ // wrap up
+ if (refreshData === true) {
+ this.body.emitter.emit('_dataChanged');
+ }
+ }
+
+ /**
+ *
+ * @param {Edge} edge
+ * @private
+ */
+ _backupEdgeOptions(edge) {
+ if (this.clusteredEdges[edge.id] === undefined) {
+ this.clusteredEdges[edge.id] = {physics: edge.options.physics};
+ }
+ }
+
+ /**
+ *
+ * @param {Edge} edge
+ * @private
+ */
+ _restoreEdge(edge) {
+ let originalOptions = this.clusteredEdges[edge.id];
+ if (originalOptions !== undefined) {
+ edge.setOptions({physics: originalOptions.physics});
+ delete this.clusteredEdges[edge.id];
+ }
+ }
+
+
+ /**
+ * Check if a node is a cluster.
+ * @param {Node.id} nodeId
+ * @returns {*}
+ */
+ isCluster(nodeId) {
+ if (this.body.nodes[nodeId] !== undefined) {
+ return this.body.nodes[nodeId].isCluster === true;
+ }
+ else {
+ console.log("Node does not exist.");
+ return false;
+ }
+ }
+
+ /**
+ * get the position of the cluster node based on what's inside
+ * @param {object} childNodesObj | object with node objects, id as keys
+ * @returns {{x: number, y: number}}
+ * @private
+ */
+ _getClusterPosition(childNodesObj) {
+ let childKeys = Object.keys(childNodesObj);
+ let minX = childNodesObj[childKeys[0]].x;
+ let maxX = childNodesObj[childKeys[0]].x;
+ let minY = childNodesObj[childKeys[0]].y;
+ let maxY = childNodesObj[childKeys[0]].y;
+ let node;
+ for (let i = 1; i < childKeys.length; i++) {
+ node = childNodesObj[childKeys[i]];
+ minX = node.x < minX ? node.x : minX;
+ maxX = node.x > maxX ? node.x : maxX;
+ minY = node.y < minY ? node.y : minY;
+ maxY = node.y > maxY ? node.y : maxY;
+ }
+
+
+ return {x: 0.5*(minX + maxX), y: 0.5*(minY + maxY)};
+ }
+
+
+
+ /**
+ * Open a cluster by calling this function.
+ * @param {vis.Edge.id} clusterNodeId | the ID of the cluster node
+ * @param {Object} options
+ * @param {boolean} refreshData | wrap up afterwards if not true
+ */
+ openCluster(clusterNodeId, options, refreshData = true) {
+ // kill conditions
+ if (clusterNodeId === undefined) {
+ throw new Error("No clusterNodeId supplied to openCluster.");
+ }
+
+ let clusterNode = this.body.nodes[clusterNodeId];
+
+ if (clusterNode === undefined) {
+ throw new Error("The clusterNodeId supplied to openCluster does not exist.");
+ }
+ if (clusterNode.isCluster !== true
+ || clusterNode.containedNodes === undefined
+ || clusterNode.containedEdges === undefined) {
+ throw new Error("The node:" + clusterNodeId + " is not a valid cluster.");
+ }
+
+ // Check if current cluster is clustered itself
+ let stack = this.findNode(clusterNodeId);
+ let parentIndex = stack.indexOf(clusterNodeId) - 1;
+ if (parentIndex >= 0) {
+ // Current cluster is clustered; transfer contained nodes and edges to parent
+ let parentClusterNodeId = stack[parentIndex];
+ let parentClusterNode = this.body.nodes[parentClusterNodeId];
+
+ // clustering.clusteredNodes and clustering.clusteredEdges remain unchanged
+ parentClusterNode._openChildCluster(clusterNodeId);
+
+ // All components of child cluster node have been transferred. It can die now.
+ delete this.body.nodes[clusterNodeId];
+ if (refreshData === true) {
+ this.body.emitter.emit('_dataChanged');
+ }
+
+ return;
+ }
+
+ // main body
+ let containedNodes = clusterNode.containedNodes;
+ let containedEdges = clusterNode.containedEdges;
+
+ // allow the user to position the nodes after release.
+ if (options !== undefined && options.releaseFunction !== undefined && typeof options.releaseFunction === 'function') {
+ let positions = {};
+ let clusterPosition = {x:clusterNode.x, y:clusterNode.y};
+ for (let nodeId in containedNodes) {
+ if (containedNodes.hasOwnProperty(nodeId)) {
+ let containedNode = this.body.nodes[nodeId];
+ positions[nodeId] = {x: containedNode.x, y: containedNode.y};
+ }
+ }
+ let newPositions = options.releaseFunction(clusterPosition, positions);
+
+ for (let nodeId in containedNodes) {
+ if (containedNodes.hasOwnProperty(nodeId)) {
+ let containedNode = this.body.nodes[nodeId];
+ if (newPositions[nodeId] !== undefined) {
+ containedNode.x = (newPositions[nodeId].x === undefined ? clusterNode.x : newPositions[nodeId].x);
+ containedNode.y = (newPositions[nodeId].y === undefined ? clusterNode.y : newPositions[nodeId].y);
+ }
+ }
+ }
+ }
+ else {
+ // copy the position from the cluster
+ util.forEach(containedNodes, function(containedNode) {
+ // inherit position
+ if (containedNode.options.fixed.x === false) {containedNode.x = clusterNode.x;}
+ if (containedNode.options.fixed.y === false) {containedNode.y = clusterNode.y;}
+ });
+ }
+
+ // release nodes
+ for (let nodeId in containedNodes) {
+ if (containedNodes.hasOwnProperty(nodeId)) {
+ let containedNode = this.body.nodes[nodeId];
+
+ // inherit speed
+ containedNode.vx = clusterNode.vx;
+ containedNode.vy = clusterNode.vy;
+
+ containedNode.setOptions({physics:true});
+
+ delete this.clusteredNodes[nodeId];
+ }
+ }
+
+ // copy the clusterNode edges because we cannot iterate over an object that we add or remove from.
+ let edgesToBeDeleted = [];
+ for (let i = 0; i < clusterNode.edges.length; i++) {
+ edgesToBeDeleted.push(clusterNode.edges[i]);
+ }
+
+ // actually handling the deleting.
+ for (let i = 0; i < edgesToBeDeleted.length; i++) {
+ let edge = edgesToBeDeleted[i];
+ let otherNodeId = this._getConnectedId(edge, clusterNodeId);
+ let otherNode = this.clusteredNodes[otherNodeId];
+
+ for (let j = 0; j < edge.clusteringEdgeReplacingIds.length; j++) {
+ let transferId = edge.clusteringEdgeReplacingIds[j];
+ let transferEdge = this.body.edges[transferId];
+ if (transferEdge === undefined) continue;
+
+ // if the other node is in another cluster, we transfer ownership of this edge to the other cluster
+ if (otherNode !== undefined) {
+ // transfer ownership:
+ let otherCluster = this.body.nodes[otherNode.clusterId];
+ otherCluster.containedEdges[transferEdge.id] = transferEdge;
+
+ // delete local reference
+ delete containedEdges[transferEdge.id];
+
+ // get to and from
+ let fromId = transferEdge.fromId;
+ let toId = transferEdge.toId;
+ if (transferEdge.toId == otherNodeId) {
+ toId = otherNode.clusterId;
+ }
+ else {
+ fromId = otherNode.clusterId;
+ }
+
+ // create new cluster edge from the otherCluster
+ this._createClusteredEdge(
+ fromId,
+ toId,
+ transferEdge,
+ otherCluster.clusterEdgeProperties,
+ {hidden: false, physics: true});
+
+ } else {
+ this._restoreEdge(transferEdge);
+ }
+ }
+
+ edge.remove();
+ }
+
+ // handle the releasing of the edges
+ for (let edgeId in containedEdges) {
+ if (containedEdges.hasOwnProperty(edgeId)) {
+ this._restoreEdge(containedEdges[edgeId]);
+ }
+ }
+
+ // remove clusterNode
+ delete this.body.nodes[clusterNodeId];
+
+ if (refreshData === true) {
+ this.body.emitter.emit('_dataChanged');
+ }
+ }
+
+ /**
+ *
+ * @param {Cluster.id} clusterId
+ * @returns {Array.}
+ */
+ getNodesInCluster(clusterId) {
+ let nodesArray = [];
+ if (this.isCluster(clusterId) === true) {
+ let containedNodes = this.body.nodes[clusterId].containedNodes;
+ for (let nodeId in containedNodes) {
+ if (containedNodes.hasOwnProperty(nodeId)) {
+ nodesArray.push(this.body.nodes[nodeId].id)
+ }
+ }
+ }
+
+ return nodesArray;
+ }
+
+ /**
+ * Get the stack clusterId's that a certain node resides in. cluster A -> cluster B -> cluster C -> node
+ *
+ * If a node can't be found in the chain, return an empty array.
+ *
+ * @param {string|number} nodeId
+ * @returns {Array}
+ */
+ findNode(nodeId) {
+ let stack = [];
+ let max = 100;
+ let counter = 0;
+ let node;
+
+ while (this.clusteredNodes[nodeId] !== undefined && counter < max) {
+ node = this.body.nodes[nodeId]
+ if (node === undefined) return [];
+ stack.push(node.id);
+
+ nodeId = this.clusteredNodes[nodeId].clusterId;
+ counter++;
+ }
+
+ node = this.body.nodes[nodeId]
+ if (node === undefined) return [];
+ stack.push(node.id);
+
+ stack.reverse();
+ return stack;
+ }
+
+ /**
+ * Using a clustered nodeId, update with the new options
+ * @param {vis.Edge.id} clusteredNodeId
+ * @param {object} newOptions
+ */
+ updateClusteredNode(clusteredNodeId, newOptions) {
+ if (clusteredNodeId === undefined) {throw new Error("No clusteredNodeId supplied to updateClusteredNode.");}
+ if (newOptions === undefined) {throw new Error("No newOptions supplied to updateClusteredNode.");}
+ if (this.body.nodes[clusteredNodeId] === undefined) {throw new Error("The clusteredNodeId supplied to updateClusteredNode does not exist.");}
+
+ this.body.nodes[clusteredNodeId].setOptions(newOptions);
+ this.body.emitter.emit('_dataChanged');
+ }
+
+ /**
+ * Using a base edgeId, update all related clustered edges with the new options
+ * @param {vis.Edge.id} startEdgeId
+ * @param {object} newOptions
+ */
+ updateEdge(startEdgeId, newOptions) {
+ if (startEdgeId === undefined) {throw new Error("No startEdgeId supplied to updateEdge.");}
+ if (newOptions === undefined) {throw new Error("No newOptions supplied to updateEdge.");}
+ if (this.body.edges[startEdgeId] === undefined) {throw new Error("The startEdgeId supplied to updateEdge does not exist.");}
+
+ let allEdgeIds = this.getClusteredEdges(startEdgeId);
+ for (let i = 0; i < allEdgeIds.length; i++) {
+ var edge = this.body.edges[allEdgeIds[i]];
+ edge.setOptions(newOptions);
+ }
+ this.body.emitter.emit('_dataChanged');
+ }
+
+ /**
+ * Get a stack of clusterEdgeId's (+base edgeid) that a base edge is the same as. cluster edge C -> cluster edge B -> cluster edge A -> base edge(edgeId)
+ * @param {vis.Edge.id} edgeId
+ * @returns {Array.}
+ */
+ getClusteredEdges(edgeId) {
+ let stack = [];
+ let max = 100;
+ let counter = 0;
+
+ while (edgeId !== undefined && this.body.edges[edgeId] !== undefined && counter < max) {
+ stack.push(this.body.edges[edgeId].id);
+ edgeId = this.body.edges[edgeId].edgeReplacedById;
+ counter++;
+ }
+ stack.reverse();
+ return stack;
+ }
+
+ /**
+ * Get the base edge id of clusterEdgeId. cluster edge (clusteredEdgeId) -> cluster edge B -> cluster edge C -> base edge
+ * @param {vis.Edge.id} clusteredEdgeId
+ * @returns {vis.Edge.id} baseEdgeId
+ *
+ * TODO: deprecate in 5.0.0. Method getBaseEdges() is the correct one to use.
+ */
+ getBaseEdge(clusteredEdgeId) {
+ // Just kludge this by returning the first base edge id found
+ return this.getBaseEdges(clusteredEdgeId)[0];
+ }
+
+
+ /**
+ * Get all regular edges for this clustered edge id.
+ *
+ * @param {vis.Edge.id} clusteredEdgeId
+ * @returns {Array.} all baseEdgeId's under this clustered edge
+ */
+ getBaseEdges(clusteredEdgeId) {
+ let IdsToHandle = [clusteredEdgeId];
+ let doneIds = [];
+ let foundIds = [];
+ let max = 100;
+ let counter = 0;
+
+ while (IdsToHandle.length > 0 && counter < max) {
+ let nextId = IdsToHandle.pop();
+ if (nextId === undefined) continue; // Paranoia here and onwards
+ let nextEdge = this.body.edges[nextId];
+ if (nextEdge === undefined) continue;
+ counter++;
+
+ let replacingIds = nextEdge.clusteringEdgeReplacingIds;
+ if (replacingIds === undefined) {
+ // nextId is a base id
+ foundIds.push(nextId);
+ } else {
+ // Another cluster edge, unravel this one as well
+ for (let i = 0; i < replacingIds.length; ++i) {
+ let replacingId = replacingIds[i];
+
+ // Don't add if already handled
+ // TODO: never triggers; find a test-case which does
+ if (IdsToHandle.indexOf(replacingIds) !== -1 || doneIds.indexOf(replacingIds) !== -1) {
+ continue;
+ }
+
+ IdsToHandle.push(replacingId);
+ }
+ }
+
+ doneIds.push(nextId);
+ }
+
+ return foundIds;
+ }
+
+
+ /**
+ * Get the Id the node is connected to
+ * @param {vis.Edge} edge
+ * @param {Node.id} nodeId
+ * @returns {*}
+ * @private
+ */
+ _getConnectedId(edge, nodeId) {
+ if (edge.toId != nodeId) {
+ return edge.toId;
+ }
+ else if (edge.fromId != nodeId) {
+ return edge.fromId;
+ }
+ else {
+ return edge.fromId;
+ }
+ }
+
+ /**
+ * We determine how many connections denote an important hub.
+ * We take the mean + 2*std as the important hub size. (Assuming a normal distribution of data, ~2.2%)
+ *
+ * @returns {number}
+ * @private
+ */
+ _getHubSize() {
+ let average = 0;
+ let averageSquared = 0;
+ let hubCounter = 0;
+ let largestHub = 0;
+
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ let node = this.body.nodes[this.body.nodeIndices[i]];
+ if (node.edges.length > largestHub) {
+ largestHub = node.edges.length;
+ }
+ average += node.edges.length;
+ averageSquared += Math.pow(node.edges.length,2);
+ hubCounter += 1;
+ }
+ average = average / hubCounter;
+ averageSquared = averageSquared / hubCounter;
+
+ let variance = averageSquared - Math.pow(average,2);
+ let standardDeviation = Math.sqrt(variance);
+
+ let hubThreshold = Math.floor(average + 2*standardDeviation);
+
+ // always have at least one to cluster
+ if (hubThreshold > largestHub) {
+ hubThreshold = largestHub;
+ }
+
+ return hubThreshold;
+ }
+
+
+ /**
+ * Create an edge for the cluster representation.
+ *
+ * @param {Node.id} fromId
+ * @param {Node.id} toId
+ * @param {vis.Edge} baseEdge
+ * @param {Object} clusterEdgeProperties
+ * @param {Object} extraOptions
+ * @returns {Edge} newly created clustered edge
+ * @private
+ */
+ _createClusteredEdge(fromId, toId, baseEdge, clusterEdgeProperties, extraOptions) {
+ // copy the options of the edge we will replace
+ let clonedOptions = NetworkUtil.cloneOptions(baseEdge, 'edge');
+ // make sure the properties of clusterEdges are superimposed on it
+ util.deepExtend(clonedOptions, clusterEdgeProperties);
+
+ // set up the edge
+ clonedOptions.from = fromId;
+ clonedOptions.to = toId;
+ clonedOptions.id = 'clusterEdge:' + util.randomUUID();
+
+ // apply the edge specific options to it if specified
+ if (extraOptions !== undefined) {
+ util.deepExtend(clonedOptions, extraOptions);
+ }
+
+ let newEdge = this.body.functions.createEdge(clonedOptions);
+ newEdge.clusteringEdgeReplacingIds = [baseEdge.id];
+ newEdge.connect();
+
+ // Register the new edge
+ this.body.edges[newEdge.id] = newEdge;
+
+ return newEdge;
+ }
+
+
+ /**
+ * Add the passed child nodes and edges to the given cluster node.
+ *
+ * @param {Object|Node} childNodes hash of nodes or single node to add in cluster
+ * @param {Object|Edge} childEdges hash of edges or single edge to take into account when clustering
+ * @param {Node} clusterNode cluster node to add nodes and edges to
+ * @param {Object} [clusterEdgeProperties]
+ * @private
+ */
+ _clusterEdges(childNodes, childEdges, clusterNode, clusterEdgeProperties) {
+ if (childEdges instanceof Edge) {
+ let edge = childEdges;
+ let obj = {};
+ obj[edge.id] = edge;
+ childEdges = obj;
+ }
+
+ if (childNodes instanceof Node) {
+ let node = childNodes;
+ let obj = {};
+ obj[node.id] = node;
+ childNodes = obj;
+ }
+
+ if (clusterNode === undefined || clusterNode === null) {
+ throw new Error("_clusterEdges: parameter clusterNode required");
+ }
+
+ if (clusterEdgeProperties === undefined) {
+ // Take the required properties from the cluster node
+ clusterEdgeProperties = clusterNode.clusterEdgeProperties;
+ }
+
+ // create the new edges that will connect to the cluster.
+ // All self-referencing edges will be added to childEdges here.
+ this._createClusterEdges(childNodes, childEdges, clusterNode, clusterEdgeProperties);
+
+ // disable the childEdges
+ for (let edgeId in childEdges) {
+ if (childEdges.hasOwnProperty(edgeId)) {
+ if (this.body.edges[edgeId] !== undefined) {
+ let edge = this.body.edges[edgeId];
+ // cache the options before changing
+ this._backupEdgeOptions(edge);
+ // disable physics and hide the edge
+ edge.setOptions({physics:false});
+ }
+ }
+ }
+
+ // disable the childNodes
+ for (let nodeId in childNodes) {
+ if (childNodes.hasOwnProperty(nodeId)) {
+ this.clusteredNodes[nodeId] = {clusterId:clusterNode.id, node: this.body.nodes[nodeId]};
+ this.body.nodes[nodeId].setOptions({physics:false});
+ }
+ }
+ }
+
+
+ /**
+ * Determine in which cluster given nodeId resides.
+ *
+ * If not in cluster, return undefined.
+ *
+ * NOTE: If you know a cleaner way to do this, please enlighten me (wimrijnders).
+ *
+ * @param {Node.id} nodeId
+ * @returns {Node|undefined} Node instance for cluster, if present
+ * @private
+ */
+ _getClusterNodeForNode(nodeId) {
+ if (nodeId === undefined) return undefined;
+ let clusteredNode = this.clusteredNodes[nodeId];
+
+ // NOTE: If no cluster info found, it should actually be an error
+ if (clusteredNode === undefined) return undefined;
+ let clusterId = clusteredNode.clusterId;
+ if (clusterId === undefined) return undefined;
+
+ return this.body.nodes[clusterId];
+ }
+
+
+ /**
+ * Internal helper function for conditionally removing items in array
+ *
+ * Done like this because Array.filter() is not fully supported by all IE's.
+ *
+ * @param {Array} arr
+ * @param {function} callback
+ * @returns {Array}
+ * @private
+ */
+ _filter(arr, callback) {
+ let ret = [];
+
+ util.forEach(arr, (item) => {
+ if (callback(item)) {
+ ret.push(item);
+ }
+ });
+
+ return ret;
+ }
+
+
+ /**
+ * Scan all edges for changes in clustering and adjust this if necessary.
+ *
+ * Call this (internally) after there has been a change in node or edge data.
+ *
+ * Pre: States of this.body.nodes and this.body.edges consistent
+ * Pre: this.clusteredNodes and this.clusteredEdge consistent with containedNodes and containedEdges
+ * of cluster nodes.
+ */
+ _updateState() {
+ let nodeId;
+ let deletedNodeIds = [];
+ let deletedEdgeIds = {};
+
+ /**
+ * Utility function to iterate over clustering nodes only
+ *
+ * @param {Function} callback function to call for each cluster node
+ */
+ let eachClusterNode = (callback) => {
+ util.forEach(this.body.nodes, (node) => {
+ if (node.isCluster === true) {
+ callback(node);
+ }
+ });
+ };
+
+
+ //
+ // Remove deleted regular nodes from clustering
+ //
+
+ // Determine the deleted nodes
+ for (nodeId in this.clusteredNodes) {
+ if (!this.clusteredNodes.hasOwnProperty(nodeId)) continue;
+ let node = this.body.nodes[nodeId];
+
+ if (node === undefined) {
+ deletedNodeIds.push(nodeId);
+ }
+ }
+
+ // Remove nodes from cluster nodes
+ eachClusterNode(function(clusterNode) {
+ for (let n = 0; n < deletedNodeIds.length; n++) {
+ delete clusterNode.containedNodes[deletedNodeIds[n]];
+ }
+ });
+
+ // Remove nodes from cluster list
+ for (let n = 0; n < deletedNodeIds.length; n++) {
+ delete this.clusteredNodes[deletedNodeIds[n]];
+ }
+
+
+ //
+ // Remove deleted edges from clustering
+ //
+
+ // Add the deleted clustered edges to the list
+ util.forEach(this.clusteredEdges, (edgeId) => {
+ let edge = this.body.edges[edgeId];
+ if (edge === undefined || !edge.endPointsValid()) {
+ deletedEdgeIds[edgeId] = edgeId;
+ }
+ });
+
+ // Cluster nodes can also contain edges which are not clustered,
+ // i.e. nodes 1-2 within cluster with an edge in between.
+ // So the cluster nodes also need to be scanned for invalid edges
+ eachClusterNode(function(clusterNode) {
+ util.forEach(clusterNode.containedEdges, (edge, edgeId) => {
+ if (!edge.endPointsValid() && !deletedEdgeIds[edgeId]) {
+ deletedEdgeIds[edgeId] = edgeId;
+ }
+ });
+ });
+
+ // Also scan for cluster edges which need to be removed in the active list.
+ // Regular edges have been removed beforehand, so this only picks up the cluster edges.
+ util.forEach(this.body.edges, (edge, edgeId) => {
+ // Explicitly scan the contained edges for validity
+ let isValid = true;
+ let replacedIds = edge.clusteringEdgeReplacingIds;
+ if (replacedIds !== undefined) {
+ let numValid = 0;
+
+ util.forEach(replacedIds, (containedEdgeId) => {
+ let containedEdge = this.body.edges[containedEdgeId];
+
+ if (containedEdge !== undefined && containedEdge.endPointsValid()) {
+ numValid += 1;
+ }
+ });
+
+ isValid = (numValid > 0);
+ }
+
+ if (!edge.endPointsValid() || !isValid) {
+ deletedEdgeIds[edgeId] = edgeId;
+ }
+ });
+
+ // Remove edges from cluster nodes
+ eachClusterNode((clusterNode) => {
+ util.forEach(deletedEdgeIds, (deletedEdgeId) => {
+ delete clusterNode.containedEdges[deletedEdgeId];
+
+ util.forEach(clusterNode.edges, (edge, m) => {
+ if (edge.id === deletedEdgeId) {
+ clusterNode.edges[m] = null; // Don't want to directly delete here, because in the loop
+ return;
+ }
+
+ edge.clusteringEdgeReplacingIds = this._filter(edge.clusteringEdgeReplacingIds, function(id) {
+ return !deletedEdgeIds[id];
+ });
+ });
+
+ // Clean up the nulls
+ clusterNode.edges = this._filter(clusterNode.edges, function(item) {return item !== null});
+ });
+ });
+
+
+ // Remove from cluster list
+ util.forEach(deletedEdgeIds, (edgeId) => {
+ delete this.clusteredEdges[edgeId];
+ });
+
+ // Remove cluster edges from active list (this.body.edges).
+ // deletedEdgeIds still contains id of regular edges, but these should all
+ // be gone when you reach here.
+ util.forEach(deletedEdgeIds, (edgeId) => {
+ delete this.body.edges[edgeId];
+ });
+
+
+ //
+ // Check changed cluster state of edges
+ //
+
+ // Iterating over keys here, because edges may be removed in the loop
+ let ids = Object.keys(this.body.edges);
+ util.forEach(ids, (edgeId) => {
+ let edge = this.body.edges[edgeId];
+
+ let shouldBeClustered = this._isClusteredNode(edge.fromId) || this._isClusteredNode(edge.toId);
+ if (shouldBeClustered === this._isClusteredEdge(edge.id)) {
+ return; // all is well
+ }
+
+ if (shouldBeClustered) {
+ // add edge to clustering
+ let clusterFrom = this._getClusterNodeForNode(edge.fromId);
+ if (clusterFrom !== undefined) {
+ this._clusterEdges(this.body.nodes[edge.fromId], edge, clusterFrom);
+ }
+
+ let clusterTo = this._getClusterNodeForNode(edge.toId);
+ if (clusterTo !== undefined) {
+ this._clusterEdges(this.body.nodes[edge.toId], edge, clusterTo);
+ }
+
+ // TODO: check that it works for both edges clustered
+ // (This might be paranoia)
+ } else {
+ // This should not be happening, the state should
+ // be properly updated at this point.
+ //
+ // If it *is* reached during normal operation, then we have to implement
+ // undo clustering for this edge here.
+ throw new Error('remove edge from clustering not implemented!');
+ }
+ });
+
+
+ // Clusters may be nested to any level. Keep on opening until nothing to open
+ var changed = false;
+ var continueLoop = true;
+ while (continueLoop) {
+ let clustersToOpen = [];
+
+ // Determine the id's of clusters that need opening
+ eachClusterNode(function(clusterNode) {
+ let numNodes = Object.keys(clusterNode.containedNodes).length;
+ let allowSingle = (clusterNode.options.allowSingleNodeCluster === true);
+ if ((allowSingle && numNodes < 1) || (!allowSingle && numNodes < 2)) {
+ clustersToOpen.push(clusterNode.id);
+ }
+ });
+
+ // Open them
+ for (let n = 0; n < clustersToOpen.length; ++n) {
+ this.openCluster(clustersToOpen[n], {}, false /* Don't refresh, we're in an refresh/update already */);
+ }
+
+ continueLoop = (clustersToOpen.length > 0);
+ changed = changed || continueLoop;
+ }
+
+ if (changed) {
+ this._updateState() // Redo this method (recursion possible! should be safe)
+ }
+ }
+
+
+ /**
+ * Determine if node with given id is part of a cluster.
+ *
+ * @param {Node.id} nodeId
+ * @return {boolean} true if part of a cluster.
+ */
+ _isClusteredNode(nodeId) {
+ return this.clusteredNodes[nodeId] !== undefined;
+ }
+
+
+ /**
+ * Determine if edge with given id is not visible due to clustering.
+ *
+ * An edge is considered clustered if:
+ * - it is directly replaced by a clustering edge
+ * - any of its connecting nodes is in a cluster
+ *
+ * @param {vis.Edge.id} edgeId
+ * @return {boolean} true if part of a cluster.
+ */
+ _isClusteredEdge(edgeId) {
+ return this.clusteredEdges[edgeId] !== undefined;
+ }
+}
+
+
+export default ClusterEngine;
diff --git a/lib/network/modules/EdgesHandler.js b/lib/network/modules/EdgesHandler.js
new file mode 100644
index 0000000000..9e86798971
--- /dev/null
+++ b/lib/network/modules/EdgesHandler.js
@@ -0,0 +1,488 @@
+import util from 'vis-util';
+import { DataSet, DataView } from 'vis-data';
+import Edge from './components/Edge';
+
+/**
+ * Handler for Edges
+ */
+class EdgesHandler {
+ /**
+ * @param {Object} body
+ * @param {Array.} images
+ * @param {Array.} groups
+ */
+ constructor(body, images, groups) {
+ this.body = body;
+ this.images = images;
+ this.groups = groups;
+
+ // create the edge API in the body container
+ this.body.functions.createEdge = this.create.bind(this);
+
+ this.edgesListeners = {
+ add: (event, params) => {this.add(params.items);},
+ update: (event, params) => {this.update(params.items);},
+ remove: (event, params) => {this.remove(params.items);}
+ };
+
+ this.options = {};
+ this.defaultOptions = {
+ arrows: {
+ to: {enabled: false, scaleFactor:1, type: 'arrow'},// boolean / {arrowScaleFactor:1} / {enabled: false, arrowScaleFactor:1}
+ middle: {enabled: false, scaleFactor:1, type: 'arrow'},
+ from: {enabled: false, scaleFactor:1, type: 'arrow'}
+ },
+ arrowStrikethrough: true,
+ color: {
+ color:'#848484',
+ highlight:'#848484',
+ hover: '#848484',
+ inherit: 'from',
+ opacity:1.0
+ },
+ dashes: false,
+ font: {
+ color: '#343434',
+ size: 14, // px
+ face: 'arial',
+ background: 'none',
+ strokeWidth: 2, // px
+ strokeColor: '#ffffff',
+ align:'horizontal',
+ multi: false,
+ vadjust: 0,
+ bold: {
+ mod: 'bold'
+ },
+ boldital: {
+ mod: 'bold italic'
+ },
+ ital: {
+ mod: 'italic'
+ },
+ mono: {
+ mod: '',
+ size: 15, // px
+ face: 'courier new',
+ vadjust: 2
+ }
+ },
+ hidden: false,
+ hoverWidth: 1.5,
+ label: undefined,
+ labelHighlightBold: true,
+ length: undefined,
+ physics: true,
+ scaling:{
+ min: 1,
+ max: 15,
+ label: {
+ enabled: true,
+ min: 14,
+ max: 30,
+ maxVisible: 30,
+ drawThreshold: 5
+ },
+ customScalingFunction: function (min,max,total,value) {
+ if (max === min) {
+ return 0.5;
+ }
+ else {
+ var scale = 1 / (max - min);
+ return Math.max(0,(value - min)*scale);
+ }
+ }
+ },
+ selectionWidth: 1.5,
+ selfReferenceSize:20,
+ shadow:{
+ enabled: false,
+ color: 'rgba(0,0,0,0.5)',
+ size:10,
+ x:5,
+ y:5
+ },
+ background:{
+ enabled: false,
+ color: 'rgba(111,111,111,1)',
+ size:10,
+ dashes: false
+ },
+ smooth: {
+ enabled: true,
+ type: "dynamic",
+ forceDirection:'none',
+ roundness: 0.5
+ },
+ title:undefined,
+ width: 1,
+ value: undefined
+ };
+
+ util.deepExtend(this.options, this.defaultOptions);
+
+ this.bindEventListeners();
+ }
+
+ /**
+ * Binds event listeners
+ */
+ bindEventListeners() {
+ // this allows external modules to force all dynamic curves to turn static.
+ this.body.emitter.on("_forceDisableDynamicCurves", (type, emit = true) => {
+ if (type === 'dynamic') {
+ type = 'continuous';
+ }
+ let dataChanged = false;
+ for (let edgeId in this.body.edges) {
+ if (this.body.edges.hasOwnProperty(edgeId)) {
+ let edge = this.body.edges[edgeId];
+ let edgeData = this.body.data.edges._data[edgeId];
+
+ // only forcibly remove the smooth curve if the data has been set of the edge has the smooth curves defined.
+ // this is because a change in the global would not affect these curves.
+ if (edgeData !== undefined) {
+ let smoothOptions = edgeData.smooth;
+ if (smoothOptions !== undefined) {
+ if (smoothOptions.enabled === true && smoothOptions.type === 'dynamic') {
+ if (type === undefined) {
+ edge.setOptions({smooth: false});
+ }
+ else {
+ edge.setOptions({smooth: {type: type}});
+ }
+ dataChanged = true;
+ }
+ }
+ }
+ }
+ }
+ if (emit === true && dataChanged === true) {
+ this.body.emitter.emit("_dataChanged");
+ }
+ });
+
+ // this is called when options of EXISTING nodes or edges have changed.
+ //
+ // NOTE: Not true, called when options have NOT changed, for both existing as well as new nodes.
+ // See update() for logic.
+ // TODO: Verify and examine the consequences of this. It might still trigger when
+ // non-option fields have changed, but then reconnecting edges is still useless.
+ // Alternatively, it might also be called when edges are removed.
+ //
+ this.body.emitter.on("_dataUpdated", () => {
+ this.reconnectEdges();
+ });
+
+ // refresh the edges. Used when reverting from hierarchical layout
+ this.body.emitter.on("refreshEdges", this.refresh.bind(this));
+ this.body.emitter.on("refresh", this.refresh.bind(this));
+ this.body.emitter.on("destroy", () => {
+ util.forEach(this.edgesListeners, (callback, event) => {
+ if (this.body.data.edges)
+ this.body.data.edges.off(event, callback);
+ });
+ delete this.body.functions.createEdge;
+ delete this.edgesListeners.add;
+ delete this.edgesListeners.update;
+ delete this.edgesListeners.remove;
+ delete this.edgesListeners;
+ });
+
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ // use the parser from the Edge class to fill in all shorthand notations
+ Edge.parseOptions(this.options, options, true, this.defaultOptions, true);
+
+ // update smooth settings in all edges
+ let dataChanged = false;
+ if (options.smooth !== undefined) {
+ for (let edgeId in this.body.edges) {
+ if (this.body.edges.hasOwnProperty(edgeId)) {
+ dataChanged = this.body.edges[edgeId].updateEdgeType() || dataChanged;
+ }
+ }
+ }
+
+ // update fonts in all edges
+ if (options.font !== undefined) {
+ for (let edgeId in this.body.edges) {
+ if (this.body.edges.hasOwnProperty(edgeId)) {
+ this.body.edges[edgeId].updateLabelModule();
+ }
+ }
+ }
+
+ // update the state of the variables if needed
+ if (options.hidden !== undefined || options.physics !== undefined || dataChanged === true) {
+ this.body.emitter.emit('_dataChanged');
+ }
+ }
+ }
+
+
+ /**
+ * Load edges by reading the data table
+ * @param {Array | DataSet | DataView} edges The data containing the edges.
+ * @param {boolean} [doNotEmit=false]
+ * @private
+ */
+ setData(edges, doNotEmit = false) {
+ var oldEdgesData = this.body.data.edges;
+
+ if (edges instanceof DataSet || edges instanceof DataView) {
+ this.body.data.edges = edges;
+ }
+ else if (Array.isArray(edges)) {
+ this.body.data.edges = new DataSet();
+ this.body.data.edges.add(edges);
+ }
+ else if (!edges) {
+ this.body.data.edges = new DataSet();
+ }
+ else {
+ throw new TypeError('Array or DataSet expected');
+ }
+
+ // TODO: is this null or undefined or false?
+ if (oldEdgesData) {
+ // unsubscribe from old dataset
+ util.forEach(this.edgesListeners, (callback, event) => {oldEdgesData.off(event, callback);});
+ }
+
+ // remove drawn edges
+ this.body.edges = {};
+
+ // TODO: is this null or undefined or false?
+ if (this.body.data.edges) {
+ // subscribe to new dataset
+ util.forEach(this.edgesListeners, (callback, event) => {this.body.data.edges.on(event, callback);});
+
+ // draw all new nodes
+ var ids = this.body.data.edges.getIds();
+ this.add(ids, true);
+ }
+
+ this.body.emitter.emit('_adjustEdgesForHierarchicalLayout');
+ if (doNotEmit === false) {
+ this.body.emitter.emit("_dataChanged");
+ }
+ }
+
+
+ /**
+ * Add edges
+ * @param {number[] | string[]} ids
+ * @param {boolean} [doNotEmit=false]
+ * @private
+ */
+ add(ids, doNotEmit = false) {
+ var edges = this.body.edges;
+ var edgesData = this.body.data.edges;
+
+ for (let i = 0; i < ids.length; i++) {
+ var id = ids[i];
+
+ var oldEdge = edges[id];
+ if (oldEdge) {
+ oldEdge.disconnect();
+ }
+
+ var data = edgesData.get(id, {"showInternalIds" : true});
+ edges[id] = this.create(data);
+ }
+
+ this.body.emitter.emit('_adjustEdgesForHierarchicalLayout');
+
+ if (doNotEmit === false) {
+ this.body.emitter.emit("_dataChanged");
+ }
+ }
+
+
+
+ /**
+ * Update existing edges, or create them when not yet existing
+ * @param {number[] | string[]} ids
+ * @private
+ */
+ update(ids) {
+ var edges = this.body.edges;
+ var edgesData = this.body.data.edges;
+ var dataChanged = false;
+ for (var i = 0; i < ids.length; i++) {
+ var id = ids[i];
+ var data = edgesData.get(id);
+ var edge = edges[id];
+ if (edge !== undefined) {
+ // update edge
+ edge.disconnect();
+ dataChanged = edge.setOptions(data) || dataChanged; // if a support node is added, data can be changed.
+ edge.connect();
+ }
+ else {
+ // create edge
+ this.body.edges[id] = this.create(data);
+ dataChanged = true;
+ }
+ }
+
+ if (dataChanged === true) {
+ this.body.emitter.emit('_adjustEdgesForHierarchicalLayout');
+ this.body.emitter.emit("_dataChanged");
+ }
+ else {
+ this.body.emitter.emit("_dataUpdated");
+ }
+ }
+
+
+ /**
+ * Remove existing edges. Non existing ids will be ignored
+ * @param {number[] | string[]} ids
+ * @param {boolean} [emit=true]
+ * @private
+ */
+ remove(ids, emit = true) {
+ if (ids.length === 0) return; // early out
+
+ var edges = this.body.edges;
+ util.forEach(ids, (id) => {
+ var edge = edges[id];
+ if (edge !== undefined) {
+ edge.remove();
+ }
+ });
+
+ if (emit) {
+ this.body.emitter.emit("_dataChanged");
+ }
+ }
+
+ /**
+ * Refreshes Edge Handler
+ */
+ refresh() {
+ util.forEach(this.body.edges, (edge, edgeId) => {
+ let data = this.body.data.edges._data[edgeId];
+ if (data !== undefined) {
+ edge.setOptions(data);
+ }
+ });
+ }
+
+ /**
+ *
+ * @param {Object} properties
+ * @returns {Edge}
+ */
+ create(properties) {
+ return new Edge(properties, this.body, this.options, this.defaultOptions)
+ }
+
+ /**
+ * Reconnect all edges
+ * @private
+ */
+ reconnectEdges() {
+ var id;
+ var nodes = this.body.nodes;
+ var edges = this.body.edges;
+
+ for (id in nodes) {
+ if (nodes.hasOwnProperty(id)) {
+ nodes[id].edges = [];
+ }
+ }
+
+ for (id in edges) {
+ if (edges.hasOwnProperty(id)) {
+ var edge = edges[id];
+ edge.from = null;
+ edge.to = null;
+ edge.connect();
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {Edge.id} edgeId
+ * @returns {Array}
+ */
+ getConnectedNodes(edgeId) {
+ let nodeList = [];
+ if (this.body.edges[edgeId] !== undefined) {
+ let edge = this.body.edges[edgeId];
+ if (edge.fromId !== undefined) {nodeList.push(edge.fromId);}
+ if (edge.toId !== undefined) {nodeList.push(edge.toId);}
+ }
+ return nodeList;
+ }
+
+ /**
+ * There is no direct relation between the nodes and the edges DataSet,
+ * so the right place to do call this is in the handler for event `_dataUpdated`.
+ */
+ _updateState() {
+ this._addMissingEdges();
+ this._removeInvalidEdges();
+ }
+
+ /**
+ * Scan for missing nodes and remove corresponding edges, if any.
+ * @private
+ */
+ _removeInvalidEdges() {
+
+ let edgesToDelete = [];
+
+ util.forEach(this.body.edges, (edge, id) => {
+ let toNode = this.body.nodes[edge.toId];
+ let fromNode = this.body.nodes[edge.fromId];
+
+ // Skip clustering edges here, let the Clustering module handle those
+ if ((toNode !== undefined && toNode.isCluster === true)
+ || (fromNode !== undefined && fromNode.isCluster === true)) {
+ return;
+ }
+
+ if (toNode === undefined || fromNode === undefined) {
+ edgesToDelete.push(id);
+ }
+ });
+
+ this.remove(edgesToDelete, false);
+ }
+
+ /**
+ * add all edges from dataset that are not in the cached state
+ * @private
+ */
+ _addMissingEdges() {
+ let edgesData = this.body.data.edges;
+ if (edgesData === undefined || edgesData === null) {
+ return; // No edges DataSet yet; can happen on startup
+ }
+
+ let edges = this.body.edges;
+ let addIds = [];
+
+ edgesData.forEach((edgeData, edgeId) => {
+ let edge = edges[edgeId];
+ if(edge===undefined) {
+ addIds.push(edgeId);
+ }
+ });
+
+ this.add(addIds,true);
+ }
+}
+
+export default EdgesHandler;
diff --git a/lib/network/modules/Groups.js b/lib/network/modules/Groups.js
new file mode 100644
index 0000000000..820d2d1884
--- /dev/null
+++ b/lib/network/modules/Groups.js
@@ -0,0 +1,124 @@
+import util from 'vis-util';
+
+/**
+ * This class can store groups and options specific for groups.
+ */
+class Groups {
+ /**
+ * @ignore
+ */
+ constructor() {
+ this.clear();
+ this.defaultIndex = 0;
+ this.groupsArray = [];
+ this.groupIndex = 0;
+
+ this.defaultGroups = [
+ {border: "#2B7CE9", background: "#97C2FC", highlight: {border: "#2B7CE9", background: "#D2E5FF"}, hover: {border: "#2B7CE9", background: "#D2E5FF"}}, // 0: blue
+ {border: "#FFA500", background: "#FFFF00", highlight: {border: "#FFA500", background: "#FFFFA3"}, hover: {border: "#FFA500", background: "#FFFFA3"}}, // 1: yellow
+ {border: "#FA0A10", background: "#FB7E81", highlight: {border: "#FA0A10", background: "#FFAFB1"}, hover: {border: "#FA0A10", background: "#FFAFB1"}}, // 2: red
+ {border: "#41A906", background: "#7BE141", highlight: {border: "#41A906", background: "#A1EC76"}, hover: {border: "#41A906", background: "#A1EC76"}}, // 3: green
+ {border: "#E129F0", background: "#EB7DF4", highlight: {border: "#E129F0", background: "#F0B3F5"}, hover: {border: "#E129F0", background: "#F0B3F5"}}, // 4: magenta
+ {border: "#7C29F0", background: "#AD85E4", highlight: {border: "#7C29F0", background: "#D3BDF0"}, hover: {border: "#7C29F0", background: "#D3BDF0"}}, // 5: purple
+ {border: "#C37F00", background: "#FFA807", highlight: {border: "#C37F00", background: "#FFCA66"}, hover: {border: "#C37F00", background: "#FFCA66"}}, // 6: orange
+ {border: "#4220FB", background: "#6E6EFD", highlight: {border: "#4220FB", background: "#9B9BFD"}, hover: {border: "#4220FB", background: "#9B9BFD"}}, // 7: darkblue
+ {border: "#FD5A77", background: "#FFC0CB", highlight: {border: "#FD5A77", background: "#FFD1D9"}, hover: {border: "#FD5A77", background: "#FFD1D9"}}, // 8: pink
+ {border: "#4AD63A", background: "#C2FABC", highlight: {border: "#4AD63A", background: "#E6FFE3"}, hover: {border: "#4AD63A", background: "#E6FFE3"}}, // 9: mint
+
+ {border: "#990000", background: "#EE0000", highlight: {border: "#BB0000", background: "#FF3333"}, hover: {border: "#BB0000", background: "#FF3333"}}, // 10:bright red
+
+ {border: "#FF6000", background: "#FF6000", highlight: {border: "#FF6000", background: "#FF6000"}, hover: {border: "#FF6000", background: "#FF6000"}}, // 12: real orange
+ {border: "#97C2FC", background: "#2B7CE9", highlight: {border: "#D2E5FF", background: "#2B7CE9"}, hover: {border: "#D2E5FF", background: "#2B7CE9"}}, // 13: blue
+ {border: "#399605", background: "#255C03", highlight: {border: "#399605", background: "#255C03"}, hover: {border: "#399605", background: "#255C03"}}, // 14: green
+ {border: "#B70054", background: "#FF007E", highlight: {border: "#B70054", background: "#FF007E"}, hover: {border: "#B70054", background: "#FF007E"}}, // 15: magenta
+ {border: "#AD85E4", background: "#7C29F0", highlight: {border: "#D3BDF0", background: "#7C29F0"}, hover: {border: "#D3BDF0", background: "#7C29F0"}}, // 16: purple
+ {border: "#4557FA", background: "#000EA1", highlight: {border: "#6E6EFD", background: "#000EA1"}, hover: {border: "#6E6EFD", background: "#000EA1"}}, // 17: darkblue
+ {border: "#FFC0CB", background: "#FD5A77", highlight: {border: "#FFD1D9", background: "#FD5A77"}, hover: {border: "#FFD1D9", background: "#FD5A77"}}, // 18: pink
+ {border: "#C2FABC", background: "#74D66A", highlight: {border: "#E6FFE3", background: "#74D66A"}, hover: {border: "#E6FFE3", background: "#74D66A"}}, // 19: mint
+
+ {border: "#EE0000", background: "#990000", highlight: {border: "#FF3333", background: "#BB0000"}, hover: {border: "#FF3333", background: "#BB0000"}} // 20:bright red
+ ];
+
+ this.options = {};
+ this.defaultOptions = {
+ useDefaultGroups: true
+ };
+ util.extend(this.options, this.defaultOptions);
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ let optionFields = ['useDefaultGroups'];
+
+ if (options !== undefined) {
+ for (let groupName in options) {
+ if (options.hasOwnProperty(groupName)) {
+ if (optionFields.indexOf(groupName) === -1) {
+ let group = options[groupName];
+ this.add(groupName, group);
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Clear all groups
+ */
+ clear() {
+ this.groups = {};
+ this.groupsArray = [];
+ }
+
+ /**
+ * Get group options of a groupname.
+ * If groupname is not found, a new group may be created.
+ *
+ * @param {*} groupname Can be a number, string, Date, etc.
+ * @param {boolean} [shouldCreate=true] If true, create a new group
+ * @return {Object} The found or created group
+ */
+ get(groupname, shouldCreate = true) {
+ let group = this.groups[groupname];
+
+ if (group === undefined && shouldCreate) {
+ if (this.options.useDefaultGroups === false && this.groupsArray.length > 0) {
+ // create new group
+ let index = this.groupIndex % this.groupsArray.length;
+ this.groupIndex++;
+ group = {};
+ group.color = this.groups[this.groupsArray[index]];
+ this.groups[groupname] = group;
+ }
+ else {
+ // create new group
+ let index = this.defaultIndex % this.defaultGroups.length;
+ this.defaultIndex++;
+ group = {};
+ group.color = this.defaultGroups[index];
+ this.groups[groupname] = group;
+ }
+ }
+
+ return group;
+ }
+
+ /**
+ * Add a custom group style
+ * @param {string} groupName
+ * @param {Object} style An object containing borderColor,
+ * backgroundColor, etc.
+ * @return {Object} group The created group object
+ */
+ add(groupName, style) {
+ this.groups[groupName] = style;
+ this.groupsArray.push(groupName);
+ return style;
+ }
+}
+
+export default Groups;
diff --git a/lib/network/modules/InteractionHandler.js b/lib/network/modules/InteractionHandler.js
new file mode 100644
index 0000000000..29f63270a1
--- /dev/null
+++ b/lib/network/modules/InteractionHandler.js
@@ -0,0 +1,724 @@
+import util from 'vis-util';
+import NavigationHandler from './components/NavigationHandler';
+import Popup from './../../shared/Popup';
+
+
+/**
+ * Handler for interactions
+ */
+class InteractionHandler {
+ /**
+ * @param {Object} body
+ * @param {Canvas} canvas
+ * @param {SelectionHandler} selectionHandler
+ */
+ constructor(body, canvas, selectionHandler) {
+ this.body = body;
+ this.canvas = canvas;
+ this.selectionHandler = selectionHandler;
+ this.navigationHandler = new NavigationHandler(body,canvas);
+
+ // bind the events from hammer to functions in this object
+ this.body.eventListeners.onTap = this.onTap.bind(this);
+ this.body.eventListeners.onTouch = this.onTouch.bind(this);
+ this.body.eventListeners.onDoubleTap = this.onDoubleTap.bind(this);
+ this.body.eventListeners.onHold = this.onHold.bind(this);
+ this.body.eventListeners.onDragStart = this.onDragStart.bind(this);
+ this.body.eventListeners.onDrag = this.onDrag.bind(this);
+ this.body.eventListeners.onDragEnd = this.onDragEnd.bind(this);
+ this.body.eventListeners.onMouseWheel = this.onMouseWheel.bind(this);
+ this.body.eventListeners.onPinch = this.onPinch.bind(this);
+ this.body.eventListeners.onMouseMove = this.onMouseMove.bind(this);
+ this.body.eventListeners.onRelease = this.onRelease.bind(this);
+ this.body.eventListeners.onContext = this.onContext.bind(this);
+
+ this.touchTime = 0;
+ this.drag = {};
+ this.pinch = {};
+ this.popup = undefined;
+ this.popupObj = undefined;
+ this.popupTimer = undefined;
+
+ this.body.functions.getPointer = this.getPointer.bind(this);
+
+ this.options = {};
+ this.defaultOptions = {
+ dragNodes:true,
+ dragView: true,
+ hover: false,
+ keyboard: {
+ enabled: false,
+ speed: {x: 10, y: 10, zoom: 0.02},
+ bindToWindow: true
+ },
+ navigationButtons: false,
+ tooltipDelay: 300,
+ zoomView: true,
+ zoomSpeed: 1
+ };
+ util.extend(this.options,this.defaultOptions);
+
+ this.bindEventListeners()
+ }
+
+ /**
+ * Binds event listeners
+ */
+ bindEventListeners() {
+ this.body.emitter.on('destroy', () => {
+ clearTimeout(this.popupTimer);
+ delete this.body.functions.getPointer;
+ })
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ // extend all but the values in fields
+ let fields = ['hideEdgesOnDrag','hideNodesOnDrag','keyboard','multiselect','selectable','selectConnectedEdges'];
+ util.selectiveNotDeepExtend(fields, this.options, options);
+
+ // merge the keyboard options in.
+ util.mergeOptions(this.options, options, 'keyboard');
+
+ if (options.tooltip) {
+ util.extend(this.options.tooltip, options.tooltip);
+ if (options.tooltip.color) {
+ this.options.tooltip.color = util.parseColor(options.tooltip.color);
+ }
+ }
+ }
+
+ this.navigationHandler.setOptions(this.options);
+ }
+
+
+ /**
+ * Get the pointer location from a touch location
+ * @param {{x: number, y: number}} touch
+ * @return {{x: number, y: number}} pointer
+ * @private
+ */
+ getPointer(touch) {
+ return {
+ x: touch.x - util.getAbsoluteLeft(this.canvas.frame.canvas),
+ y: touch.y - util.getAbsoluteTop(this.canvas.frame.canvas)
+ };
+ }
+
+
+ /**
+ * On start of a touch gesture, store the pointer
+ * @param {Event} event The event
+ * @private
+ */
+ onTouch(event) {
+ if (new Date().valueOf() - this.touchTime > 50) {
+ this.drag.pointer = this.getPointer(event.center);
+ this.drag.pinched = false;
+ this.pinch.scale = this.body.view.scale;
+ // to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame)
+ this.touchTime = new Date().valueOf();
+ }
+ }
+
+
+ /**
+ * handle tap/click event: select/unselect a node
+ * @param {Event} event
+ * @private
+ */
+ onTap(event) {
+ let pointer = this.getPointer(event.center);
+ let multiselect = this.selectionHandler.options.multiselect &&
+ (event.changedPointers[0].ctrlKey || event.changedPointers[0].metaKey);
+
+ this.checkSelectionChanges(pointer, event, multiselect);
+ this.selectionHandler._generateClickEvent('click', event, pointer);
+ }
+
+
+ /**
+ * handle doubletap event
+ * @param {Event} event
+ * @private
+ */
+ onDoubleTap(event) {
+ let pointer = this.getPointer(event.center);
+ this.selectionHandler._generateClickEvent('doubleClick', event, pointer);
+ }
+
+
+ /**
+ * handle long tap event: multi select nodes
+ * @param {Event} event
+ * @private
+ */
+ onHold(event) {
+ let pointer = this.getPointer(event.center);
+ let multiselect = this.selectionHandler.options.multiselect;
+
+ this.checkSelectionChanges(pointer, event, multiselect);
+
+ this.selectionHandler._generateClickEvent('click', event, pointer);
+ this.selectionHandler._generateClickEvent('hold', event, pointer);
+ }
+
+
+ /**
+ * handle the release of the screen
+ *
+ * @param {Event} event
+ * @private
+ */
+ onRelease(event) {
+ if (new Date().valueOf() - this.touchTime > 10) {
+ let pointer = this.getPointer(event.center);
+ this.selectionHandler._generateClickEvent('release', event, pointer);
+ // to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame)
+ this.touchTime = new Date().valueOf();
+ }
+ }
+
+ /**
+ *
+ * @param {Event} event
+ */
+ onContext(event) {
+ let pointer = this.getPointer({x:event.clientX, y:event.clientY});
+ this.selectionHandler._generateClickEvent('oncontext', event, pointer);
+ }
+
+
+ /**
+ * Select and deselect nodes depending current selection change.
+ *
+ * For changing nodes, select/deselect events are fired.
+ *
+ * NOTE: For a given edge, if one connecting node is deselected and with the same
+ * click the other node is selected, no events for the edge will fire.
+ * It was selected and it will remain selected.
+ *
+ * TODO: This is all SelectionHandler calls; the method should be moved to there.
+ *
+ * @param {{x: number, y: number}} pointer
+ * @param {Event} event
+ * @param {boolean} [add=false]
+ */
+ checkSelectionChanges(pointer, event, add = false) {
+ let previousSelection = this.selectionHandler.getSelection();
+ let selected = false;
+ if (add === true) {
+ selected = this.selectionHandler.selectAdditionalOnPoint(pointer);
+ }
+ else {
+ selected = this.selectionHandler.selectOnPoint(pointer);
+ }
+ let currentSelection = this.selectionHandler.getSelection();
+
+ // See NOTE in method comment for the reason to do it like this
+ let deselectedItems = this._determineDifference(previousSelection, currentSelection);
+ let selectedItems = this._determineDifference(currentSelection , previousSelection);
+
+ if (deselectedItems.edges.length > 0) {
+ this.selectionHandler._generateClickEvent('deselectEdge', event, pointer, previousSelection);
+ selected = true;
+ }
+
+ if (deselectedItems.nodes.length > 0) {
+ this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection);
+ selected = true;
+ }
+
+ if (selectedItems.nodes.length > 0) {
+ this.selectionHandler._generateClickEvent('selectNode', event, pointer);
+ selected = true;
+ }
+
+ if (selectedItems.edges.length > 0) {
+ this.selectionHandler._generateClickEvent('selectEdge', event, pointer);
+ selected = true;
+ }
+
+ // fire the select event if anything has been selected or deselected
+ if (selected === true) { // select or unselect
+ this.selectionHandler._generateClickEvent('select', event, pointer);
+ }
+ }
+
+
+ /**
+ * Remove all node and edge id's from the first set that are present in the second one.
+ *
+ * @param {{nodes: Array., edges: Array.}} firstSet
+ * @param {{nodes: Array., edges: Array.}} secondSet
+ * @returns {{nodes: Array., edges: Array.}}
+ * @private
+ */
+ _determineDifference(firstSet, secondSet) {
+ let arrayDiff = function(firstArr, secondArr) {
+ let result = [];
+
+ for (let i = 0; i < firstArr.length; i++) {
+ let value = firstArr[i];
+ if (secondArr.indexOf(value) === -1) {
+ result.push(value);
+ }
+ }
+
+ return result;
+ };
+
+ return {
+ nodes: arrayDiff(firstSet.nodes, secondSet.nodes),
+ edges: arrayDiff(firstSet.edges, secondSet.edges)
+ };
+ }
+
+
+ /**
+ * This function is called by onDragStart.
+ * It is separated out because we can then overload it for the datamanipulation system.
+ *
+ * @param {Event} event
+ * @private
+ */
+ onDragStart(event) {
+ //in case the touch event was triggered on an external div, do the initial touch now.
+ if (this.drag.pointer === undefined) {
+ this.onTouch(event);
+ }
+
+ // note: drag.pointer is set in onTouch to get the initial touch location
+ let node = this.selectionHandler.getNodeAt(this.drag.pointer);
+
+ this.drag.dragging = true;
+ this.drag.selection = [];
+ this.drag.translation = util.extend({},this.body.view.translation); // copy the object
+ this.drag.nodeId = undefined;
+
+ if (node !== undefined && this.options.dragNodes === true) {
+ this.drag.nodeId = node.id;
+ // select the clicked node if not yet selected
+ if (node.isSelected() === false) {
+ this.selectionHandler.unselectAll();
+ this.selectionHandler.selectObject(node);
+ }
+
+ // after select to contain the node
+ this.selectionHandler._generateClickEvent('dragStart', event, this.drag.pointer);
+
+ let selection = this.selectionHandler.selectionObj.nodes;
+ // create an array with the selected nodes and their original location and status
+ for (let nodeId in selection) {
+ if (selection.hasOwnProperty(nodeId)) {
+ let object = selection[nodeId];
+ let s = {
+ id: object.id,
+ node: object,
+
+ // store original x, y, xFixed and yFixed, make the node temporarily Fixed
+ x: object.x,
+ y: object.y,
+ xFixed: object.options.fixed.x,
+ yFixed: object.options.fixed.y
+ };
+
+ object.options.fixed.x = true;
+ object.options.fixed.y = true;
+
+ this.drag.selection.push(s);
+ }
+ }
+ }
+ else {
+ // fallback if no node is selected and thus the view is dragged.
+ this.selectionHandler._generateClickEvent('dragStart', event, this.drag.pointer, undefined, true);
+ }
+ }
+
+
+ /**
+ * handle drag event
+ * @param {Event} event
+ * @private
+ */
+ onDrag(event) {
+ if (this.drag.pinched === true) {
+ return;
+ }
+
+ // remove the focus on node if it is focussed on by the focusOnNode
+ this.body.emitter.emit('unlockNode');
+
+ let pointer = this.getPointer(event.center);
+
+ let selection = this.drag.selection;
+ if (selection && selection.length && this.options.dragNodes === true) {
+ this.selectionHandler._generateClickEvent('dragging', event, pointer);
+
+ // calculate delta's and new location
+ let deltaX = pointer.x - this.drag.pointer.x;
+ let deltaY = pointer.y - this.drag.pointer.y;
+
+ // update position of all selected nodes
+ selection.forEach((selection) => {
+ let node = selection.node;
+ // only move the node if it was not fixed initially
+ if (selection.xFixed === false) {
+ node.x = this.canvas._XconvertDOMtoCanvas(this.canvas._XconvertCanvasToDOM(selection.x) + deltaX);
+ }
+ // only move the node if it was not fixed initially
+ if (selection.yFixed === false) {
+ node.y = this.canvas._YconvertDOMtoCanvas(this.canvas._YconvertCanvasToDOM(selection.y) + deltaY);
+ }
+ });
+
+ // start the simulation of the physics
+ this.body.emitter.emit('startSimulation');
+ }
+ else {
+ // move the network
+ if (this.options.dragView === true) {
+ this.selectionHandler._generateClickEvent('dragging', event, pointer, undefined, true);
+
+ // if the drag was not started properly because the click started outside the network div, start it now.
+ if (this.drag.pointer === undefined) {
+ this.onDragStart(event);
+ return;
+ }
+ let diffX = pointer.x - this.drag.pointer.x;
+ let diffY = pointer.y - this.drag.pointer.y;
+
+ this.body.view.translation = {x:this.drag.translation.x + diffX, y:this.drag.translation.y + diffY};
+ this.body.emitter.emit('_requestRedraw');
+ }
+ }
+ }
+
+
+ /**
+ * handle drag start event
+ * @param {Event} event
+ * @private
+ */
+ onDragEnd(event) {
+ this.drag.dragging = false;
+ let selection = this.drag.selection;
+ if (selection && selection.length) {
+ selection.forEach(function (s) {
+ // restore original xFixed and yFixed
+ s.node.options.fixed.x = s.xFixed;
+ s.node.options.fixed.y = s.yFixed;
+ });
+ this.selectionHandler._generateClickEvent('dragEnd', event, this.getPointer(event.center));
+ this.body.emitter.emit('startSimulation');
+ }
+ else {
+ this.selectionHandler._generateClickEvent('dragEnd', event, this.getPointer(event.center), undefined, true);
+ this.body.emitter.emit('_requestRedraw');
+ }
+ }
+
+
+
+ /**
+ * Handle pinch event
+ * @param {Event} event The event
+ * @private
+ */
+ onPinch(event) {
+ let pointer = this.getPointer(event.center);
+
+ this.drag.pinched = true;
+ if (this.pinch['scale'] === undefined) {
+ this.pinch.scale = 1;
+ }
+
+ // TODO: enabled moving while pinching?
+ let scale = this.pinch.scale * event.scale;
+ this.zoom(scale, pointer)
+ }
+
+
+ /**
+ * Zoom the network in or out
+ * @param {number} scale a number around 1, and between 0.01 and 10
+ * @param {{x: number, y: number}} pointer Position on screen
+ * @private
+ */
+ zoom(scale, pointer) {
+ if (this.options.zoomView === true) {
+ let scaleOld = this.body.view.scale;
+ if (scale < 0.00001) {
+ scale = 0.00001;
+ }
+ if (scale > 10) {
+ scale = 10;
+ }
+
+ let preScaleDragPointer = undefined;
+ if (this.drag !== undefined) {
+ if (this.drag.dragging === true) {
+ preScaleDragPointer = this.canvas.DOMtoCanvas(this.drag.pointer);
+ }
+ }
+ // + this.canvas.frame.canvas.clientHeight / 2
+ let translation = this.body.view.translation;
+
+ let scaleFrac = scale / scaleOld;
+ let tx = (1 - scaleFrac) * pointer.x + translation.x * scaleFrac;
+ let ty = (1 - scaleFrac) * pointer.y + translation.y * scaleFrac;
+
+ this.body.view.scale = scale;
+ this.body.view.translation = {x:tx, y:ty};
+
+ if (preScaleDragPointer != undefined) {
+ let postScaleDragPointer = this.canvas.canvasToDOM(preScaleDragPointer);
+ this.drag.pointer.x = postScaleDragPointer.x;
+ this.drag.pointer.y = postScaleDragPointer.y;
+ }
+
+ this.body.emitter.emit('_requestRedraw');
+
+ if (scaleOld < scale) {
+ this.body.emitter.emit('zoom', {direction: '+', scale: this.body.view.scale, pointer: pointer});
+ }
+ else {
+ this.body.emitter.emit('zoom', {direction: '-', scale: this.body.view.scale, pointer: pointer});
+ }
+ }
+ }
+
+
+ /**
+ * Event handler for mouse wheel event, used to zoom the timeline
+ * See http://adomas.org/javascript-mouse-wheel/
+ * https://github.com/EightMedia/hammer.js/issues/256
+ * @param {MouseEvent} event
+ * @private
+ */
+ onMouseWheel(event) {
+ if (this.options.zoomView === true) {
+ // retrieve delta
+ let delta = 0;
+ if (event.wheelDelta) { /* IE/Opera. */
+ delta = event.wheelDelta / 120;
+ }
+ else if (event.detail) { /* Mozilla case. */
+ // In Mozilla, sign of delta is different than in IE.
+ // Also, delta is multiple of 3.
+ delta = -event.detail / 3;
+ }
+
+ // If delta is nonzero, handle it.
+ // Basically, delta is now positive if wheel was scrolled up,
+ // and negative, if wheel was scrolled down.
+ if (delta !== 0) {
+
+ // calculate the new scale
+ let scale = this.body.view.scale;
+ let zoom = delta * (this.options.zoomSpeed / 10);
+ if (delta < 0) {
+ zoom = zoom / (1 - zoom);
+ }
+ scale *= (1 + zoom);
+
+ // calculate the pointer location
+ let pointer = this.getPointer({x: event.clientX, y: event.clientY});
+
+ // apply the new scale
+ this.zoom(scale, pointer);
+ }
+
+ // Prevent default actions caused by mouse wheel.
+ event.preventDefault();
+ }
+ }
+
+
+ /**
+ * Mouse move handler for checking whether the title moves over a node with a title.
+ * @param {Event} event
+ * @private
+ */
+ onMouseMove(event) {
+ let pointer = this.getPointer({x:event.clientX, y:event.clientY});
+ let popupVisible = false;
+
+ // check if the previously selected node is still selected
+ if (this.popup !== undefined) {
+ if (this.popup.hidden === false) {
+ this._checkHidePopup(pointer);
+ }
+
+ // if the popup was not hidden above
+ if (this.popup.hidden === false) {
+ popupVisible = true;
+ this.popup.setPosition(pointer.x + 3, pointer.y - 5);
+ this.popup.show();
+ }
+ }
+
+ // if we bind the keyboard to the div, we have to highlight it to use it. This highlights it on mouse over.
+ if (this.options.keyboard.bindToWindow === false && this.options.keyboard.enabled === true) {
+ this.canvas.frame.focus();
+ }
+
+ // start a timeout that will check if the mouse is positioned above an element
+ if (popupVisible === false) {
+ if (this.popupTimer !== undefined) {
+ clearInterval(this.popupTimer); // stop any running calculationTimer
+ this.popupTimer = undefined;
+ }
+ if (!this.drag.dragging) {
+ this.popupTimer = setTimeout(() => this._checkShowPopup(pointer), this.options.tooltipDelay);
+ }
+ }
+
+ // adding hover highlights
+ if (this.options.hover === true) {
+ this.selectionHandler.hoverObject(event, pointer);
+ }
+ }
+
+
+
+ /**
+ * Check if there is an element on the given position in the network
+ * (a node or edge). If so, and if this element has a title,
+ * show a popup window with its title.
+ *
+ * @param {{x:number, y:number}} pointer
+ * @private
+ */
+ _checkShowPopup(pointer) {
+ let x = this.canvas._XconvertDOMtoCanvas(pointer.x);
+ let y = this.canvas._YconvertDOMtoCanvas(pointer.y);
+ let pointerObj = {
+ left: x,
+ top: y,
+ right: x,
+ bottom: y
+ };
+
+ let previousPopupObjId = this.popupObj === undefined ? undefined : this.popupObj.id;
+ let nodeUnderCursor = false;
+ let popupType = 'node';
+
+ // check if a node is under the cursor.
+ if (this.popupObj === undefined) {
+ // search the nodes for overlap, select the top one in case of multiple nodes
+ let nodeIndices = this.body.nodeIndices;
+ let nodes = this.body.nodes;
+ let node;
+ let overlappingNodes = [];
+ for (let i = 0; i < nodeIndices.length; i++) {
+ node = nodes[nodeIndices[i]];
+ if (node.isOverlappingWith(pointerObj) === true) {
+ if (node.getTitle() !== undefined) {
+ overlappingNodes.push(nodeIndices[i]);
+ }
+ }
+ }
+
+ if (overlappingNodes.length > 0) {
+ // if there are overlapping nodes, select the last one, this is the one which is drawn on top of the others
+ this.popupObj = nodes[overlappingNodes[overlappingNodes.length - 1]];
+ // if you hover over a node, the title of the edge is not supposed to be shown.
+ nodeUnderCursor = true;
+ }
+ }
+
+ if (this.popupObj === undefined && nodeUnderCursor === false) {
+ // search the edges for overlap
+ let edgeIndices = this.body.edgeIndices;
+ let edges = this.body.edges;
+ let edge;
+ let overlappingEdges = [];
+ for (let i = 0; i < edgeIndices.length; i++) {
+ edge = edges[edgeIndices[i]];
+ if (edge.isOverlappingWith(pointerObj) === true) {
+ if (edge.connected === true && edge.getTitle() !== undefined) {
+ overlappingEdges.push(edgeIndices[i]);
+ }
+ }
+ }
+
+ if (overlappingEdges.length > 0) {
+ this.popupObj = edges[overlappingEdges[overlappingEdges.length - 1]];
+ popupType = 'edge';
+ }
+ }
+
+ if (this.popupObj !== undefined) {
+ // show popup message window
+ if (this.popupObj.id !== previousPopupObjId) {
+ if (this.popup === undefined) {
+ this.popup = new Popup(this.canvas.frame);
+ }
+
+ this.popup.popupTargetType = popupType;
+ this.popup.popupTargetId = this.popupObj.id;
+
+ // adjust a small offset such that the mouse cursor is located in the
+ // bottom left location of the popup, and you can easily move over the
+ // popup area
+ this.popup.setPosition(pointer.x + 3, pointer.y - 5);
+ this.popup.setText(this.popupObj.getTitle());
+ this.popup.show();
+ this.body.emitter.emit('showPopup',this.popupObj.id);
+ }
+ }
+ else {
+ if (this.popup !== undefined) {
+ this.popup.hide();
+ this.body.emitter.emit('hidePopup');
+ }
+ }
+ }
+
+
+ /**
+ * Check if the popup must be hidden, which is the case when the mouse is no
+ * longer hovering on the object
+ * @param {{x:number, y:number}} pointer
+ * @private
+ */
+ _checkHidePopup(pointer) {
+ let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);
+
+ let stillOnObj = false;
+ if (this.popup.popupTargetType === 'node') {
+ if (this.body.nodes[this.popup.popupTargetId] !== undefined) {
+ stillOnObj = this.body.nodes[this.popup.popupTargetId].isOverlappingWith(pointerObj);
+
+ // if the mouse is still one the node, we have to check if it is not also on one that is drawn on top of it.
+ // we initially only check stillOnObj because this is much faster.
+ if (stillOnObj === true) {
+ let overNode = this.selectionHandler.getNodeAt(pointer);
+ stillOnObj = overNode === undefined ? false : overNode.id === this.popup.popupTargetId;
+ }
+ }
+ }
+ else {
+ if (this.selectionHandler.getNodeAt(pointer) === undefined) {
+ if (this.body.edges[this.popup.popupTargetId] !== undefined) {
+ stillOnObj = this.body.edges[this.popup.popupTargetId].isOverlappingWith(pointerObj);
+ }
+ }
+ }
+
+
+ if (stillOnObj === false) {
+ this.popupObj = undefined;
+ this.popup.hide();
+ this.body.emitter.emit('hidePopup');
+ }
+ }
+}
+
+export default InteractionHandler;
diff --git a/lib/network/modules/KamadaKawai.js b/lib/network/modules/KamadaKawai.js
new file mode 100644
index 0000000000..415b021dc1
--- /dev/null
+++ b/lib/network/modules/KamadaKawai.js
@@ -0,0 +1,295 @@
+// distance finding algorithm
+import FloydWarshall from "./components/algorithms/FloydWarshall.js"
+
+
+/**
+ * KamadaKawai positions the nodes initially based on
+ *
+ * "AN ALGORITHM FOR DRAWING GENERAL UNDIRECTED GRAPHS"
+ * -- Tomihisa KAMADA and Satoru KAWAI in 1989
+ *
+ * Possible optimizations in the distance calculation can be implemented.
+ */
+class KamadaKawai {
+ /**
+ * @param {Object} body
+ * @param {number} edgeLength
+ * @param {number} edgeStrength
+ */
+ constructor(body, edgeLength, edgeStrength) {
+ this.body = body;
+ this.springLength = edgeLength;
+ this.springConstant = edgeStrength;
+ this.distanceSolver = new FloydWarshall();
+ }
+
+ /**
+ * Not sure if needed but can be used to update the spring length and spring constant
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options) {
+ if (options.springLength) {
+ this.springLength = options.springLength;
+ }
+ if (options.springConstant) {
+ this.springConstant = options.springConstant;
+ }
+ }
+ }
+
+
+ /**
+ * Position the system
+ * @param {Array.} nodesArray
+ * @param {Array.} edgesArray
+ * @param {boolean} [ignoreClusters=false]
+ */
+ solve(nodesArray, edgesArray, ignoreClusters = false) {
+ // get distance matrix
+ let D_matrix = this.distanceSolver.getDistances(this.body, nodesArray, edgesArray); // distance matrix
+
+ // get the L Matrix
+ this._createL_matrix(D_matrix);
+
+ // get the K Matrix
+ this._createK_matrix(D_matrix);
+
+ // initial E Matrix
+ this._createE_matrix();
+
+ // calculate positions
+ let threshold = 0.01;
+ let innerThreshold = 1;
+ let iterations = 0;
+ let maxIterations = Math.max(1000, Math.min(10 * this.body.nodeIndices.length, 6000));
+ let maxInnerIterations = 5;
+
+ let maxEnergy = 1e9;
+ let highE_nodeId = 0, dE_dx = 0, dE_dy = 0, delta_m = 0, subIterations = 0;
+
+ while (maxEnergy > threshold && iterations < maxIterations) {
+ iterations += 1;
+ [highE_nodeId, maxEnergy, dE_dx, dE_dy] = this._getHighestEnergyNode(ignoreClusters);
+ delta_m = maxEnergy;
+ subIterations = 0;
+ while (delta_m > innerThreshold && subIterations < maxInnerIterations) {
+ subIterations += 1;
+ this._moveNode(highE_nodeId, dE_dx, dE_dy);
+ [delta_m, dE_dx, dE_dy] = this._getEnergy(highE_nodeId);
+ }
+ }
+ }
+
+ /**
+ * get the node with the highest energy
+ * @param {boolean} ignoreClusters
+ * @returns {number[]}
+ * @private
+ */
+ _getHighestEnergyNode(ignoreClusters) {
+ let nodesArray = this.body.nodeIndices;
+ let nodes = this.body.nodes;
+ let maxEnergy = 0;
+ let maxEnergyNodeId = nodesArray[0];
+ let dE_dx_max = 0, dE_dy_max = 0;
+
+ for (let nodeIdx = 0; nodeIdx < nodesArray.length; nodeIdx++) {
+ let m = nodesArray[nodeIdx];
+ // by not evaluating nodes with predefined positions we should only move nodes that have no positions.
+ if ((nodes[m].predefinedPosition === false || nodes[m].isCluster === true && ignoreClusters === true) || nodes[m].options.fixed.x === true || nodes[m].options.fixed.y === true) {
+ let [delta_m,dE_dx,dE_dy] = this._getEnergy(m);
+ if (maxEnergy < delta_m) {
+ maxEnergy = delta_m;
+ maxEnergyNodeId = m;
+ dE_dx_max = dE_dx;
+ dE_dy_max = dE_dy;
+ }
+ }
+ }
+
+ return [maxEnergyNodeId, maxEnergy, dE_dx_max, dE_dy_max];
+ }
+
+ /**
+ * calculate the energy of a single node
+ * @param {Node.id} m
+ * @returns {number[]}
+ * @private
+ */
+ _getEnergy(m) {
+ let [dE_dx,dE_dy] = this.E_sums[m];
+ let delta_m = Math.sqrt(Math.pow(dE_dx, 2) + Math.pow(dE_dy, 2));
+ return [delta_m, dE_dx, dE_dy];
+ }
+
+ /**
+ * move the node based on it's energy
+ * the dx and dy are calculated from the linear system proposed by Kamada and Kawai
+ * @param {number} m
+ * @param {number} dE_dx
+ * @param {number} dE_dy
+ * @private
+ */
+ _moveNode(m, dE_dx, dE_dy) {
+ let nodesArray = this.body.nodeIndices;
+ let nodes = this.body.nodes;
+ let d2E_dx2 = 0;
+ let d2E_dxdy = 0;
+ let d2E_dy2 = 0;
+
+ let x_m = nodes[m].x;
+ let y_m = nodes[m].y;
+ let km = this.K_matrix[m];
+ let lm = this.L_matrix[m];
+
+ for (let iIdx = 0; iIdx < nodesArray.length; iIdx++) {
+ let i = nodesArray[iIdx];
+ if (i !== m) {
+ let x_i = nodes[i].x;
+ let y_i = nodes[i].y;
+ let kmat = km[i];
+ let lmat = lm[i];
+ let denominator = 1.0 / Math.pow(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2), 1.5);
+ d2E_dx2 += kmat * (1 - lmat * Math.pow(y_m - y_i, 2) * denominator);
+ d2E_dxdy += kmat * (lmat * (x_m - x_i) * (y_m - y_i) * denominator);
+ d2E_dy2 += kmat * (1 - lmat * Math.pow(x_m - x_i, 2) * denominator);
+ }
+ }
+ // make the variable names easier to make the solving of the linear system easier to read
+ let A = d2E_dx2, B = d2E_dxdy, C = dE_dx, D = d2E_dy2, E = dE_dy;
+
+ // solve the linear system for dx and dy
+ let dy = (C / A + E / B) / (B / A - D / B);
+ let dx = -(B * dy + C) / A;
+
+ // move the node
+ nodes[m].x += dx;
+ nodes[m].y += dy;
+
+ // Recalculate E_matrix (should be incremental)
+ this._updateE_matrix(m);
+ }
+
+
+ /**
+ * Create the L matrix: edge length times shortest path
+ * @param {Object} D_matrix
+ * @private
+ */
+ _createL_matrix(D_matrix) {
+ let nodesArray = this.body.nodeIndices;
+ let edgeLength = this.springLength;
+
+ this.L_matrix = [];
+ for (let i = 0; i < nodesArray.length; i++) {
+ this.L_matrix[nodesArray[i]] = {};
+ for (let j = 0; j < nodesArray.length; j++) {
+ this.L_matrix[nodesArray[i]][nodesArray[j]] = edgeLength * D_matrix[nodesArray[i]][nodesArray[j]];
+ }
+ }
+ }
+
+
+ /**
+ * Create the K matrix: spring constants times shortest path
+ * @param {Object} D_matrix
+ * @private
+ */
+ _createK_matrix(D_matrix) {
+ let nodesArray = this.body.nodeIndices;
+ let edgeStrength = this.springConstant;
+
+ this.K_matrix = [];
+ for (let i = 0; i < nodesArray.length; i++) {
+ this.K_matrix[nodesArray[i]] = {};
+ for (let j = 0; j < nodesArray.length; j++) {
+ this.K_matrix[nodesArray[i]][nodesArray[j]] = edgeStrength * Math.pow(D_matrix[nodesArray[i]][nodesArray[j]], -2);
+ }
+ }
+ }
+
+ /**
+ * Create matrix with all energies between nodes
+ * @private
+ */
+ _createE_matrix() {
+ let nodesArray = this.body.nodeIndices;
+ let nodes = this.body.nodes;
+ this.E_matrix = {};
+ this.E_sums = {};
+ for (let mIdx = 0; mIdx < nodesArray.length; mIdx++) {
+ this.E_matrix[nodesArray[mIdx]] = [];
+ }
+ for (let mIdx = 0; mIdx < nodesArray.length; mIdx++) {
+ let m = nodesArray[mIdx];
+ let x_m = nodes[m].x;
+ let y_m = nodes[m].y;
+ let dE_dx = 0;
+ let dE_dy = 0;
+ for (let iIdx = mIdx; iIdx < nodesArray.length; iIdx++) {
+ let i = nodesArray[iIdx];
+ if (i !== m) {
+ let x_i = nodes[i].x;
+ let y_i = nodes[i].y;
+ let denominator = 1.0 / Math.sqrt(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2));
+ this.E_matrix[m][iIdx] = [
+ this.K_matrix[m][i] * ((x_m - x_i) - this.L_matrix[m][i] * (x_m - x_i) * denominator),
+ this.K_matrix[m][i] * ((y_m - y_i) - this.L_matrix[m][i] * (y_m - y_i) * denominator)
+ ];
+ this.E_matrix[i][mIdx] = this.E_matrix[m][iIdx];
+ dE_dx += this.E_matrix[m][iIdx][0];
+ dE_dy += this.E_matrix[m][iIdx][1];
+ }
+ }
+ //Store sum
+ this.E_sums[m] = [dE_dx, dE_dy];
+ }
+ }
+
+ /**
+ * Update method, just doing single column (rows are auto-updated) (update all sums)
+ *
+ * @param {number} m
+ * @private
+ */
+ _updateE_matrix(m) {
+ let nodesArray = this.body.nodeIndices;
+ let nodes = this.body.nodes;
+ let colm = this.E_matrix[m];
+ let kcolm = this.K_matrix[m];
+ let lcolm = this.L_matrix[m];
+ let x_m = nodes[m].x;
+ let y_m = nodes[m].y;
+ let dE_dx = 0;
+ let dE_dy = 0;
+ for (let iIdx = 0; iIdx < nodesArray.length; iIdx++) {
+ let i = nodesArray[iIdx];
+ if (i !== m) {
+ //Keep old energy value for sum modification below
+ let cell = colm[iIdx];
+ let oldDx = cell[0];
+ let oldDy = cell[1];
+
+ //Calc new energy:
+ let x_i = nodes[i].x;
+ let y_i = nodes[i].y;
+ let denominator = 1.0 / Math.sqrt(Math.pow(x_m - x_i, 2) + Math.pow(y_m - y_i, 2));
+ let dx = kcolm[i] * ((x_m - x_i) - lcolm[i] * (x_m - x_i) * denominator);
+ let dy = kcolm[i] * ((y_m - y_i) - lcolm[i] * (y_m - y_i) * denominator);
+ colm[iIdx] = [dx, dy];
+ dE_dx += dx;
+ dE_dy += dy;
+
+ //add new energy to sum of each column
+ let sum = this.E_sums[i];
+ sum[0] += (dx-oldDx);
+ sum[1] += (dy-oldDy);
+ }
+ }
+ //Store sum at -1 index
+ this.E_sums[m] = [dE_dx, dE_dy];
+ }
+}
+
+export default KamadaKawai;
\ No newline at end of file
diff --git a/lib/network/modules/LayoutEngine.js b/lib/network/modules/LayoutEngine.js
new file mode 100644
index 0000000000..2512a289a8
--- /dev/null
+++ b/lib/network/modules/LayoutEngine.js
@@ -0,0 +1,1742 @@
+/**
+ * There's a mix-up with terms in the code. Following are the formal definitions:
+ *
+ * tree - a strict hierarchical network, i.e. every node has at most one parent
+ * forest - a collection of trees. These distinct trees are thus not connected.
+ *
+ * So:
+ * - in a network that is not a tree, there exist nodes with multiple parents.
+ * - a network consisting of unconnected sub-networks, of which at least one
+ * is not a tree, is not a forest.
+ *
+ * In the code, the definitions are:
+ *
+ * tree - any disconnected sub-network, strict hierarchical or not.
+ * forest - a bunch of these sub-networks
+ *
+ * The difference between tree and not-tree is important in the code, notably within
+ * to the block-shifting algorithm. The algorithm assumes formal trees and fails
+ * for not-trees, often in a spectacular manner (search for 'exploding network' in the issues).
+ *
+ * In order to distinguish the definitions in the following code, the adjective 'formal' is
+ * used. If 'formal' is absent, you must assume the non-formal definition.
+ *
+ * ----------------------------------------------------------------------------------
+ * NOTES
+ * =====
+ *
+ * A hierarchical layout is a different thing from a hierarchical network.
+ * The layout is a way to arrange the nodes in the view; this can be done
+ * on non-hierarchical networks as well. The converse is also possible.
+ */
+'use strict';
+import TimSort from 'timsort';
+import util from 'vis-util';
+import NetworkUtil from '../NetworkUtil';
+import { HorizontalStrategy, VerticalStrategy } from './components/DirectionStrategy.js';
+
+
+/**
+ * Container for derived data on current network, relating to hierarchy.
+ *
+ * @private
+ */
+class HierarchicalStatus {
+ /**
+ * @ignore
+ */
+ constructor() {
+ this.childrenReference = {}; // child id's per node id
+ this.parentReference = {}; // parent id's per node id
+ this.trees = {}; // tree id per node id; i.e. to which tree does given node id belong
+
+ this.distributionOrdering = {}; // The nodes per level, in the display order
+ this.levels = {}; // hierarchy level per node id
+ this.distributionIndex = {}; // The position of the node in the level sorting order, per node id.
+
+ this.isTree = false; // True if current network is a formal tree
+ this.treeIndex = -1; // Highest tree id in current network.
+ }
+
+ /**
+ * Add the relation between given nodes to the current state.
+ *
+ * @param {Node.id} parentNodeId
+ * @param {Node.id} childNodeId
+ */
+ addRelation(parentNodeId, childNodeId) {
+ if (this.childrenReference[parentNodeId] === undefined) {
+ this.childrenReference[parentNodeId] = [];
+ }
+ this.childrenReference[parentNodeId].push(childNodeId);
+
+ if (this.parentReference[childNodeId] === undefined) {
+ this.parentReference[childNodeId] = [];
+ }
+ this.parentReference[childNodeId].push(parentNodeId);
+ }
+
+
+ /**
+ * Check if the current state is for a formal tree or formal forest.
+ *
+ * This is the case if every node has at most one parent.
+ *
+ * Pre: parentReference init'ed properly for current network
+ */
+ checkIfTree() {
+ for (let i in this.parentReference) {
+ if (this.parentReference[i].length > 1) {
+ this.isTree = false;
+ return;
+ }
+ }
+
+ this.isTree = true;
+ }
+
+
+ /**
+ * Return the number of separate trees in the current network.
+ * @returns {number}
+ */
+ numTrees() {
+ return (this.treeIndex + 1); // This assumes the indexes are assigned consecitively
+ }
+
+
+ /**
+ * Assign a tree id to a node
+ * @param {Node} node
+ * @param {string|number} treeId
+ */
+ setTreeIndex(node, treeId) {
+ if (treeId === undefined) return; // Don't bother
+
+ if (this.trees[node.id] === undefined) {
+ this.trees[node.id] = treeId;
+ this.treeIndex = Math.max(treeId, this.treeIndex);
+ }
+ }
+
+
+ /**
+ * Ensure level for given id is defined.
+ *
+ * Sets level to zero for given node id if not already present
+ *
+ * @param {Node.id} nodeId
+ */
+ ensureLevel(nodeId) {
+ if (this.levels[nodeId] === undefined) {
+ this.levels[nodeId] = 0;
+ }
+ }
+
+
+ /**
+ * get the maximum level of a branch.
+ *
+ * TODO: Never entered; find a test case to test this!
+ * @param {Node.id} nodeId
+ * @returns {number}
+ */
+ getMaxLevel(nodeId) {
+ let accumulator = {};
+
+ let _getMaxLevel = (nodeId) => {
+ if (accumulator[nodeId] !== undefined) {
+ return accumulator[nodeId];
+ }
+ let level = this.levels[nodeId];
+ if (this.childrenReference[nodeId]) {
+ let children = this.childrenReference[nodeId];
+ if (children.length > 0) {
+ for (let i = 0; i < children.length; i++) {
+ level = Math.max(level,_getMaxLevel(children[i]));
+ }
+ }
+ }
+ accumulator[nodeId] = level;
+ return level;
+ };
+
+ return _getMaxLevel(nodeId);
+ }
+
+
+ /**
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ */
+ levelDownstream(nodeA, nodeB) {
+ if (this.levels[nodeB.id] === undefined) {
+ // set initial level
+ if (this.levels[nodeA.id] === undefined) {
+ this.levels[nodeA.id] = 0;
+ }
+ // set level
+ this.levels[nodeB.id] = this.levels[nodeA.id] + 1;
+ }
+ }
+
+
+ /**
+ * Small util method to set the minimum levels of the nodes to zero.
+ *
+ * @param {Array.} nodes
+ */
+ setMinLevelToZero(nodes) {
+ let minLevel = 1e9;
+ // get the minimum level
+ for (let nodeId in nodes) {
+ if (nodes.hasOwnProperty(nodeId)) {
+ if (this.levels[nodeId] !== undefined) {
+ minLevel = Math.min(this.levels[nodeId], minLevel);
+ }
+ }
+ }
+
+ // subtract the minimum from the set so we have a range starting from 0
+ for (let nodeId in nodes) {
+ if (nodes.hasOwnProperty(nodeId)) {
+ if (this.levels[nodeId] !== undefined) {
+ this.levels[nodeId] -= minLevel;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Get the min and max xy-coordinates of a given tree
+ *
+ * @param {Array.} nodes
+ * @param {number} index
+ * @returns {{min_x: number, max_x: number, min_y: number, max_y: number}}
+ */
+ getTreeSize(nodes, index) {
+ let min_x = 1e9;
+ let max_x = -1e9;
+ let min_y = 1e9;
+ let max_y = -1e9;
+
+ for (let nodeId in this.trees) {
+ if (this.trees.hasOwnProperty(nodeId)) {
+ if (this.trees[nodeId] === index) {
+ let node = nodes[nodeId];
+ min_x = Math.min(node.x, min_x);
+ max_x = Math.max(node.x, max_x);
+ min_y = Math.min(node.y, min_y);
+ max_y = Math.max(node.y, max_y);
+ }
+ }
+ }
+
+ return {
+ min_x: min_x,
+ max_x: max_x,
+ min_y: min_y,
+ max_y: max_y
+ };
+ }
+
+
+ /**
+ * Check if two nodes have the same parent(s)
+ *
+ * @param {Node} node1
+ * @param {Node} node2
+ * @return {boolean} true if the two nodes have a same ancestor node, false otherwise
+ */
+ hasSameParent(node1, node2) {
+ let parents1 = this.parentReference[node1.id];
+ let parents2 = this.parentReference[node2.id];
+ if (parents1 === undefined || parents2 === undefined) {
+ return false;
+ }
+
+ for (let i = 0; i < parents1.length; i++) {
+ for (let j = 0; j < parents2.length; j++) {
+ if (parents1[i] == parents2[j]) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * Check if two nodes are in the same tree.
+ *
+ * @param {Node} node1
+ * @param {Node} node2
+ * @return {Boolean} true if this is so, false otherwise
+ */
+ inSameSubNetwork(node1, node2) {
+ return (this.trees[node1.id] === this.trees[node2.id]);
+ }
+
+
+ /**
+ * Get a list of the distinct levels in the current network
+ *
+ * @returns {Array}
+ */
+ getLevels() {
+ return Object.keys(this.distributionOrdering);
+ }
+
+
+ /**
+ * Add a node to the ordering per level
+ *
+ * @param {Node} node
+ * @param {number} level
+ */
+ addToOrdering(node, level) {
+ if (this.distributionOrdering[level] === undefined) {
+ this.distributionOrdering[level] = [];
+ }
+
+ var isPresent = false;
+ var curLevel = this.distributionOrdering[level];
+ for (var n in curLevel) {
+ //if (curLevel[n].id === node.id) {
+ if (curLevel[n] === node) {
+ isPresent = true;
+ break;
+ }
+ }
+
+ if (!isPresent) {
+ this.distributionOrdering[level].push(node);
+ this.distributionIndex[node.id] = this.distributionOrdering[level].length - 1;
+ }
+ }
+}
+
+/**
+ * The Layout Engine
+ */
+class LayoutEngine {
+ /**
+ * @param {Object} body
+ */
+ constructor(body) {
+ this.body = body;
+
+ this.initialRandomSeed = Math.round(Math.random() * 1000000);
+ this.randomSeed = this.initialRandomSeed;
+ this.setPhysics = false;
+ this.options = {};
+ this.optionsBackup = {physics:{}};
+
+ this.defaultOptions = {
+ randomSeed: undefined,
+ improvedLayout: true,
+ hierarchical: {
+ enabled:false,
+ levelSeparation: 150,
+ nodeSpacing: 100,
+ treeSpacing: 200,
+ blockShifting: true,
+ edgeMinimization: true,
+ parentCentralization: true,
+ direction: 'UD', // UD, DU, LR, RL
+ sortMethod: 'hubsize' // hubsize, directed
+ }
+ };
+ util.extend(this.options, this.defaultOptions);
+ this.bindEventListeners();
+ }
+
+ /**
+ * Binds event listeners
+ */
+ bindEventListeners() {
+ this.body.emitter.on('_dataChanged', () => {
+ this.setupHierarchicalLayout();
+ });
+ this.body.emitter.on('_dataLoaded', () => {
+ this.layoutNetwork();
+ });
+ this.body.emitter.on('_resetHierarchicalLayout', () => {
+ this.setupHierarchicalLayout();
+ });
+ this.body.emitter.on('_adjustEdgesForHierarchicalLayout', () => {
+ if (this.options.hierarchical.enabled !== true) {
+ return;
+ }
+ // get the type of static smooth curve in case it is required
+ let type = this.direction.curveType();
+
+ // force all edges into static smooth curves.
+ this.body.emitter.emit('_forceDisableDynamicCurves', type, false);
+ });
+ }
+
+ /**
+ *
+ * @param {Object} options
+ * @param {Object} allOptions
+ * @returns {Object}
+ */
+ setOptions(options, allOptions) {
+ if (options !== undefined) {
+ let hierarchical = this.options.hierarchical;
+ let prevHierarchicalState = hierarchical.enabled;
+ util.selectiveDeepExtend(["randomSeed", "improvedLayout"],this.options, options);
+ util.mergeOptions(this.options, options, 'hierarchical');
+ if (options.randomSeed !== undefined) {this.initialRandomSeed = options.randomSeed;}
+
+ if (hierarchical.enabled === true) {
+ if (prevHierarchicalState === true) {
+ // refresh the overridden options for nodes and edges.
+ this.body.emitter.emit('refresh', true);
+ }
+
+ // make sure the level separation is the right way up
+ if (hierarchical.direction === 'RL' || hierarchical.direction === 'DU') {
+ if (hierarchical.levelSeparation > 0) {
+ hierarchical.levelSeparation *= -1;
+ }
+ }
+ else {
+ if (hierarchical.levelSeparation < 0) {
+ hierarchical.levelSeparation *= -1;
+ }
+ }
+
+ this.setDirectionStrategy();
+
+ this.body.emitter.emit('_resetHierarchicalLayout');
+ // because the hierarchical system needs it's own physics and smooth curve settings,
+ // we adapt the other options if needed.
+ return this.adaptAllOptionsForHierarchicalLayout(allOptions);
+ }
+ else {
+ if (prevHierarchicalState === true) {
+ // refresh the overridden options for nodes and edges.
+ this.body.emitter.emit('refresh');
+ return util.deepExtend(allOptions,this.optionsBackup);
+ }
+ }
+ }
+ return allOptions;
+ }
+
+ /**
+ *
+ * @param {Object} allOptions
+ * @returns {Object}
+ */
+ adaptAllOptionsForHierarchicalLayout(allOptions) {
+ if (this.options.hierarchical.enabled === true) {
+ let backupPhysics = this.optionsBackup.physics;
+
+ // set the physics
+ if (allOptions.physics === undefined || allOptions.physics === true) {
+ allOptions.physics = {
+ enabled: backupPhysics.enabled === undefined ? true : backupPhysics.enabled,
+ solver :'hierarchicalRepulsion'
+ };
+ backupPhysics.enabled = backupPhysics.enabled === undefined ? true : backupPhysics.enabled;
+ backupPhysics.solver = backupPhysics.solver || 'barnesHut';
+ }
+ else if (typeof allOptions.physics === 'object') {
+ backupPhysics.enabled = allOptions.physics.enabled === undefined ? true : allOptions.physics.enabled;
+ backupPhysics.solver = allOptions.physics.solver || 'barnesHut';
+ allOptions.physics.solver = 'hierarchicalRepulsion';
+ }
+ else if (allOptions.physics !== false) {
+ backupPhysics.solver ='barnesHut';
+ allOptions.physics = {solver:'hierarchicalRepulsion'};
+ }
+
+ // get the type of static smooth curve in case it is required
+ let type = this.direction.curveType();
+
+ // disable smooth curves if nothing is defined. If smooth curves have been turned on,
+ // turn them into static smooth curves.
+ if (allOptions.edges === undefined) {
+ this.optionsBackup.edges = {smooth:{enabled:true, type:'dynamic'}};
+ allOptions.edges = {smooth: false};
+ }
+ else if (allOptions.edges.smooth === undefined) {
+ this.optionsBackup.edges = {smooth:{enabled:true, type:'dynamic'}};
+ allOptions.edges.smooth = false;
+ }
+ else {
+ if (typeof allOptions.edges.smooth === 'boolean') {
+ this.optionsBackup.edges = {smooth:allOptions.edges.smooth};
+ allOptions.edges.smooth = {enabled: allOptions.edges.smooth, type:type}
+ }
+ else {
+ let smooth = allOptions.edges.smooth;
+
+ // allow custom types except for dynamic
+ if (smooth.type !== undefined && smooth.type !== 'dynamic') {
+ type = smooth.type;
+ }
+
+ // TODO: this is options merging; see if the standard routines can be used here.
+ this.optionsBackup.edges = {
+ smooth : smooth.enabled === undefined ? true : smooth.enabled,
+ type : smooth.type === undefined ? 'dynamic': smooth.type,
+ roundness : smooth.roundness === undefined ? 0.5 : smooth.roundness,
+ forceDirection: smooth.forceDirection === undefined ? false : smooth.forceDirection
+ };
+
+
+ // NOTE: Copying an object to self; this is basically setting defaults for undefined variables
+ allOptions.edges.smooth = {
+ enabled : smooth.enabled === undefined ? true : smooth.enabled,
+ type : type,
+ roundness : smooth.roundness === undefined ? 0.5 : smooth.roundness,
+ forceDirection: smooth.forceDirection === undefined ? false: smooth.forceDirection
+ }
+ }
+ }
+
+ // Force all edges into static smooth curves.
+ // Only applies to edges that do not use the global options for smooth.
+ this.body.emitter.emit('_forceDisableDynamicCurves', type);
+ }
+
+ return allOptions;
+ }
+
+ /**
+ *
+ * @returns {number}
+ */
+ seededRandom() {
+ let x = Math.sin(this.randomSeed++) * 10000;
+ return x - Math.floor(x);
+ }
+
+ /**
+ *
+ * @param {Array.} nodesArray
+ */
+ positionInitially(nodesArray) {
+ if (this.options.hierarchical.enabled !== true) {
+ this.randomSeed = this.initialRandomSeed;
+ let radius = nodesArray.length + 50;
+ for (let i = 0; i < nodesArray.length; i++) {
+ let node = nodesArray[i];
+ let angle = 2 * Math.PI * this.seededRandom();
+ if (node.x === undefined) {
+ node.x = radius * Math.cos(angle);
+ }
+ if (node.y === undefined) {
+ node.y = radius * Math.sin(angle);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Use Kamada Kawai to position nodes. This is quite a heavy algorithm so if there are a lot of nodes we
+ * cluster them first to reduce the amount.
+ */
+ layoutNetwork() {
+ if (this.options.hierarchical.enabled !== true && this.options.improvedLayout === true) {
+ let indices = this.body.nodeIndices;
+
+ // first check if we should Kamada Kawai to layout. The threshold is if less than half of the visible
+ // nodes have predefined positions we use this.
+ let positionDefined = 0;
+ for (let i = 0; i < indices.length; i++) {
+ let node = this.body.nodes[indices[i]];
+ if (node.predefinedPosition === true) {
+ positionDefined += 1;
+ }
+ }
+
+ // if less than half of the nodes have a predefined position we continue
+ if (positionDefined < 0.5 * indices.length) {
+ let MAX_LEVELS = 10;
+ let level = 0;
+ let clusterThreshold = 150; // TODO add this to options
+
+ //
+ // Define the options for the hidden cluster nodes
+ // These options don't propagate outside the clustering phase.
+ //
+ // Some options are explicitly disabled, because they may be set in group or default node options.
+ // The clusters are never displayed, so most explicit settings here serve as performance optimizations.
+ //
+ // The explicit setting of 'shape' is to avoid `shape: 'image'`; images are not passed to the hidden
+ // cluster nodes, leading to an exception on creation.
+ //
+ // All settings here are performance related, except when noted otherwise.
+ //
+ let clusterOptions = {
+ clusterNodeProperties:{
+ shape: 'ellipse', // Bugfix: avoid type 'image', no images supplied
+ label: '', // avoid label handling
+ group: '', // avoid group handling
+ font: {multi: false}, // avoid font propagation
+ },
+ clusterEdgeProperties:{
+ label: '', // avoid label handling
+ font: {multi: false}, // avoid font propagation
+ smooth: {
+ enabled: false // avoid drawing penalty for complex edges
+ }
+ }
+ };
+
+ // if there are a lot of nodes, we cluster before we run the algorithm.
+ // NOTE: this part fails to find clusters for large scale-free networks, which should
+ // be easily clusterable.
+ // TODO: examine why this is so
+ if (indices.length > clusterThreshold) {
+ let startLength = indices.length;
+ while (indices.length > clusterThreshold && level <= MAX_LEVELS) {
+ //console.time("clustering")
+ level += 1;
+ let before = indices.length;
+ // if there are many nodes we do a hubsize cluster
+ if (level % 3 === 0) {
+ this.body.modules.clustering.clusterBridges(clusterOptions);
+ }
+ else {
+ this.body.modules.clustering.clusterOutliers(clusterOptions);
+ }
+ let after = indices.length;
+ if (before == after && level % 3 !== 0) {
+ this._declusterAll();
+ this.body.emitter.emit("_layoutFailed");
+ console.info("This network could not be positioned by this version of the improved layout algorithm."
+ + " Please disable improvedLayout for better performance.");
+ return;
+ }
+ //console.timeEnd("clustering")
+ //console.log(before,level,after);
+ }
+ // increase the size of the edges
+ this.body.modules.kamadaKawai.setOptions({springLength: Math.max(150, 2 * startLength)})
+ }
+ if (level > MAX_LEVELS){
+ console.info("The clustering didn't succeed within the amount of interations allowed,"
+ + " progressing with partial result.");
+ }
+
+ // position the system for these nodes and edges
+ this.body.modules.kamadaKawai.solve(indices, this.body.edgeIndices, true);
+
+ // shift to center point
+ this._shiftToCenter();
+
+ // perturb the nodes a little bit to force the physics to kick in
+ let offset = 70;
+ for (let i = 0; i < indices.length; i++) {
+ // Only perturb the nodes that aren't fixed
+ let node = this.body.nodes[indices[i]];
+ if (node.predefinedPosition === false) {
+ node.x += (0.5 - this.seededRandom())*offset;
+ node.y += (0.5 - this.seededRandom())*offset;
+ }
+ }
+
+ // uncluster all clusters
+ this._declusterAll();
+
+ // reposition all bezier nodes.
+ this.body.emitter.emit("_repositionBezierNodes");
+ }
+ }
+ }
+
+ /**
+ * Move all the nodes towards to the center so gravitational pull wil not move the nodes away from view
+ * @private
+ */
+ _shiftToCenter() {
+ let range = NetworkUtil.getRangeCore(this.body.nodes, this.body.nodeIndices);
+ let center = NetworkUtil.findCenter(range);
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ let node = this.body.nodes[this.body.nodeIndices[i]];
+ node.x -= center.x;
+ node.y -= center.y;
+ }
+ }
+
+ /**
+ * Expands all clusters
+ * @private
+ */
+ _declusterAll() {
+ let clustersPresent = true;
+ while (clustersPresent === true) {
+ clustersPresent = false;
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ if (this.body.nodes[this.body.nodeIndices[i]].isCluster === true) {
+ clustersPresent = true;
+ this.body.modules.clustering.openCluster(this.body.nodeIndices[i], {}, false);
+ }
+ }
+ if (clustersPresent === true) {
+ this.body.emitter.emit('_dataChanged');
+ }
+ }
+ }
+
+ /**
+ *
+ * @returns {number|*}
+ */
+ getSeed() {
+ return this.initialRandomSeed;
+ }
+
+ /**
+ * This is the main function to layout the nodes in a hierarchical way.
+ * It checks if the node details are supplied correctly
+ *
+ * @private
+ */
+ setupHierarchicalLayout() {
+ if (this.options.hierarchical.enabled === true && this.body.nodeIndices.length > 0) {
+ // get the size of the largest hubs and check if the user has defined a level for a node.
+ let node, nodeId;
+ let definedLevel = false;
+ let undefinedLevel = false;
+ this.lastNodeOnLevel = {};
+ this.hierarchical = new HierarchicalStatus();
+
+ for (nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId)) {
+ node = this.body.nodes[nodeId];
+ if (node.options.level !== undefined) {
+ definedLevel = true;
+ this.hierarchical.levels[nodeId] = node.options.level;
+ }
+ else {
+ undefinedLevel = true;
+ }
+ }
+ }
+
+ // if the user defined some levels but not all, alert and run without hierarchical layout
+ if (undefinedLevel === true && definedLevel === true) {
+ throw new Error('To use the hierarchical layout, nodes require either no predefined levels'
+ + ' or levels have to be defined for all nodes.');
+ }
+ else {
+ // define levels if undefined by the users. Based on hubsize.
+ if (undefinedLevel === true) {
+ let sortMethod = this.options.hierarchical.sortMethod;
+ if (sortMethod === 'hubsize') {
+ this._determineLevelsByHubsize();
+ }
+ else if (sortMethod === 'directed') {
+ this._determineLevelsDirected();
+ }
+ else if (sortMethod === 'custom') {
+ this._determineLevelsCustomCallback();
+ }
+ }
+
+
+ // fallback for cases where there are nodes but no edges
+ for (let nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId)) {
+ this.hierarchical.ensureLevel(nodeId);
+ }
+ }
+ // check the distribution of the nodes per level.
+ let distribution = this._getDistribution();
+
+ // get the parent children relations.
+ this._generateMap();
+
+ // place the nodes on the canvas.
+ this._placeNodesByHierarchy(distribution);
+
+ // condense the whitespace.
+ this._condenseHierarchy();
+
+ // shift to center so gravity does not have to do much
+ this._shiftToCenter();
+ }
+ }
+ }
+
+ /**
+ * @private
+ */
+ _condenseHierarchy() {
+ // Global var in this scope to define when the movement has stopped.
+ let stillShifting = false;
+ let branches = {};
+ // first we have some methods to help shifting trees around.
+ // the main method to shift the trees
+ let shiftTrees = () => {
+ let treeSizes = getTreeSizes();
+ let shiftBy = 0;
+ for (let i = 0; i < treeSizes.length - 1; i++) {
+ let diff = treeSizes[i].max - treeSizes[i+1].min;
+ shiftBy += diff + this.options.hierarchical.treeSpacing;
+ shiftTree(i + 1, shiftBy);
+ }
+ };
+
+ // shift a single tree by an offset
+ let shiftTree = (index, offset) => {
+ let trees = this.hierarchical.trees;
+
+ for (let nodeId in trees) {
+ if (trees.hasOwnProperty(nodeId)) {
+ if (trees[nodeId] === index) {
+ this.direction.shift(nodeId, offset);
+ }
+ }
+ }
+ };
+
+ // get the width of all trees
+ let getTreeSizes = () => {
+ let treeWidths = [];
+ for (let i = 0; i < this.hierarchical.numTrees(); i++) {
+ treeWidths.push(this.direction.getTreeSize(i));
+ }
+ return treeWidths;
+ };
+
+
+ // get a map of all nodes in this branch
+ let getBranchNodes = (source, map) => {
+ if (map[source.id]) {
+ return;
+ }
+ map[source.id] = true;
+ if (this.hierarchical.childrenReference[source.id]) {
+ let children = this.hierarchical.childrenReference[source.id];
+ if (children.length > 0) {
+ for (let i = 0; i < children.length; i++) {
+ getBranchNodes(this.body.nodes[children[i]], map);
+ }
+ }
+ }
+ };
+
+ // get a min max width as well as the maximum movement space it has on either sides
+ // we use min max terminology because width and height can interchange depending on the direction of the layout
+ let getBranchBoundary = (branchMap, maxLevel = 1e9) => {
+ let minSpace = 1e9;
+ let maxSpace = 1e9;
+ let min = 1e9;
+ let max = -1e9;
+ for (let branchNode in branchMap) {
+ if (branchMap.hasOwnProperty(branchNode)) {
+ let node = this.body.nodes[branchNode];
+ let level = this.hierarchical.levels[node.id];
+ let position = this.direction.getPosition(node);
+
+ // get the space around the node.
+ let [minSpaceNode, maxSpaceNode] = this._getSpaceAroundNode(node,branchMap);
+ minSpace = Math.min(minSpaceNode, minSpace);
+ maxSpace = Math.min(maxSpaceNode, maxSpace);
+
+ // the width is only relevant for the levels two nodes have in common. This is why we filter on this.
+ if (level <= maxLevel) {
+ min = Math.min(position, min);
+ max = Math.max(position, max);
+ }
+ }
+ }
+
+ return [min, max, minSpace, maxSpace];
+ }
+
+
+ // check what the maximum level is these nodes have in common.
+ let getCollisionLevel = (node1, node2) => {
+ let maxLevel1 = this.hierarchical.getMaxLevel(node1.id);
+ let maxLevel2 = this.hierarchical.getMaxLevel(node2.id);
+ return Math.min(maxLevel1, maxLevel2);
+ };
+
+
+ /**
+ * Condense elements. These can be nodes or branches depending on the callback.
+ *
+ * @param {function} callback
+ * @param {Array.} levels
+ * @param {*} centerParents
+ */
+ let shiftElementsCloser = (callback, levels, centerParents) => {
+ let hier = this.hierarchical;
+
+ for (let i = 0; i < levels.length; i++) {
+ let level = levels[i];
+ let levelNodes = hier.distributionOrdering[level];
+ if (levelNodes.length > 1) {
+ for (let j = 0; j < levelNodes.length - 1; j++) {
+ let node1 = levelNodes[j];
+ let node2 = levelNodes[j+1];
+
+ // NOTE: logic maintained as it was; if nodes have same ancestor,
+ // then of course they are in the same sub-network.
+ if (hier.hasSameParent(node1, node2) && hier.inSameSubNetwork(node1, node2) ) {
+ callback(node1, node2, centerParents);
+ }
+ }
+ }
+ }
+ };
+
+
+ // callback for shifting branches
+ let branchShiftCallback = (node1, node2, centerParent = false) => {
+ //window.CALLBACKS.push(() => {
+ let pos1 = this.direction.getPosition(node1);
+ let pos2 = this.direction.getPosition(node2);
+ let diffAbs = Math.abs(pos2 - pos1);
+ let nodeSpacing = this.options.hierarchical.nodeSpacing;
+ //console.log("NOW CHECKING:", node1.id, node2.id, diffAbs);
+ if (diffAbs > nodeSpacing) {
+ let branchNodes1 = {};
+ let branchNodes2 = {};
+
+ getBranchNodes(node1, branchNodes1);
+ getBranchNodes(node2, branchNodes2);
+
+ // check the largest distance between the branches
+ let maxLevel = getCollisionLevel(node1, node2);
+ let branchNodeBoundary1 = getBranchBoundary(branchNodes1, maxLevel);
+ let branchNodeBoundary2 = getBranchBoundary(branchNodes2, maxLevel);
+ let max1 = branchNodeBoundary1[1];
+ let min2 = branchNodeBoundary2[0];
+ let minSpace2 = branchNodeBoundary2[2];
+
+ //console.log(node1.id, getBranchBoundary(branchNodes1, maxLevel), node2.id,
+ // getBranchBoundary(branchNodes2, maxLevel), maxLevel);
+ let diffBranch = Math.abs(max1 - min2);
+ if (diffBranch > nodeSpacing) {
+ let offset = max1 - min2 + nodeSpacing;
+ if (offset < -minSpace2 + nodeSpacing) {
+ offset = -minSpace2 + nodeSpacing;
+ //console.log("RESETTING OFFSET", max1 - min2 + this.options.hierarchical.nodeSpacing, -minSpace2, offset);
+ }
+ if (offset < 0) {
+ //console.log("SHIFTING", node2.id, offset);
+ this._shiftBlock(node2.id, offset);
+ stillShifting = true;
+
+ if (centerParent === true)
+ this._centerParent(node2);
+ }
+ }
+
+ }
+ //this.body.emitter.emit("_redraw");})
+ };
+
+ let minimizeEdgeLength = (iterations, node) => {
+ //window.CALLBACKS.push(() => {
+ // console.log("ts",node.id);
+ let nodeId = node.id;
+ let allEdges = node.edges;
+ let nodeLevel = this.hierarchical.levels[node.id];
+
+ // gather constants
+ let C2 = this.options.hierarchical.levelSeparation * this.options.hierarchical.levelSeparation;
+ let referenceNodes = {};
+ let aboveEdges = [];
+ for (let i = 0; i < allEdges.length; i++) {
+ let edge = allEdges[i];
+ if (edge.toId != edge.fromId) {
+ let otherNode = edge.toId == nodeId ? edge.from : edge.to;
+ referenceNodes[allEdges[i].id] = otherNode;
+ if (this.hierarchical.levels[otherNode.id] < nodeLevel) {
+ aboveEdges.push(edge);
+ }
+ }
+ }
+
+ // differentiated sum of lengths based on only moving one node over one axis
+ let getFx = (point, edges) => {
+ let sum = 0;
+ for (let i = 0; i < edges.length; i++) {
+ if (referenceNodes[edges[i].id] !== undefined) {
+ let a = this.direction.getPosition(referenceNodes[edges[i].id]) - point;
+ sum += a / Math.sqrt(a * a + C2);
+ }
+ }
+ return sum;
+ };
+
+ // doubly differentiated sum of lengths based on only moving one node over one axis
+ let getDFx = (point, edges) => {
+ let sum = 0;
+ for (let i = 0; i < edges.length; i++) {
+ if (referenceNodes[edges[i].id] !== undefined) {
+ let a = this.direction.getPosition(referenceNodes[edges[i].id]) - point;
+ sum -= (C2 * Math.pow(a * a + C2, -1.5));
+ }
+ }
+ return sum;
+ };
+
+ let getGuess = (iterations, edges) => {
+ let guess = this.direction.getPosition(node);
+ // Newton's method for optimization
+ let guessMap = {};
+ for (let i = 0; i < iterations; i++) {
+ let fx = getFx(guess, edges);
+ let dfx = getDFx(guess, edges);
+
+ // we limit the movement to avoid instability.
+ let limit = 40;
+ let ratio = Math.max(-limit, Math.min(limit, Math.round(fx/dfx)));
+ guess = guess - ratio;
+ // reduce duplicates
+ if (guessMap[guess] !== undefined) {
+ break;
+ }
+ guessMap[guess] = i;
+ }
+ return guess;
+ };
+
+ let moveBranch = (guess) => {
+ // position node if there is space
+ let nodePosition = this.direction.getPosition(node);
+
+ // check movable area of the branch
+ if (branches[node.id] === undefined) {
+ let branchNodes = {};
+ getBranchNodes(node, branchNodes);
+ branches[node.id] = branchNodes;
+ }
+ let branchBoundary = getBranchBoundary(branches[node.id]);
+ let minSpaceBranch = branchBoundary[2];
+ let maxSpaceBranch = branchBoundary[3];
+
+ let diff = guess - nodePosition;
+
+ // check if we are allowed to move the node:
+ let branchOffset = 0;
+ if (diff > 0) {
+ branchOffset = Math.min(diff, maxSpaceBranch - this.options.hierarchical.nodeSpacing);
+ }
+ else if (diff < 0) {
+ branchOffset = -Math.min(-diff, minSpaceBranch - this.options.hierarchical.nodeSpacing);
+ }
+
+ if (branchOffset != 0) {
+ //console.log("moving branch:",branchOffset, maxSpaceBranch, minSpaceBranch)
+ this._shiftBlock(node.id, branchOffset);
+ //this.body.emitter.emit("_redraw");
+ stillShifting = true;
+ }
+ };
+
+ let moveNode = (guess) => {
+ let nodePosition = this.direction.getPosition(node);
+
+ // position node if there is space
+ let [minSpace, maxSpace] = this._getSpaceAroundNode(node);
+ let diff = guess - nodePosition;
+ // check if we are allowed to move the node:
+ let newPosition = nodePosition;
+ if (diff > 0) {
+ newPosition = Math.min(nodePosition + (maxSpace - this.options.hierarchical.nodeSpacing), guess);
+ }
+ else if (diff < 0) {
+ newPosition = Math.max(nodePosition - (minSpace - this.options.hierarchical.nodeSpacing), guess);
+ }
+
+ if (newPosition !== nodePosition) {
+ //console.log("moving Node:",diff, minSpace, maxSpace);
+ this.direction.setPosition(node, newPosition);
+ //this.body.emitter.emit("_redraw");
+ stillShifting = true;
+ }
+ };
+
+ let guess = getGuess(iterations, aboveEdges);
+ moveBranch(guess);
+ guess = getGuess(iterations, allEdges);
+ moveNode(guess);
+ //})
+ };
+
+ // method to remove whitespace between branches. Because we do bottom up, we can center the parents.
+ let minimizeEdgeLengthBottomUp = (iterations) => {
+ let levels = this.hierarchical.getLevels();
+ levels = levels.reverse();
+ for (let i = 0; i < iterations; i++) {
+ stillShifting = false;
+ for (let j = 0; j < levels.length; j++) {
+ let level = levels[j];
+ let levelNodes = this.hierarchical.distributionOrdering[level];
+ for (let k = 0; k < levelNodes.length; k++) {
+ minimizeEdgeLength(1000, levelNodes[k]);
+ }
+ }
+ if (stillShifting !== true) {
+ //console.log("FINISHED minimizeEdgeLengthBottomUp IN " + i);
+ break;
+ }
+ }
+ };
+
+ // method to remove whitespace between branches. Because we do bottom up, we can center the parents.
+ let shiftBranchesCloserBottomUp = (iterations) => {
+ let levels = this.hierarchical.getLevels();
+ levels = levels.reverse();
+ for (let i = 0; i < iterations; i++) {
+ stillShifting = false;
+ shiftElementsCloser(branchShiftCallback, levels, true);
+ if (stillShifting !== true) {
+ //console.log("FINISHED shiftBranchesCloserBottomUp IN " + (i+1));
+ break;
+ }
+ }
+ };
+
+ // center all parents
+ let centerAllParents = () => {
+ for (let nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId))
+ this._centerParent(this.body.nodes[nodeId]);
+ }
+ };
+
+ // center all parents
+ let centerAllParentsBottomUp = () => {
+ let levels = this.hierarchical.getLevels();
+ levels = levels.reverse();
+ for (let i = 0; i < levels.length; i++) {
+ let level = levels[i];
+ let levelNodes = this.hierarchical.distributionOrdering[level];
+ for (let j = 0; j < levelNodes.length; j++) {
+ this._centerParent(levelNodes[j]);
+ }
+ }
+ };
+
+ // the actual work is done here.
+ if (this.options.hierarchical.blockShifting === true) {
+ shiftBranchesCloserBottomUp(5);
+ centerAllParents();
+ }
+
+ // minimize edge length
+ if (this.options.hierarchical.edgeMinimization === true) {
+ minimizeEdgeLengthBottomUp(20);
+ }
+
+ if (this.options.hierarchical.parentCentralization === true) {
+ centerAllParentsBottomUp()
+ }
+
+ shiftTrees();
+ }
+
+ /**
+ * This gives the space around the node. IF a map is supplied, it will only check against nodes NOT in the map.
+ * This is used to only get the distances to nodes outside of a branch.
+ * @param {Node} node
+ * @param {{Node.id: vis.Node}} map
+ * @returns {number[]}
+ * @private
+ */
+ _getSpaceAroundNode(node, map) {
+ let useMap = true;
+ if (map === undefined) {
+ useMap = false;
+ }
+ let level = this.hierarchical.levels[node.id];
+ if (level !== undefined) {
+ let index = this.hierarchical.distributionIndex[node.id];
+ let position = this.direction.getPosition(node);
+ let ordering = this.hierarchical.distributionOrdering[level];
+ let minSpace = 1e9;
+ let maxSpace = 1e9;
+ if (index !== 0) {
+ let prevNode = ordering[index - 1];
+ if ((useMap === true && map[prevNode.id] === undefined) || useMap === false) {
+ let prevPos = this.direction.getPosition(prevNode);
+ minSpace = position - prevPos;
+ }
+ }
+
+ if (index != ordering.length - 1) {
+ let nextNode = ordering[index + 1];
+ if ((useMap === true && map[nextNode.id] === undefined) || useMap === false) {
+ let nextPos = this.direction.getPosition(nextNode);
+ maxSpace = Math.min(maxSpace, nextPos - position);
+ }
+ }
+
+ return [minSpace, maxSpace];
+ }
+ else {
+ return [0, 0];
+ }
+ }
+
+
+ /**
+ * We use this method to center a parent node and check if it does not cross other nodes when it does.
+ * @param {Node} node
+ * @private
+ */
+ _centerParent(node) {
+ if (this.hierarchical.parentReference[node.id]) {
+ let parents = this.hierarchical.parentReference[node.id];
+ for (var i = 0; i < parents.length; i++) {
+ let parentId = parents[i];
+ let parentNode = this.body.nodes[parentId];
+ let children = this.hierarchical.childrenReference[parentId];
+
+ if (children !== undefined) {
+ // get the range of the children
+ let newPosition = this._getCenterPosition(children);
+
+ let position = this.direction.getPosition(parentNode);
+ let [minSpace, maxSpace] = this._getSpaceAroundNode(parentNode);
+ let diff = position - newPosition;
+ if ((diff < 0 && Math.abs(diff) < maxSpace - this.options.hierarchical.nodeSpacing) ||
+ (diff > 0 && Math.abs(diff) < minSpace - this.options.hierarchical.nodeSpacing)) {
+ this.direction.setPosition(parentNode, newPosition);
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * This function places the nodes on the canvas based on the hierarchial distribution.
+ *
+ * @param {Object} distribution | obtained by the function this._getDistribution()
+ * @private
+ */
+ _placeNodesByHierarchy(distribution) {
+ this.positionedNodes = {};
+ // start placing all the level 0 nodes first. Then recursively position their branches.
+ for (let level in distribution) {
+ if (distribution.hasOwnProperty(level)) {
+ // sort nodes in level by position:
+ let nodeArray = Object.keys(distribution[level]);
+ nodeArray = this._indexArrayToNodes(nodeArray);
+ this.direction.sort(nodeArray);
+ let handledNodeCount = 0;
+
+ for (let i = 0; i < nodeArray.length; i++) {
+ let node = nodeArray[i];
+ if (this.positionedNodes[node.id] === undefined) {
+ let spacing = this.options.hierarchical.nodeSpacing;
+ let pos = spacing * handledNodeCount;
+ // We get the X or Y values we need and store them in pos and previousPos.
+ // The get and set make sure we get X or Y
+ if (handledNodeCount > 0) {
+ pos = this.direction.getPosition(nodeArray[i-1]) + spacing;
+ }
+ this.direction.setPosition(node, pos, level);
+ this._validatePositionAndContinue(node, level, pos);
+
+ handledNodeCount++;
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * This is a recursively called function to enumerate the branches from the largest hubs and place the nodes
+ * on a X position that ensures there will be no overlap.
+ *
+ * @param {Node.id} parentId
+ * @param {number} parentLevel
+ * @private
+ */
+ _placeBranchNodes(parentId, parentLevel) {
+ let childRef = this.hierarchical.childrenReference[parentId];
+
+ // if this is not a parent, cancel the placing. This can happen with multiple parents to one child.
+ if (childRef === undefined) {
+ return;
+ }
+
+ // get a list of childNodes
+ let childNodes = [];
+ for (let i = 0; i < childRef.length; i++) {
+ childNodes.push(this.body.nodes[childRef[i]]);
+ }
+
+ // use the positions to order the nodes.
+ this.direction.sort(childNodes);
+
+ // position the childNodes
+ for (let i = 0; i < childNodes.length; i++) {
+ let childNode = childNodes[i];
+ let childNodeLevel = this.hierarchical.levels[childNode.id];
+ // check if the child node is below the parent node and if it has already been positioned.
+ if (childNodeLevel > parentLevel && this.positionedNodes[childNode.id] === undefined) {
+ // get the amount of space required for this node. If parent the width is based on the amount of children.
+ let spacing = this.options.hierarchical.nodeSpacing;
+ let pos;
+
+ // we get the X or Y values we need and store them in pos and previousPos.
+ // The get and set make sure we get X or Y
+ if (i === 0) {
+ pos = this.direction.getPosition(this.body.nodes[parentId]);
+ } else {
+ pos = this.direction.getPosition(childNodes[i-1]) + spacing;
+ }
+ this.direction.setPosition(childNode, pos, childNodeLevel);
+ this._validatePositionAndContinue(childNode, childNodeLevel, pos);
+ }
+ else {
+ return;
+ }
+ }
+
+ // center the parent nodes.
+ let center = this._getCenterPosition(childNodes);
+ this.direction.setPosition(this.body.nodes[parentId], center, parentLevel);
+ }
+
+
+ /**
+ * This method checks for overlap and if required shifts the branch. It also keeps records of positioned nodes.
+ * Finally it will call _placeBranchNodes to place the branch nodes.
+ * @param {Node} node
+ * @param {number} level
+ * @param {number} pos
+ * @private
+ */
+ _validatePositionAndContinue(node, level, pos) {
+ // This method only works for formal trees and formal forests
+ // Early exit if this is not the case
+ if (!this.hierarchical.isTree) return;
+
+ // if overlap has been detected, we shift the branch
+ if (this.lastNodeOnLevel[level] !== undefined) {
+ let previousPos = this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[level]]);
+ if (pos - previousPos < this.options.hierarchical.nodeSpacing) {
+ let diff = (previousPos + this.options.hierarchical.nodeSpacing) - pos;
+ let sharedParent = this._findCommonParent(this.lastNodeOnLevel[level], node.id);
+ this._shiftBlock(sharedParent.withChild, diff);
+ }
+ }
+
+ this.lastNodeOnLevel[level] = node.id; // store change in position.
+ this.positionedNodes[node.id] = true;
+ this._placeBranchNodes(node.id, level);
+ }
+
+ /**
+ * Receives an array with node indices and returns an array with the actual node references.
+ * Used for sorting based on node properties.
+ * @param {Array.} idArray
+ * @returns {Array.}
+ */
+ _indexArrayToNodes(idArray) {
+ let array = [];
+ for (let i = 0; i < idArray.length; i++) {
+ array.push(this.body.nodes[idArray[i]])
+ }
+ return array;
+ }
+
+ /**
+ * This function get the distribution of levels based on hubsize
+ *
+ * @returns {Object}
+ * @private
+ */
+ _getDistribution() {
+ let distribution = {};
+ let nodeId, node;
+
+ // we fix Y because the hierarchy is vertical,
+ // we fix X so we do not give a node an x position for a second time.
+ // the fix of X is removed after the x value has been set.
+ for (nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId)) {
+ node = this.body.nodes[nodeId];
+ let level = this.hierarchical.levels[nodeId] === undefined ? 0 : this.hierarchical.levels[nodeId];
+ this.direction.fix(node, level);
+ if (distribution[level] === undefined) {
+ distribution[level] = {};
+ }
+ distribution[level][nodeId] = node;
+ }
+ }
+ return distribution;
+ }
+
+
+ /**
+ * Return the active (i.e. visible) edges for this node
+ *
+ * @param {Node} node
+ * @returns {Array.} Array of edge instances
+ * @private
+ */
+ _getActiveEdges(node) {
+ let result = [];
+
+ util.forEach(node.edges, (edge) => {
+ if (this.body.edgeIndices.indexOf(edge.id) !== -1) {
+ result.push(edge);
+ }
+ });
+
+ return result;
+ }
+
+
+ /**
+ * Get the hubsizes for all active nodes.
+ *
+ * @returns {number}
+ * @private
+ */
+ _getHubSizes() {
+ let hubSizes = {};
+ let nodeIds = this.body.nodeIndices;
+
+ util.forEach(nodeIds, (nodeId) => {
+ let node = this.body.nodes[nodeId];
+ let hubSize = this._getActiveEdges(node).length;
+ hubSizes[hubSize] = true;
+ });
+
+ // Make an array of the size sorted descending
+ let result = [];
+ util.forEach(hubSizes, (size) => {
+ result.push(Number(size));
+ });
+
+ TimSort.sort(result, function(a, b) {
+ return b - a;
+ });
+
+ return result;
+ }
+
+
+ /**
+ * this function allocates nodes in levels based on the recursive branching from the largest hubs.
+ *
+ * @private
+ */
+ _determineLevelsByHubsize() {
+ let levelDownstream = (nodeA, nodeB) => {
+ this.hierarchical.levelDownstream(nodeA, nodeB);
+ }
+
+ let hubSizes = this._getHubSizes();
+
+ for (let i = 0; i < hubSizes.length; ++i ) {
+ let hubSize = hubSizes[i];
+ if (hubSize === 0) break;
+
+ util.forEach(this.body.nodeIndices, (nodeId) => {
+ let node = this.body.nodes[nodeId];
+
+ if (hubSize === this._getActiveEdges(node).length) {
+ this._crawlNetwork(levelDownstream, nodeId);
+ }
+ });
+ }
+ }
+
+
+ /**
+ * TODO: release feature
+ * TODO: Determine if this feature is needed at all
+ *
+ * @private
+ */
+ _determineLevelsCustomCallback() {
+ let minLevel = 100000;
+
+ // TODO: this should come from options.
+ let customCallback = function(nodeA, nodeB, edge) { // eslint-disable-line no-unused-vars
+
+ };
+
+ // TODO: perhaps move to HierarchicalStatus.
+ // But I currently don't see the point, this method is not used.
+ let levelByDirection = (nodeA, nodeB, edge) => {
+ let levelA = this.hierarchical.levels[nodeA.id];
+ // set initial level
+ if (levelA === undefined) { levelA = this.hierarchical.levels[nodeA.id] = minLevel;}
+
+ let diff = customCallback(
+ NetworkUtil.cloneOptions(nodeA,'node'),
+ NetworkUtil.cloneOptions(nodeB,'node'),
+ NetworkUtil.cloneOptions(edge,'edge')
+ );
+
+ this.hierarchical.levels[nodeB.id] = levelA + diff;
+ };
+
+ this._crawlNetwork(levelByDirection);
+ this.hierarchical.setMinLevelToZero(this.body.nodes);
+ }
+
+ /**
+ * Allocate nodes in levels based on the direction of the edges.
+ *
+ * @private
+ */
+ _determineLevelsDirected() {
+ let minLevel = 10000;
+
+ /**
+ * Check if there is an edge going the opposite direction for given edge
+ *
+ * @param {Edge} edge edge to check
+ * @returns {boolean} true if there's another edge going into the opposite direction
+ */
+ let isBidirectional = (edge) => {
+ util.forEach(this.body.edges, (otherEdge) => {
+ if (otherEdge.toId === edge.fromId && otherEdge.fromId === edge.toId) {
+ return true;
+ }
+ });
+
+ return false;
+ };
+
+
+ let levelByDirection = (nodeA, nodeB, edge) => {
+ let levelA = this.hierarchical.levels[nodeA.id];
+ let levelB = this.hierarchical.levels[nodeB.id];
+
+ if (isBidirectional(edge) && levelA !== undefined && levelB !== undefined) {
+ // Don't redo the level determination if already done in this case.
+ return;
+ }
+
+ // set initial level
+ if (levelA === undefined) { levelA = this.hierarchical.levels[nodeA.id] = minLevel;}
+ if (edge.toId == nodeB.id) {
+ this.hierarchical.levels[nodeB.id] = levelA + 1;
+ }
+ else {
+ this.hierarchical.levels[nodeB.id] = levelA - 1;
+ }
+ };
+
+ this._crawlNetwork(levelByDirection);
+ this.hierarchical.setMinLevelToZero(this.body.nodes);
+ }
+
+
+ /**
+ * Update the bookkeeping of parent and child.
+ * @private
+ */
+ _generateMap() {
+ let fillInRelations = (parentNode, childNode) => {
+ if (this.hierarchical.levels[childNode.id] > this.hierarchical.levels[parentNode.id]) {
+ this.hierarchical.addRelation(parentNode.id, childNode.id);
+ }
+ };
+
+ this._crawlNetwork(fillInRelations);
+ this.hierarchical.checkIfTree();
+ }
+
+
+ /**
+ * Crawl over the entire network and use a callback on each node couple that is connected to each other.
+ * @param {function} [callback=function(){}] | will receive nodeA, nodeB and the connecting edge. A and B are distinct.
+ * @param {Node.id} startingNodeId
+ * @private
+ */
+ _crawlNetwork(callback = function() {}, startingNodeId) {
+ let progress = {};
+
+ let crawler = (node, tree) => {
+ if (progress[node.id] === undefined) {
+ this.hierarchical.setTreeIndex(node, tree);
+
+ progress[node.id] = true;
+ let childNode;
+ let edges = this._getActiveEdges(node);
+ for (let i = 0; i < edges.length; i++) {
+ let edge = edges[i];
+ if (edge.connected === true) {
+ if (edge.toId == node.id) { // Not '===' because id's can be string and numeric
+ childNode = edge.from;
+ }
+ else {
+ childNode = edge.to;
+ }
+
+ if (node.id != childNode.id) { // Not '!==' because id's can be string and numeric
+ callback(node, childNode, edge);
+ crawler(childNode, tree);
+ }
+ }
+ }
+ }
+ };
+
+
+ if (startingNodeId === undefined) {
+ // Crawl over all nodes
+ let treeIndex = 0; // Serves to pass a unique id for the current distinct tree
+
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ let nodeId = this.body.nodeIndices[i];
+
+ if (progress[nodeId] === undefined) {
+ let node = this.body.nodes[nodeId];
+ crawler(node, treeIndex);
+ treeIndex += 1;
+ }
+ }
+ }
+ else {
+ // Crawl from the given starting node
+ let node = this.body.nodes[startingNodeId];
+ if (node === undefined) {
+ console.error("Node not found:", startingNodeId);
+ return;
+ }
+ crawler(node);
+ }
+ }
+
+
+ /**
+ * Shift a branch a certain distance
+ * @param {Node.id} parentId
+ * @param {number} diff
+ * @private
+ */
+ _shiftBlock(parentId, diff) {
+ let progress = {};
+ let shifter = (parentId) => {
+ if (progress[parentId]) {
+ return;
+ }
+ progress[parentId] = true;
+ this.direction.shift(parentId, diff);
+
+ let childRef = this.hierarchical.childrenReference[parentId];
+ if (childRef !== undefined) {
+ for (let i = 0; i < childRef.length; i++) {
+ shifter(childRef[i]);
+ }
+ }
+ };
+ shifter(parentId);
+ }
+
+
+ /**
+ * Find a common parent between branches.
+ * @param {Node.id} childA
+ * @param {Node.id} childB
+ * @returns {{foundParent, withChild}}
+ * @private
+ */
+ _findCommonParent(childA,childB) {
+ let parents = {};
+ let iterateParents = (parents,child) => {
+ let parentRef = this.hierarchical.parentReference[child];
+ if (parentRef !== undefined) {
+ for (let i = 0; i < parentRef.length; i++) {
+ let parent = parentRef[i];
+ parents[parent] = true;
+ iterateParents(parents, parent)
+ }
+ }
+ };
+ let findParent = (parents, child) => {
+ let parentRef = this.hierarchical.parentReference[child];
+ if (parentRef !== undefined) {
+ for (let i = 0; i < parentRef.length; i++) {
+ let parent = parentRef[i];
+ if (parents[parent] !== undefined) {
+ return {foundParent:parent, withChild:child};
+ }
+ let branch = findParent(parents, parent);
+ if (branch.foundParent !== null) {
+ return branch;
+ }
+ }
+ }
+ return {foundParent:null, withChild:child};
+ };
+
+ iterateParents(parents, childA);
+ return findParent(parents, childB);
+ }
+
+
+ /**
+ * Set the strategy pattern for handling the coordinates given the current direction.
+ *
+ * The individual instances contain all the operations and data specific to a layout direction.
+ *
+ * @param {Node} node
+ * @param {{x: number, y: number}} position
+ * @param {number} level
+ * @param {boolean} [doNotUpdate=false]
+ * @private
+ */
+ setDirectionStrategy() {
+ var isVertical = (this.options.hierarchical.direction === 'UD'
+ || this.options.hierarchical.direction === 'DU');
+
+ if(isVertical) {
+ this.direction = new VerticalStrategy(this);
+ } else {
+ this.direction = new HorizontalStrategy(this);
+ }
+ }
+
+
+ /**
+ * Determine the center position of a branch from the passed list of child nodes
+ *
+ * This takes into account the positions of all the child nodes.
+ * @param {Array.} childNodes Array of either child nodes or node id's
+ * @return {number}
+ * @private
+ */
+ _getCenterPosition(childNodes) {
+ let minPos = 1e9;
+ let maxPos = -1e9;
+
+ for (let i = 0; i < childNodes.length; i++) {
+ let childNode;
+ if (childNodes[i].id !== undefined) {
+ childNode = childNodes[i];
+ } else {
+ let childNodeId = childNodes[i];
+ childNode = this.body.nodes[childNodeId];
+ }
+
+ let position = this.direction.getPosition(childNode);
+ minPos = Math.min(minPos, position);
+ maxPos = Math.max(maxPos, position);
+ }
+
+ return 0.5 * (minPos + maxPos);
+ }
+}
+
+export default LayoutEngine;
diff --git a/lib/network/modules/ManipulationSystem.js b/lib/network/modules/ManipulationSystem.js
new file mode 100644
index 0000000000..7f744d9831
--- /dev/null
+++ b/lib/network/modules/ManipulationSystem.js
@@ -0,0 +1,1247 @@
+
+import util from 'vis-util';
+import Hammer from '../../module/hammer';
+import hammerUtil from '../../hammerUtil';
+
+/**
+ * Clears the toolbar div element of children
+ *
+ * @private
+ */
+class ManipulationSystem {
+ /**
+ * @param {Object} body
+ * @param {Canvas} canvas
+ * @param {SelectionHandler} selectionHandler
+ */
+ constructor(body, canvas, selectionHandler) {
+ this.body = body;
+ this.canvas = canvas;
+ this.selectionHandler = selectionHandler;
+
+ this.editMode = false;
+ this.manipulationDiv = undefined;
+ this.editModeDiv = undefined;
+ this.closeDiv = undefined;
+
+ this.manipulationHammers = [];
+ this.temporaryUIFunctions = {};
+ this.temporaryEventFunctions = [];
+
+ this.touchTime = 0;
+ this.temporaryIds = {nodes: [], edges:[]};
+ this.guiEnabled = false;
+ this.inMode = false;
+ this.selectedControlNode = undefined;
+
+ this.options = {};
+ this.defaultOptions = {
+ enabled: false,
+ initiallyActive: false,
+ addNode: true,
+ addEdge: true,
+ editNode: undefined,
+ editEdge: true,
+ deleteNode: true,
+ deleteEdge: true,
+ controlNodeStyle:{
+ shape:'dot',
+ size:6,
+ color: {background: '#ff0000', border: '#3c3c3c', highlight: {background: '#07f968', border: '#3c3c3c'}},
+ borderWidth: 2,
+ borderWidthSelected: 2
+ }
+ };
+ util.extend(this.options, this.defaultOptions);
+
+ this.body.emitter.on('destroy', () => {this._clean();});
+ this.body.emitter.on('_dataChanged',this._restore.bind(this));
+ this.body.emitter.on('_resetData', this._restore.bind(this));
+ }
+
+
+ /**
+ * If something changes in the data during editing, switch back to the initial datamanipulation state and close all edit modes.
+ * @private
+ */
+ _restore() {
+ if (this.inMode !== false) {
+ if (this.options.initiallyActive === true) {
+ this.enableEditMode();
+ }
+ else {
+ this.disableEditMode();
+ }
+ }
+ }
+
+ /**
+ * Set the Options
+ *
+ * @param {Object} options
+ * @param {Object} allOptions
+ * @param {Object} globalOptions
+ */
+ setOptions(options, allOptions, globalOptions) {
+ if (allOptions !== undefined) {
+ if (allOptions.locale !== undefined) {this.options.locale = allOptions.locale} else {this.options.locale = globalOptions.locale;}
+ if (allOptions.locales !== undefined) {this.options.locales = allOptions.locales} else {this.options.locales = globalOptions.locales;}
+ }
+
+ if (options !== undefined) {
+ if (typeof options === 'boolean') {
+ this.options.enabled = options;
+ }
+ else {
+ this.options.enabled = true;
+ util.deepExtend(this.options, options);
+ }
+ if (this.options.initiallyActive === true) {
+ this.editMode = true;
+ }
+ this._setup();
+ }
+ }
+
+
+ /**
+ * Enable or disable edit-mode. Draws the DOM required and cleans up after itself.
+ *
+ * @private
+ */
+ toggleEditMode() {
+ if (this.editMode === true) {
+ this.disableEditMode();
+ }
+ else {
+ this.enableEditMode();
+ }
+ }
+
+
+ /**
+ * Enables Edit Mode
+ */
+ enableEditMode() {
+ this.editMode = true;
+
+ this._clean();
+ if (this.guiEnabled === true) {
+ this.manipulationDiv.style.display = 'block';
+ this.closeDiv.style.display = 'block';
+ this.editModeDiv.style.display = 'none';
+ this.showManipulatorToolbar();
+ }
+ }
+
+ /**
+ * Disables Edit Mode
+ */
+ disableEditMode() {
+ this.editMode = false;
+
+ this._clean();
+ if (this.guiEnabled === true) {
+ this.manipulationDiv.style.display = 'none';
+ this.closeDiv.style.display = 'none';
+ this.editModeDiv.style.display = 'block';
+ this._createEditButton();
+ }
+ }
+
+ /**
+ * Creates the main toolbar. Removes functions bound to the select event. Binds all the buttons of the toolbar.
+ *
+ * @private
+ */
+ showManipulatorToolbar() {
+ // restore the state of any bound functions or events, remove control nodes, restore physics
+ this._clean();
+
+ // reset global variables
+ this.manipulationDOM = {};
+
+ // if the gui is enabled, draw all elements.
+ if (this.guiEnabled === true) {
+ // a _restore will hide these menus
+ this.editMode = true;
+ this.manipulationDiv.style.display = 'block';
+ this.closeDiv.style.display = 'block';
+
+ let selectedNodeCount = this.selectionHandler._getSelectedNodeCount();
+ let selectedEdgeCount = this.selectionHandler._getSelectedEdgeCount();
+ let selectedTotalCount = selectedNodeCount + selectedEdgeCount;
+ let locale = this.options.locales[this.options.locale];
+ let needSeperator = false;
+
+
+ if (this.options.addNode !== false) {
+ this._createAddNodeButton(locale);
+ needSeperator = true;
+ }
+ if (this.options.addEdge !== false) {
+ if (needSeperator === true) {
+ this._createSeperator(1);
+ } else {
+ needSeperator = true;
+ }
+ this._createAddEdgeButton(locale);
+ }
+
+ if (selectedNodeCount === 1 && typeof this.options.editNode === 'function') {
+ if (needSeperator === true) {
+ this._createSeperator(2);
+ } else {
+ needSeperator = true;
+ }
+ this._createEditNodeButton(locale);
+ }
+ else if (selectedEdgeCount === 1 && selectedNodeCount === 0 && this.options.editEdge !== false) {
+ if (needSeperator === true) {
+ this._createSeperator(3);
+ } else {
+ needSeperator = true;
+ }
+ this._createEditEdgeButton(locale);
+ }
+
+ // remove buttons
+ if (selectedTotalCount !== 0) {
+ if (selectedNodeCount > 0 && this.options.deleteNode !== false) {
+ if (needSeperator === true) {
+ this._createSeperator(4);
+ }
+ this._createDeleteButton(locale);
+ }
+ else if (selectedNodeCount === 0 && this.options.deleteEdge !== false) {
+ if (needSeperator === true) {
+ this._createSeperator(4);
+ }
+ this._createDeleteButton(locale);
+ }
+ }
+
+ // bind the close button
+ this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));
+
+ // refresh this bar based on what has been selected
+ this._temporaryBindEvent('select', this.showManipulatorToolbar.bind(this));
+ }
+
+ // redraw to show any possible changes
+ this.body.emitter.emit('_redraw');
+
+ }
+
+
+ /**
+ * Create the toolbar for adding Nodes
+ */
+ addNodeMode() {
+ // when using the gui, enable edit mode if it wasnt already.
+ if (this.editMode !== true) {
+ this.enableEditMode();
+ }
+
+ // restore the state of any bound functions or events, remove control nodes, restore physics
+ this._clean();
+
+ this.inMode = 'addNode';
+ if (this.guiEnabled === true) {
+ let locale = this.options.locales[this.options.locale];
+ this.manipulationDOM = {};
+ this._createBackButton(locale);
+ this._createSeperator();
+ this._createDescription(locale['addDescription'] || this.options.locales['en']['addDescription']);
+
+ // bind the close button
+ this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));
+ }
+
+ this._temporaryBindEvent('click', this._performAddNode.bind(this));
+ }
+
+ /**
+ * call the bound function to handle the editing of the node. The node has to be selected.
+ */
+ editNode() {
+ // when using the gui, enable edit mode if it wasnt already.
+ if (this.editMode !== true) {
+ this.enableEditMode();
+ }
+
+ // restore the state of any bound functions or events, remove control nodes, restore physics
+ this._clean();
+ let node = this.selectionHandler._getSelectedNode();
+ if (node !== undefined) {
+ this.inMode = 'editNode';
+ if (typeof this.options.editNode === 'function') {
+ if (node.isCluster !== true) {
+ let data = util.deepExtend({}, node.options, false);
+ data.x = node.x;
+ data.y = node.y;
+
+ if (this.options.editNode.length === 2) {
+ this.options.editNode(data, (finalizedData) => {
+ if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'editNode') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback) {
+ this.body.data.nodes.getDataSet().update(finalizedData);
+ }
+ this.showManipulatorToolbar();
+ });
+ }
+ else {
+ throw new Error('The function for edit does not support two arguments (data, callback)');
+ }
+ }
+ else {
+ alert(this.options.locales[this.options.locale]['editClusterError'] || this.options.locales['en']['editClusterError']);
+ }
+ }
+ else {
+ throw new Error('No function has been configured to handle the editing of nodes.');
+ }
+ }
+ else {
+ this.showManipulatorToolbar();
+ }
+ }
+
+
+ /**
+ * create the toolbar to connect nodes
+ */
+ addEdgeMode() {
+ // when using the gui, enable edit mode if it wasnt already.
+ if (this.editMode !== true) {
+ this.enableEditMode();
+ }
+
+ // restore the state of any bound functions or events, remove control nodes, restore physics
+ this._clean();
+
+ this.inMode = 'addEdge';
+ if (this.guiEnabled === true) {
+ let locale = this.options.locales[this.options.locale];
+ this.manipulationDOM = {};
+ this._createBackButton(locale);
+ this._createSeperator();
+ this._createDescription(locale['edgeDescription'] || this.options.locales['en']['edgeDescription']);
+
+ // bind the close button
+ this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));
+ }
+
+ // temporarily overload functions
+ this._temporaryBindUI('onTouch', this._handleConnect.bind(this));
+ this._temporaryBindUI('onDragEnd', this._finishConnect.bind(this));
+ this._temporaryBindUI('onDrag', this._dragControlNode.bind(this));
+ this._temporaryBindUI('onRelease', this._finishConnect.bind(this));
+ this._temporaryBindUI('onDragStart',this._dragStartEdge.bind(this));
+ this._temporaryBindUI('onHold', () => {});
+ }
+
+ /**
+ * create the toolbar to edit edges
+ */
+ editEdgeMode() {
+ // when using the gui, enable edit mode if it wasn't already.
+ if (this.editMode !== true) {
+ this.enableEditMode();
+ }
+
+ // restore the state of any bound functions or events, remove control nodes, restore physics
+ this._clean();
+
+ this.inMode = 'editEdge';
+ if (typeof this.options.editEdge === 'object' && typeof this.options.editEdge.editWithoutDrag === "function") {
+ this.edgeBeingEditedId = this.selectionHandler.getSelectedEdges()[0];
+ if (this.edgeBeingEditedId !== undefined) {
+ var edge = this.body.edges[this.edgeBeingEditedId];
+ this._performEditEdge(edge.from, edge.to);
+ return;
+ }
+ }
+ if (this.guiEnabled === true) {
+ let locale = this.options.locales[this.options.locale];
+ this.manipulationDOM = {};
+ this._createBackButton(locale);
+ this._createSeperator();
+ this._createDescription(locale['editEdgeDescription'] || this.options.locales['en']['editEdgeDescription']);
+
+ // bind the close button
+ this._bindHammerToDiv(this.closeDiv, this.toggleEditMode.bind(this));
+ }
+
+ this.edgeBeingEditedId = this.selectionHandler.getSelectedEdges()[0];
+ if (this.edgeBeingEditedId !== undefined) {
+ let edge = this.body.edges[this.edgeBeingEditedId];
+
+ // create control nodes
+ let controlNodeFrom = this._getNewTargetNode(edge.from.x, edge.from.y);
+ let controlNodeTo = this._getNewTargetNode(edge.to.x, edge.to.y);
+
+ this.temporaryIds.nodes.push(controlNodeFrom.id);
+ this.temporaryIds.nodes.push(controlNodeTo.id);
+
+ this.body.nodes[controlNodeFrom.id] = controlNodeFrom;
+ this.body.nodeIndices.push(controlNodeFrom.id);
+ this.body.nodes[controlNodeTo.id] = controlNodeTo;
+ this.body.nodeIndices.push(controlNodeTo.id);
+
+ // temporarily overload UI functions, cleaned up automatically because of _temporaryBindUI
+ this._temporaryBindUI('onTouch', this._controlNodeTouch.bind(this)); // used to get the position
+ this._temporaryBindUI('onTap', () => {}); // disabled
+ this._temporaryBindUI('onHold', () => {}); // disabled
+ this._temporaryBindUI('onDragStart', this._controlNodeDragStart.bind(this));// used to select control node
+ this._temporaryBindUI('onDrag', this._controlNodeDrag.bind(this)); // used to drag control node
+ this._temporaryBindUI('onDragEnd', this._controlNodeDragEnd.bind(this)); // used to connect or revert control nodes
+ this._temporaryBindUI('onMouseMove', () => {}); // disabled
+
+ // create function to position control nodes correctly on movement
+ // automatically cleaned up because we use the temporary bind
+ this._temporaryBindEvent('beforeDrawing', (ctx) => {
+ let positions = edge.edgeType.findBorderPositions(ctx);
+ if (controlNodeFrom.selected === false) {
+ controlNodeFrom.x = positions.from.x;
+ controlNodeFrom.y = positions.from.y;
+ }
+ if (controlNodeTo.selected === false) {
+ controlNodeTo.x = positions.to.x;
+ controlNodeTo.y = positions.to.y;
+ }
+ });
+
+ this.body.emitter.emit('_redraw');
+ }
+ else {
+ this.showManipulatorToolbar();
+ }
+ }
+
+ /**
+ * delete everything in the selection
+ */
+ deleteSelected() {
+ // when using the gui, enable edit mode if it wasnt already.
+ if (this.editMode !== true) {
+ this.enableEditMode();
+ }
+
+ // restore the state of any bound functions or events, remove control nodes, restore physics
+ this._clean();
+
+ this.inMode = 'delete';
+ let selectedNodes = this.selectionHandler.getSelectedNodes();
+ let selectedEdges = this.selectionHandler.getSelectedEdges();
+ let deleteFunction = undefined;
+ if (selectedNodes.length > 0) {
+ for (let i = 0; i < selectedNodes.length; i++) {
+ if (this.body.nodes[selectedNodes[i]].isCluster === true) {
+ alert(this.options.locales[this.options.locale]['deleteClusterError'] || this.options.locales['en']['deleteClusterError']);
+ return;
+ }
+ }
+
+ if (typeof this.options.deleteNode === 'function') {
+ deleteFunction = this.options.deleteNode;
+ }
+ }
+ else if (selectedEdges.length > 0) {
+ if (typeof this.options.deleteEdge === 'function') {
+ deleteFunction = this.options.deleteEdge;
+ }
+ }
+
+ if (typeof deleteFunction === 'function') {
+ let data = {nodes: selectedNodes, edges: selectedEdges};
+ if (deleteFunction.length === 2) {
+ deleteFunction(data, (finalizedData) => {
+ if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'delete') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback) {
+ this.body.data.edges.getDataSet().remove(finalizedData.edges);
+ this.body.data.nodes.getDataSet().remove(finalizedData.nodes);
+ this.body.emitter.emit('startSimulation');
+ this.showManipulatorToolbar();
+ }
+ else {
+ this.body.emitter.emit('startSimulation');
+ this.showManipulatorToolbar();
+ }
+ });
+ }
+ else {
+ throw new Error('The function for delete does not support two arguments (data, callback)')
+ }
+ }
+ else {
+ this.body.data.edges.getDataSet().remove(selectedEdges);
+ this.body.data.nodes.getDataSet().remove(selectedNodes);
+ this.body.emitter.emit('startSimulation');
+ this.showManipulatorToolbar();
+ }
+ }
+
+
+
+
+ //********************************************** PRIVATE ***************************************//
+
+ /**
+ * draw or remove the DOM
+ * @private
+ */
+ _setup() {
+ if (this.options.enabled === true) {
+ // Enable the GUI
+ this.guiEnabled = true;
+
+ this._createWrappers();
+ if (this.editMode === false) {
+ this._createEditButton();
+ }
+ else {
+ this.showManipulatorToolbar();
+ }
+ }
+ else {
+ this._removeManipulationDOM();
+
+ // disable the gui
+ this.guiEnabled = false;
+ }
+ }
+
+
+ /**
+ * create the div overlays that contain the DOM
+ * @private
+ */
+ _createWrappers() {
+ // load the manipulator HTML elements. All styling done in css.
+ if (this.manipulationDiv === undefined) {
+ this.manipulationDiv = document.createElement('div');
+ this.manipulationDiv.className = 'vis-manipulation';
+ if (this.editMode === true) {
+ this.manipulationDiv.style.display = 'block';
+ }
+ else {
+ this.manipulationDiv.style.display = 'none';
+ }
+ this.canvas.frame.appendChild(this.manipulationDiv);
+ }
+
+ // container for the edit button.
+ if (this.editModeDiv === undefined) {
+ this.editModeDiv = document.createElement('div');
+ this.editModeDiv.className = 'vis-edit-mode';
+ if (this.editMode === true) {
+ this.editModeDiv.style.display = 'none';
+ }
+ else {
+ this.editModeDiv.style.display = 'block';
+ }
+ this.canvas.frame.appendChild(this.editModeDiv);
+ }
+
+
+ // container for the close div button
+ if (this.closeDiv === undefined) {
+ this.closeDiv = document.createElement('div');
+ this.closeDiv.className = 'vis-close';
+ this.closeDiv.style.display = this.manipulationDiv.style.display;
+ this.canvas.frame.appendChild(this.closeDiv);
+ }
+ }
+
+
+ /**
+ * generate a new target node. Used for creating new edges and editing edges
+ *
+ * @param {number} x
+ * @param {number} y
+ * @returns {Node}
+ * @private
+ */
+ _getNewTargetNode(x,y) {
+ let controlNodeStyle = util.deepExtend({}, this.options.controlNodeStyle);
+
+ controlNodeStyle.id = 'targetNode' + util.randomUUID();
+ controlNodeStyle.hidden = false;
+ controlNodeStyle.physics = false;
+ controlNodeStyle.x = x;
+ controlNodeStyle.y = y;
+
+ // we have to define the bounding box in order for the nodes to be drawn immediately
+ let node = this.body.functions.createNode(controlNodeStyle);
+ node.shape.boundingBox = {left: x, right:x, top:y, bottom:y};
+
+ return node;
+ }
+
+
+ /**
+ * Create the edit button
+ */
+ _createEditButton() {
+ // restore everything to it's original state (if applicable)
+ this._clean();
+
+ // reset the manipulationDOM
+ this.manipulationDOM = {};
+
+ // empty the editModeDiv
+ util.recursiveDOMDelete(this.editModeDiv);
+
+
+ // create the contents for the editMode button
+ let locale = this.options.locales[this.options.locale];
+ let button = this._createButton('editMode', 'vis-button vis-edit vis-edit-mode', locale['edit'] || this.options.locales['en']['edit']);
+ this.editModeDiv.appendChild(button);
+
+ // bind a hammer listener to the button, calling the function toggleEditMode.
+ this._bindHammerToDiv(button, this.toggleEditMode.bind(this));
+ }
+
+
+ /**
+ * this function cleans up after everything this module does. Temporary elements, functions and events are removed, physics restored, hammers removed.
+ * @private
+ */
+ _clean() {
+ // not in mode
+ this.inMode = false;
+
+ // _clean the divs
+ if (this.guiEnabled === true) {
+ util.recursiveDOMDelete(this.editModeDiv);
+ util.recursiveDOMDelete(this.manipulationDiv);
+
+ // removes all the bindings and overloads
+ this._cleanManipulatorHammers();
+ }
+
+ // remove temporary nodes and edges
+ this._cleanupTemporaryNodesAndEdges();
+
+ // restore overloaded UI functions
+ this._unbindTemporaryUIs();
+
+ // remove the temporaryEventFunctions
+ this._unbindTemporaryEvents();
+
+ // restore the physics if required
+ this.body.emitter.emit('restorePhysics');
+ }
+
+
+ /**
+ * Each dom element has it's own hammer. They are stored in this.manipulationHammers. This cleans them up.
+ * @private
+ */
+ _cleanManipulatorHammers() {
+ // _clean hammer bindings
+ if (this.manipulationHammers.length != 0) {
+ for (let i = 0; i < this.manipulationHammers.length; i++) {
+ this.manipulationHammers[i].destroy();
+ }
+ this.manipulationHammers = [];
+ }
+ }
+
+
+ /**
+ * Remove all DOM elements created by this module.
+ * @private
+ */
+ _removeManipulationDOM() {
+ // removes all the bindings and overloads
+ this._clean();
+
+ // empty the manipulation divs
+ util.recursiveDOMDelete(this.manipulationDiv);
+ util.recursiveDOMDelete(this.editModeDiv);
+ util.recursiveDOMDelete(this.closeDiv);
+
+ // remove the manipulation divs
+ if (this.manipulationDiv) {this.canvas.frame.removeChild(this.manipulationDiv);}
+ if (this.editModeDiv) {this.canvas.frame.removeChild(this.editModeDiv);}
+ if (this.closeDiv) {this.canvas.frame.removeChild(this.closeDiv);}
+
+ // set the references to undefined
+ this.manipulationDiv = undefined;
+ this.editModeDiv = undefined;
+ this.closeDiv = undefined;
+ }
+
+
+ /**
+ * create a seperator line. the index is to differentiate in the manipulation dom
+ * @param {number} [index=1]
+ * @private
+ */
+ _createSeperator(index = 1) {
+ this.manipulationDOM['seperatorLineDiv' + index] = document.createElement('div');
+ this.manipulationDOM['seperatorLineDiv' + index].className = 'vis-separator-line';
+ this.manipulationDiv.appendChild(this.manipulationDOM['seperatorLineDiv' + index]);
+ }
+
+ // ---------------------- DOM functions for buttons --------------------------//
+
+ /**
+ *
+ * @param {Locale} locale
+ * @private
+ */
+ _createAddNodeButton(locale) {
+ let button = this._createButton('addNode', 'vis-button vis-add', locale['addNode'] || this.options.locales['en']['addNode']);
+ this.manipulationDiv.appendChild(button);
+ this._bindHammerToDiv(button, this.addNodeMode.bind(this));
+ }
+
+ /**
+ *
+ * @param {Locale} locale
+ * @private
+ */
+ _createAddEdgeButton(locale) {
+ let button = this._createButton('addEdge', 'vis-button vis-connect', locale['addEdge'] || this.options.locales['en']['addEdge']);
+ this.manipulationDiv.appendChild(button);
+ this._bindHammerToDiv(button, this.addEdgeMode.bind(this));
+ }
+
+ /**
+ *
+ * @param {Locale} locale
+ * @private
+ */
+ _createEditNodeButton(locale) {
+ let button = this._createButton('editNode', 'vis-button vis-edit', locale['editNode'] || this.options.locales['en']['editNode']);
+ this.manipulationDiv.appendChild(button);
+ this._bindHammerToDiv(button, this.editNode.bind(this));
+ }
+
+ /**
+ *
+ * @param {Locale} locale
+ * @private
+ */
+ _createEditEdgeButton(locale) {
+ let button = this._createButton('editEdge', 'vis-button vis-edit', locale['editEdge'] || this.options.locales['en']['editEdge']);
+ this.manipulationDiv.appendChild(button);
+ this._bindHammerToDiv(button, this.editEdgeMode.bind(this));
+ }
+
+ /**
+ *
+ * @param {Locale} locale
+ * @private
+ */
+ _createDeleteButton(locale) {
+ var deleteBtnClass;
+ if (this.options.rtl) {
+ deleteBtnClass = 'vis-button vis-delete-rtl';
+ } else {
+ deleteBtnClass = 'vis-button vis-delete';
+ }
+ let button = this._createButton('delete', deleteBtnClass, locale['del'] || this.options.locales['en']['del']);
+ this.manipulationDiv.appendChild(button);
+ this._bindHammerToDiv(button, this.deleteSelected.bind(this));
+ }
+
+ /**
+ *
+ * @param {Locale} locale
+ * @private
+ */
+ _createBackButton(locale) {
+ let button = this._createButton('back', 'vis-button vis-back', locale['back'] || this.options.locales['en']['back']);
+ this.manipulationDiv.appendChild(button);
+ this._bindHammerToDiv(button, this.showManipulatorToolbar.bind(this));
+ }
+
+ /**
+ *
+ * @param {number|string} id
+ * @param {string} className
+ * @param {label} label
+ * @param {string} labelClassName
+ * @returns {HTMLElement}
+ * @private
+ */
+ _createButton(id, className, label, labelClassName = 'vis-label') {
+
+ this.manipulationDOM[id+'Div'] = document.createElement('div');
+ this.manipulationDOM[id+'Div'].className = className;
+ this.manipulationDOM[id+'Label'] = document.createElement('div');
+ this.manipulationDOM[id+'Label'].className = labelClassName;
+ this.manipulationDOM[id+'Label'].innerHTML = label;
+ this.manipulationDOM[id+'Div'].appendChild(this.manipulationDOM[id+'Label']);
+ return this.manipulationDOM[id+'Div'];
+ }
+
+ /**
+ *
+ * @param {Label} label
+ * @private
+ */
+ _createDescription(label) {
+ this.manipulationDiv.appendChild(
+ this._createButton('description', 'vis-button vis-none', label)
+ );
+ }
+
+ // -------------------------- End of DOM functions for buttons ------------------------------//
+
+ /**
+ * this binds an event until cleanup by the clean functions.
+ * @param {Event} event The event
+ * @param {function} newFunction
+ * @private
+ */
+ _temporaryBindEvent(event, newFunction) {
+ this.temporaryEventFunctions.push({event:event, boundFunction:newFunction});
+ this.body.emitter.on(event, newFunction);
+ }
+
+ /**
+ * this overrides an UI function until cleanup by the clean function
+ * @param {string} UIfunctionName
+ * @param {function} newFunction
+ * @private
+ */
+ _temporaryBindUI(UIfunctionName, newFunction) {
+ if (this.body.eventListeners[UIfunctionName] !== undefined) {
+ this.temporaryUIFunctions[UIfunctionName] = this.body.eventListeners[UIfunctionName];
+ this.body.eventListeners[UIfunctionName] = newFunction;
+ }
+ else {
+ throw new Error('This UI function does not exist. Typo? You tried: ' + UIfunctionName + ' possible are: ' + JSON.stringify(Object.keys(this.body.eventListeners)));
+ }
+ }
+
+ /**
+ * Restore the overridden UI functions to their original state.
+ *
+ * @private
+ */
+ _unbindTemporaryUIs() {
+ for (let functionName in this.temporaryUIFunctions) {
+ if (this.temporaryUIFunctions.hasOwnProperty(functionName)) {
+ this.body.eventListeners[functionName] = this.temporaryUIFunctions[functionName];
+ delete this.temporaryUIFunctions[functionName];
+ }
+ }
+ this.temporaryUIFunctions = {};
+ }
+
+ /**
+ * Unbind the events created by _temporaryBindEvent
+ * @private
+ */
+ _unbindTemporaryEvents() {
+ for (let i = 0; i < this.temporaryEventFunctions.length; i++) {
+ let eventName = this.temporaryEventFunctions[i].event;
+ let boundFunction = this.temporaryEventFunctions[i].boundFunction;
+ this.body.emitter.off(eventName, boundFunction);
+ }
+ this.temporaryEventFunctions = [];
+ }
+
+ /**
+ * Bind an hammer instance to a DOM element.
+ *
+ * @param {Element} domElement
+ * @param {function} boundFunction
+ */
+ _bindHammerToDiv(domElement, boundFunction) {
+ let hammer = new Hammer(domElement, {});
+ hammerUtil.onTouch(hammer, boundFunction);
+ this.manipulationHammers.push(hammer);
+ }
+
+
+ /**
+ * Neatly clean up temporary edges and nodes
+ * @private
+ */
+ _cleanupTemporaryNodesAndEdges() {
+ // _clean temporary edges
+ for (let i = 0; i < this.temporaryIds.edges.length; i++) {
+ this.body.edges[this.temporaryIds.edges[i]].disconnect();
+ delete this.body.edges[this.temporaryIds.edges[i]];
+ let indexTempEdge = this.body.edgeIndices.indexOf(this.temporaryIds.edges[i]);
+ if (indexTempEdge !== -1) {this.body.edgeIndices.splice(indexTempEdge,1);}
+ }
+
+ // _clean temporary nodes
+ for (let i = 0; i < this.temporaryIds.nodes.length; i++) {
+ delete this.body.nodes[this.temporaryIds.nodes[i]];
+ let indexTempNode = this.body.nodeIndices.indexOf(this.temporaryIds.nodes[i]);
+ if (indexTempNode !== -1) {this.body.nodeIndices.splice(indexTempNode,1);}
+ }
+
+ this.temporaryIds = {nodes: [], edges: []};
+ }
+
+ // ------------------------------------------ EDIT EDGE FUNCTIONS -----------------------------------------//
+
+ /**
+ * the touch is used to get the position of the initial click
+ * @param {Event} event The event
+ * @private
+ */
+ _controlNodeTouch(event) {
+ this.selectionHandler.unselectAll();
+ this.lastTouch = this.body.functions.getPointer(event.center);
+ this.lastTouch.translation = util.extend({},this.body.view.translation); // copy the object
+ }
+
+
+ /**
+ * the drag start is used to mark one of the control nodes as selected.
+ * @param {Event} event The event
+ * @private
+ */
+ _controlNodeDragStart(event) { // eslint-disable-line no-unused-vars
+ let pointer = this.lastTouch;
+ let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);
+ let from = this.body.nodes[this.temporaryIds.nodes[0]];
+ let to = this.body.nodes[this.temporaryIds.nodes[1]];
+ let edge = this.body.edges[this.edgeBeingEditedId];
+ this.selectedControlNode = undefined;
+
+ let fromSelect = from.isOverlappingWith(pointerObj);
+ let toSelect = to.isOverlappingWith(pointerObj);
+
+ if (fromSelect === true) {
+ this.selectedControlNode = from;
+ edge.edgeType.from = from;
+ }
+ else if (toSelect === true) {
+ this.selectedControlNode = to;
+ edge.edgeType.to = to;
+ }
+
+ // we use the selection to find the node that is being dragged. We explicitly select it here.
+ if (this.selectedControlNode !== undefined) {
+ this.selectionHandler.selectObject(this.selectedControlNode)
+ }
+
+ this.body.emitter.emit('_redraw');
+ }
+
+ /**
+ * dragging the control nodes or the canvas
+ * @param {Event} event The event
+ * @private
+ */
+ _controlNodeDrag(event) {
+ this.body.emitter.emit('disablePhysics');
+ let pointer = this.body.functions.getPointer(event.center);
+ let pos = this.canvas.DOMtoCanvas(pointer);
+ if (this.selectedControlNode !== undefined) {
+ this.selectedControlNode.x = pos.x;
+ this.selectedControlNode.y = pos.y;
+ }
+ else {
+ // if the drag was not started properly because the click started outside the network div, start it now.
+ let diffX = pointer.x - this.lastTouch.x;
+ let diffY = pointer.y - this.lastTouch.y;
+ this.body.view.translation = {x:this.lastTouch.translation.x + diffX, y:this.lastTouch.translation.y + diffY};
+ }
+ this.body.emitter.emit('_redraw');
+ }
+
+
+ /**
+ * connecting or restoring the control nodes.
+ * @param {Event} event The event
+ * @private
+ */
+ _controlNodeDragEnd(event) {
+ let pointer = this.body.functions.getPointer(event.center);
+ let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);
+ let edge = this.body.edges[this.edgeBeingEditedId];
+ // if the node that was dragged is not a control node, return
+ if (this.selectedControlNode === undefined) {
+ return;
+ }
+
+ // we use the selection to find the node that is being dragged. We explicitly DEselect the control node here.
+ this.selectionHandler.unselectAll();
+ let overlappingNodeIds = this.selectionHandler._getAllNodesOverlappingWith(pointerObj);
+ let node = undefined;
+ for (let i = overlappingNodeIds.length-1; i >= 0; i--) {
+ if (overlappingNodeIds[i] !== this.selectedControlNode.id) {
+ node = this.body.nodes[overlappingNodeIds[i]];
+ break;
+ }
+ }
+ // perform the connection
+ if (node !== undefined && this.selectedControlNode !== undefined) {
+ if (node.isCluster === true) {
+ alert(this.options.locales[this.options.locale]['createEdgeError'] || this.options.locales['en']['createEdgeError'])
+ }
+ else {
+ let from = this.body.nodes[this.temporaryIds.nodes[0]];
+ if (this.selectedControlNode.id === from.id) {
+ this._performEditEdge(node.id, edge.to.id);
+ }
+ else {
+ this._performEditEdge(edge.from.id, node.id);
+ }
+ }
+ }
+ else {
+ edge.updateEdgeType();
+ this.body.emitter.emit('restorePhysics');
+ }
+
+ this.body.emitter.emit('_redraw');
+ }
+
+ // ------------------------------------ END OF EDIT EDGE FUNCTIONS -----------------------------------------//
+
+
+
+ // ------------------------------------------- ADD EDGE FUNCTIONS -----------------------------------------//
+ /**
+ * the function bound to the selection event. It checks if you want to connect a cluster and changes the description
+ * to walk the user through the process.
+ *
+ * @param {Event} event
+ * @private
+ */
+ _handleConnect(event) {
+ // check to avoid double fireing of this function.
+ if (new Date().valueOf() - this.touchTime > 100) {
+ this.lastTouch = this.body.functions.getPointer(event.center);
+ this.lastTouch.translation = util.extend({},this.body.view.translation); // copy the object
+
+ let pointer = this.lastTouch;
+ let node = this.selectionHandler.getNodeAt(pointer);
+
+ if (node !== undefined) {
+ if (node.isCluster === true) {
+ alert(this.options.locales[this.options.locale]['createEdgeError'] || this.options.locales['en']['createEdgeError'])
+ }
+ else {
+ // create a node the temporary line can look at
+ let targetNode = this._getNewTargetNode(node.x,node.y);
+ this.body.nodes[targetNode.id] = targetNode;
+ this.body.nodeIndices.push(targetNode.id);
+
+ // create a temporary edge
+ let connectionEdge = this.body.functions.createEdge({
+ id: 'connectionEdge' + util.randomUUID(),
+ from: node.id,
+ to: targetNode.id,
+ physics: false,
+ smooth: {
+ enabled: true,
+ type: 'continuous',
+ roundness: 0.5
+ }
+ });
+ this.body.edges[connectionEdge.id] = connectionEdge;
+ this.body.edgeIndices.push(connectionEdge.id);
+
+ this.temporaryIds.nodes.push(targetNode.id);
+ this.temporaryIds.edges.push(connectionEdge.id);
+ }
+ }
+ this.touchTime = new Date().valueOf();
+ }
+ }
+
+ /**
+ *
+ * @param {Event} event
+ * @private
+ */
+ _dragControlNode(event) {
+ let pointer = this.body.functions.getPointer(event.center);
+ if (this.temporaryIds.nodes[0] !== undefined) {
+ let targetNode = this.body.nodes[this.temporaryIds.nodes[0]]; // there is only one temp node in the add edge mode.
+ targetNode.x = this.canvas._XconvertDOMtoCanvas(pointer.x);
+ targetNode.y = this.canvas._YconvertDOMtoCanvas(pointer.y);
+ this.body.emitter.emit('_redraw');
+ }
+ else {
+ let diffX = pointer.x - this.lastTouch.x;
+ let diffY = pointer.y - this.lastTouch.y;
+ this.body.view.translation = {x:this.lastTouch.translation.x + diffX, y:this.lastTouch.translation.y + diffY};
+ }
+
+ }
+
+
+ /**
+ * Connect the new edge to the target if one exists, otherwise remove temp line
+ * @param {Event} event The event
+ * @private
+ */
+ _finishConnect(event) {
+ let pointer = this.body.functions.getPointer(event.center);
+ let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);
+
+ // remember the edge id
+ let connectFromId = undefined;
+ if (this.temporaryIds.edges[0] !== undefined) {
+ connectFromId = this.body.edges[this.temporaryIds.edges[0]].fromId;
+ }
+
+ // get the overlapping node but NOT the temporary node;
+ let overlappingNodeIds = this.selectionHandler._getAllNodesOverlappingWith(pointerObj);
+ let node = undefined;
+ for (let i = overlappingNodeIds.length-1; i >= 0; i--) {
+ // if the node id is NOT a temporary node, accept the node.
+ if (this.temporaryIds.nodes.indexOf(overlappingNodeIds[i]) === -1) {
+ node = this.body.nodes[overlappingNodeIds[i]];
+ break;
+ }
+ }
+
+ // clean temporary nodes and edges.
+ this._cleanupTemporaryNodesAndEdges();
+
+ // perform the connection
+ if (node !== undefined) {
+ if (node.isCluster === true) {
+ alert(this.options.locales[this.options.locale]['createEdgeError'] || this.options.locales['en']['createEdgeError']);
+ }
+ else {
+ if (this.body.nodes[connectFromId] !== undefined && this.body.nodes[node.id] !== undefined) {
+ this._performAddEdge(connectFromId, node.id);
+ }
+ }
+ }
+
+
+ // No need to do _generateclickevent('dragEnd') here, the regular dragEnd event fires.
+ this.body.emitter.emit('_redraw');
+ }
+
+
+ /**
+ *
+ * @param {Event} event
+ * @private
+ */
+ _dragStartEdge(event) {
+ let pointer = this.lastTouch;
+ this.selectionHandler._generateClickEvent('dragStart', event, pointer, undefined, true);
+ }
+
+ // --------------------------------------- END OF ADD EDGE FUNCTIONS -------------------------------------//
+
+
+ // ------------------------------ Performing all the actual data manipulation ------------------------//
+
+ /**
+ * Adds a node on the specified location
+ *
+ * @param {Object} clickData
+ * @private
+ */
+ _performAddNode(clickData) {
+ let defaultData = {
+ id: util.randomUUID(),
+ x: clickData.pointer.canvas.x,
+ y: clickData.pointer.canvas.y,
+ label: 'new'
+ };
+
+ if (typeof this.options.addNode === 'function') {
+ if (this.options.addNode.length === 2) {
+ this.options.addNode(defaultData, (finalizedData) => {
+ if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'addNode') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback
+ this.body.data.nodes.getDataSet().add(finalizedData);
+ }
+ this.showManipulatorToolbar();
+ });
+ }
+ else {
+ this.showManipulatorToolbar();
+ throw new Error('The function for add does not support two arguments (data,callback)');
+ }
+ }
+ else {
+ this.body.data.nodes.getDataSet().add(defaultData);
+ this.showManipulatorToolbar();
+ }
+ }
+
+
+ /**
+ * connect two nodes with a new edge.
+ *
+ * @param {Node.id} sourceNodeId
+ * @param {Node.id} targetNodeId
+ * @private
+ */
+ _performAddEdge(sourceNodeId, targetNodeId) {
+ let defaultData = {from: sourceNodeId, to: targetNodeId};
+ if (typeof this.options.addEdge === 'function') {
+ if (this.options.addEdge.length === 2) {
+ this.options.addEdge(defaultData, (finalizedData) => {
+ if (finalizedData !== null && finalizedData !== undefined && this.inMode === 'addEdge') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback
+ this.body.data.edges.getDataSet().add(finalizedData);
+ this.selectionHandler.unselectAll();
+ this.showManipulatorToolbar();
+ }
+ });
+ }
+ else {
+ throw new Error('The function for connect does not support two arguments (data,callback)');
+ }
+ }
+ else {
+ this.body.data.edges.getDataSet().add(defaultData);
+ this.selectionHandler.unselectAll();
+ this.showManipulatorToolbar();
+ }
+ }
+
+ /**
+ * connect two nodes with a new edge.
+ *
+ * @param {Node.id} sourceNodeId
+ * @param {Node.id} targetNodeId
+ * @private
+ */
+ _performEditEdge(sourceNodeId, targetNodeId) {
+ let defaultData = {id: this.edgeBeingEditedId, from: sourceNodeId, to: targetNodeId, label: this.body.data.edges._data[this.edgeBeingEditedId].label };
+ let eeFunct = this.options.editEdge;
+ if (typeof eeFunct === 'object') {
+ eeFunct = eeFunct.editWithoutDrag;
+ }
+ if (typeof eeFunct === 'function') {
+ if (eeFunct.length === 2) {
+ eeFunct(defaultData, (finalizedData) => {
+ if (finalizedData === null || finalizedData === undefined || this.inMode !== 'editEdge') { // if for whatever reason the mode has changes (due to dataset change) disregard the callback) {
+ this.body.edges[defaultData.id].updateEdgeType();
+ this.body.emitter.emit('_redraw');
+ this.showManipulatorToolbar();
+ }
+ else {
+ this.body.data.edges.getDataSet().update(finalizedData);
+ this.selectionHandler.unselectAll();
+ this.showManipulatorToolbar();
+ }
+ });
+ }
+ else {
+ throw new Error('The function for edit does not support two arguments (data, callback)');
+ }
+ }
+ else {
+ this.body.data.edges.getDataSet().update(defaultData);
+ this.selectionHandler.unselectAll();
+ this.showManipulatorToolbar();
+ }
+ }
+
+
+}
+
+export default ManipulationSystem;
diff --git a/lib/network/modules/NodesHandler.js b/lib/network/modules/NodesHandler.js
new file mode 100644
index 0000000000..d6cb5f4c11
--- /dev/null
+++ b/lib/network/modules/NodesHandler.js
@@ -0,0 +1,512 @@
+import util from 'vis-util';
+import { DataSet, DataView } from 'vis-data';
+import Node from "./components/Node";
+
+/**
+ * Handler for Nodes
+ */
+class NodesHandler {
+ /**
+ * @param {Object} body
+ * @param {Images} images
+ * @param {Array.} groups
+ * @param {LayoutEngine} layoutEngine
+ */
+ constructor(body, images, groups, layoutEngine) {
+ this.body = body;
+ this.images = images;
+ this.groups = groups;
+ this.layoutEngine = layoutEngine;
+
+ // create the node API in the body container
+ this.body.functions.createNode = this.create.bind(this);
+
+ this.nodesListeners = {
+ add: (event, params) => { this.add(params.items); },
+ update: (event, params) => { this.update(params.items, params.data, params.oldData); },
+ remove: (event, params) => { this.remove(params.items); }
+ };
+
+ this.defaultOptions = {
+ borderWidth: 1,
+ borderWidthSelected: 2,
+ brokenImage: undefined,
+ color: {
+ border: '#2B7CE9',
+ background: '#97C2FC',
+ highlight: {
+ border: '#2B7CE9',
+ background: '#D2E5FF'
+ },
+ hover: {
+ border: '#2B7CE9',
+ background: '#D2E5FF'
+ }
+ },
+ fixed: {
+ x: false,
+ y: false
+ },
+ font: {
+ color: '#343434',
+ size: 14, // px
+ face: 'arial',
+ background: 'none',
+ strokeWidth: 0, // px
+ strokeColor: '#ffffff',
+ align: 'center',
+ vadjust: 0,
+ multi: false,
+ bold: {
+ mod: 'bold'
+ },
+ boldital: {
+ mod: 'bold italic'
+ },
+ ital: {
+ mod: 'italic'
+ },
+ mono: {
+ mod: '',
+ size: 15, // px
+ face: 'monospace',
+ vadjust: 2
+ }
+ },
+ group: undefined,
+ hidden: false,
+ icon: {
+ face: 'FontAwesome', //'FontAwesome',
+ code: undefined, //'\uf007',
+ size: 50, //50,
+ color: '#2B7CE9' //'#aa00ff'
+ },
+ image: undefined, // --> URL
+ label: undefined,
+ labelHighlightBold: true,
+ level: undefined,
+ margin: {
+ top: 5,
+ right: 5,
+ bottom: 5,
+ left: 5
+ },
+ mass: 1,
+ physics: true,
+ scaling: {
+ min: 10,
+ max: 30,
+ label: {
+ enabled: false,
+ min: 14,
+ max: 30,
+ maxVisible: 30,
+ drawThreshold: 5
+ },
+ customScalingFunction: function (min, max, total, value) {
+ if (max === min) {
+ return 0.5;
+ }
+ else {
+ let scale = 1 / (max - min);
+ return Math.max(0, (value - min) * scale);
+ }
+ }
+ },
+ shadow: {
+ enabled: false,
+ color: 'rgba(0,0,0,0.5)',
+ size: 10,
+ x: 5,
+ y: 5
+ },
+ shape: 'ellipse',
+ shapeProperties: {
+ borderDashes: false, // only for borders
+ borderRadius: 6, // only for box shape
+ interpolation: true, // only for image and circularImage shapes
+ useImageSize: false, // only for image and circularImage shapes
+ useBorderWithImage: false // only for image shape
+ },
+ size: 25,
+ title: undefined,
+ value: undefined,
+ x: undefined,
+ y: undefined
+ };
+
+ // Protect from idiocy
+ if (this.defaultOptions.mass <= 0) {
+ throw 'Internal error: mass in defaultOptions of NodesHandler may not be zero or negative';
+ }
+
+ this.options = util.bridgeObject(this.defaultOptions);
+
+ this.bindEventListeners();
+ }
+
+ /**
+ * Binds event listeners
+ */
+ bindEventListeners() {
+ // refresh the nodes. Used when reverting from hierarchical layout
+ this.body.emitter.on('refreshNodes', this.refresh.bind(this));
+ this.body.emitter.on('refresh', this.refresh.bind(this));
+ this.body.emitter.on('destroy', () => {
+ util.forEach(this.nodesListeners, (callback, event) => {
+ if (this.body.data.nodes)
+ this.body.data.nodes.off(event, callback);
+ });
+ delete this.body.functions.createNode;
+ delete this.nodesListeners.add;
+ delete this.nodesListeners.update;
+ delete this.nodesListeners.remove;
+ delete this.nodesListeners;
+ });
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ Node.parseOptions(this.options, options);
+
+ // update the shape in all nodes
+ if (options.shape !== undefined) {
+ for (let nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId)) {
+ this.body.nodes[nodeId].updateShape();
+ }
+ }
+ }
+
+ // update the font in all nodes
+ if (options.font !== undefined) {
+ for (let nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId)) {
+ this.body.nodes[nodeId].updateLabelModule();
+ this.body.nodes[nodeId].needsRefresh();
+ }
+ }
+ }
+
+ // update the shape size in all nodes
+ if (options.size !== undefined) {
+ for (let nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId)) {
+ this.body.nodes[nodeId].needsRefresh();
+ }
+ }
+ }
+
+ // update the state of the variables if needed
+ if (options.hidden !== undefined || options.physics !== undefined) {
+ this.body.emitter.emit('_dataChanged');
+ }
+ }
+ }
+
+ /**
+ * Set a data set with nodes for the network
+ * @param {Array | DataSet | DataView} nodes The data containing the nodes.
+ * @param {boolean} [doNotEmit=false]
+ * @private
+ */
+ setData(nodes, doNotEmit = false) {
+ let oldNodesData = this.body.data.nodes;
+
+ if (nodes instanceof DataSet || nodes instanceof DataView) {
+ this.body.data.nodes = nodes;
+ }
+ else if (Array.isArray(nodes)) {
+ this.body.data.nodes = new DataSet();
+ this.body.data.nodes.add(nodes);
+ }
+ else if (!nodes) {
+ this.body.data.nodes = new DataSet();
+ }
+ else {
+ throw new TypeError('Array or DataSet expected');
+ }
+
+ if (oldNodesData) {
+ // unsubscribe from old dataset
+ util.forEach(this.nodesListeners, function (callback, event) {
+ oldNodesData.off(event, callback);
+ });
+ }
+
+ // remove drawn nodes
+ this.body.nodes = {};
+
+ if (this.body.data.nodes) {
+ // subscribe to new dataset
+ let me = this;
+ util.forEach(this.nodesListeners, function (callback, event) {
+ me.body.data.nodes.on(event, callback);
+ });
+
+ // draw all new nodes
+ let ids = this.body.data.nodes.getIds();
+ this.add(ids, true);
+ }
+
+ if (doNotEmit === false) {
+ this.body.emitter.emit("_dataChanged");
+ }
+ }
+
+
+ /**
+ * Add nodes
+ * @param {number[] | string[]} ids
+ * @param {boolean} [doNotEmit=false]
+ * @private
+ */
+ add(ids, doNotEmit = false) {
+ let id;
+ let newNodes = [];
+ for (let i = 0; i < ids.length; i++) {
+ id = ids[i];
+ let properties = this.body.data.nodes.get(id);
+ let node = this.create(properties);
+ newNodes.push(node);
+ this.body.nodes[id] = node; // note: this may replace an existing node
+ }
+
+ this.layoutEngine.positionInitially(newNodes);
+
+ if (doNotEmit === false) {
+ this.body.emitter.emit("_dataChanged");
+ }
+ }
+
+ /**
+ * Update existing nodes, or create them when not yet existing
+ * @param {number[] | string[]} ids id's of changed nodes
+ * @param {Array} changedData array with changed data
+ * @param {Array|undefined} oldData optional; array with previous data
+ * @private
+ */
+ update(ids, changedData, oldData) {
+ let nodes = this.body.nodes;
+ let dataChanged = false;
+ for (let i = 0; i < ids.length; i++) {
+ let id = ids[i];
+ let node = nodes[id];
+ let data = changedData[i];
+ if (node !== undefined) {
+ // update node
+ if (node.setOptions(data)) {
+ dataChanged = true;
+ }
+ }
+ else {
+ dataChanged = true;
+ // create node
+ node = this.create(data);
+ nodes[id] = node;
+ }
+ }
+
+ if (!dataChanged && oldData !== undefined) {
+ // Check for any changes which should trigger a layout recalculation
+ // For now, this is just 'level' for hierarchical layout
+ // Assumption: old and new data arranged in same order; at time of writing, this holds.
+ dataChanged = changedData.some(function(newValue, index) {
+ let oldValue = oldData[index];
+ return (oldValue && oldValue.level !== newValue.level);
+ });
+ }
+
+ if (dataChanged === true) {
+ this.body.emitter.emit("_dataChanged");
+ }
+ else {
+ this.body.emitter.emit("_dataUpdated");
+ }
+ }
+
+ /**
+ * Remove existing nodes. If nodes do not exist, the method will just ignore it.
+ * @param {number[] | string[]} ids
+ * @private
+ */
+ remove(ids) {
+ let nodes = this.body.nodes;
+
+ for (let i = 0; i < ids.length; i++) {
+ let id = ids[i];
+ delete nodes[id];
+ }
+
+ this.body.emitter.emit("_dataChanged");
+ }
+
+
+ /**
+ * create a node
+ * @param {Object} properties
+ * @param {class} [constructorClass=Node.default]
+ * @returns {*}
+ */
+ create(properties, constructorClass = Node) {
+ return new constructorClass(properties, this.body, this.images, this.groups, this.options, this.defaultOptions)
+ }
+
+
+ /**
+ *
+ * @param {boolean} [clearPositions=false]
+ */
+ refresh(clearPositions = false) {
+ util.forEach(this.body.nodes, (node, nodeId) => {
+ let data = this.body.data.nodes.get(nodeId);
+ if (data !== undefined) {
+ if (clearPositions === true) {
+ node.setOptions({x:null, y:null});
+ }
+ node.setOptions({ fixed: false });
+ node.setOptions(data);
+ }
+ });
+ }
+
+
+ /**
+ * Returns the positions of the nodes.
+ * @param {Array.|String} [ids] --> optional, can be array of nodeIds, can be string
+ * @returns {{}}
+ */
+ getPositions(ids) {
+ let dataArray = {};
+ if (ids !== undefined) {
+ if (Array.isArray(ids) === true) {
+ for (let i = 0; i < ids.length; i++) {
+ if (this.body.nodes[ids[i]] !== undefined) {
+ let node = this.body.nodes[ids[i]];
+ dataArray[ids[i]] = { x: Math.round(node.x), y: Math.round(node.y) };
+ }
+ }
+ }
+ else {
+ if (this.body.nodes[ids] !== undefined) {
+ let node = this.body.nodes[ids];
+ dataArray[ids] = { x: Math.round(node.x), y: Math.round(node.y) };
+ }
+ }
+ }
+ else {
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ let node = this.body.nodes[this.body.nodeIndices[i]];
+ dataArray[this.body.nodeIndices[i]] = { x: Math.round(node.x), y: Math.round(node.y) };
+ }
+ }
+ return dataArray;
+ }
+
+
+ /**
+ * Load the XY positions of the nodes into the dataset.
+ */
+ storePositions() {
+ // todo: add support for clusters and hierarchical.
+ let dataArray = [];
+ var dataset = this.body.data.nodes.getDataSet();
+
+ for (let nodeId in dataset._data) {
+ if (dataset._data.hasOwnProperty(nodeId)) {
+ let node = this.body.nodes[nodeId];
+ if (dataset._data[nodeId].x != Math.round(node.x) || dataset._data[nodeId].y != Math.round(node.y)) {
+ dataArray.push({ id: node.id, x: Math.round(node.x), y: Math.round(node.y) });
+ }
+ }
+ }
+ dataset.update(dataArray);
+ }
+
+ /**
+ * get the bounding box of a node.
+ * @param {Node.id} nodeId
+ * @returns {j|*}
+ */
+ getBoundingBox(nodeId) {
+ if (this.body.nodes[nodeId] !== undefined) {
+ return this.body.nodes[nodeId].shape.boundingBox;
+ }
+ }
+
+
+ /**
+ * Get the Ids of nodes connected to this node.
+ * @param {Node.id} nodeId
+ * @param {'to'|'from'|undefined} direction values 'from' and 'to' select respectively parent and child nodes only.
+ * Any other value returns both parent and child nodes.
+ * @returns {Array}
+ */
+ getConnectedNodes(nodeId, direction) {
+ let nodeList = [];
+ if (this.body.nodes[nodeId] !== undefined) {
+ let node = this.body.nodes[nodeId];
+ let nodeObj = {}; // used to quickly check if node already exists
+ for (let i = 0; i < node.edges.length; i++) {
+ let edge = node.edges[i];
+ if (direction !== 'to' && edge.toId == node.id) { // these are double equals since ids can be numeric or string
+ if (nodeObj[edge.fromId] === undefined) {
+ nodeList.push(edge.fromId);
+ nodeObj[edge.fromId] = true;
+ }
+ }
+ else if (direction !== 'from' && edge.fromId == node.id) { // these are double equals since ids can be numeric or string
+ if (nodeObj[edge.toId] === undefined) {
+ nodeList.push(edge.toId);
+ nodeObj[edge.toId] = true;
+ }
+ }
+ }
+ }
+ return nodeList;
+ }
+
+ /**
+ * Get the ids of the edges connected to this node.
+ * @param {Node.id} nodeId
+ * @returns {*}
+ */
+ getConnectedEdges(nodeId) {
+ let edgeList = [];
+ if (this.body.nodes[nodeId] !== undefined) {
+ let node = this.body.nodes[nodeId];
+ for (let i = 0; i < node.edges.length; i++) {
+ edgeList.push(node.edges[i].id)
+ }
+ }
+ else {
+ console.log("NodeId provided for getConnectedEdges does not exist. Provided: ", nodeId);
+ }
+ return edgeList;
+ }
+
+
+ /**
+ * Move a node.
+ *
+ * @param {Node.id} nodeId
+ * @param {number} x
+ * @param {number} y
+ */
+ moveNode(nodeId, x, y) {
+ if (this.body.nodes[nodeId] !== undefined) {
+ this.body.nodes[nodeId].x = Number(x);
+ this.body.nodes[nodeId].y = Number(y);
+ setTimeout(() => {this.body.emitter.emit("startSimulation")},0);
+ }
+ else {
+ console.log("Node id supplied to moveNode does not exist. Provided: ", nodeId);
+ }
+ }
+}
+
+export default NodesHandler;
diff --git a/lib/network/modules/PhysicsEngine.js b/lib/network/modules/PhysicsEngine.js
new file mode 100644
index 0000000000..1d3005fc18
--- /dev/null
+++ b/lib/network/modules/PhysicsEngine.js
@@ -0,0 +1,794 @@
+import BarnesHutSolver from './components/physics/BarnesHutSolver';
+import Repulsion from './components/physics/RepulsionSolver';
+import HierarchicalRepulsion from './components/physics/HierarchicalRepulsionSolver';
+import SpringSolver from './components/physics/SpringSolver';
+import HierarchicalSpringSolver from './components/physics/HierarchicalSpringSolver';
+import CentralGravitySolver from './components/physics/CentralGravitySolver';
+import ForceAtlas2BasedRepulsionSolver from './components/physics/FA2BasedRepulsionSolver';
+import ForceAtlas2BasedCentralGravitySolver from './components/physics/FA2BasedCentralGravitySolver';
+import util from 'vis-util';
+import EndPoints from './components/edges/util/EndPoints'; // for debugging with _drawForces()
+
+
+/**
+ * The physics engine
+ */
+class PhysicsEngine {
+ /**
+ * @param {Object} body
+ */
+ constructor(body) {
+ this.body = body;
+ this.physicsBody = {physicsNodeIndices:[], physicsEdgeIndices:[], forces: {}, velocities: {}};
+
+ this.physicsEnabled = true;
+ this.simulationInterval = 1000 / 60;
+ this.requiresTimeout = true;
+ this.previousStates = {};
+ this.referenceState = {};
+ this.freezeCache = {};
+ this.renderTimer = undefined;
+
+ // parameters for the adaptive timestep
+ this.adaptiveTimestep = false;
+ this.adaptiveTimestepEnabled = false;
+ this.adaptiveCounter = 0;
+ this.adaptiveInterval = 3;
+
+ this.stabilized = false;
+ this.startedStabilization = false;
+ this.stabilizationIterations = 0;
+ this.ready = false; // will be set to true if the stabilize
+
+ // default options
+ this.options = {};
+ this.defaultOptions = {
+ enabled: true,
+ barnesHut: {
+ theta: 0.5,
+ gravitationalConstant: -2000,
+ centralGravity: 0.3,
+ springLength: 95,
+ springConstant: 0.04,
+ damping: 0.09,
+ avoidOverlap: 0
+ },
+ forceAtlas2Based: {
+ theta: 0.5,
+ gravitationalConstant: -50,
+ centralGravity: 0.01,
+ springConstant: 0.08,
+ springLength: 100,
+ damping: 0.4,
+ avoidOverlap: 0
+ },
+ repulsion: {
+ centralGravity: 0.2,
+ springLength: 200,
+ springConstant: 0.05,
+ nodeDistance: 100,
+ damping: 0.09,
+ avoidOverlap: 0
+ },
+ hierarchicalRepulsion: {
+ centralGravity: 0.0,
+ springLength: 100,
+ springConstant: 0.01,
+ nodeDistance: 120,
+ damping: 0.09
+ },
+ maxVelocity: 50,
+ minVelocity: 0.75, // px/s
+ solver: 'barnesHut',
+ stabilization: {
+ enabled: true,
+ iterations: 1000, // maximum number of iteration to stabilize
+ updateInterval: 50,
+ onlyDynamicEdges: false,
+ fit: true
+ },
+ timestep: 0.5,
+ adaptiveTimestep: true
+ };
+ util.extend(this.options, this.defaultOptions);
+ this.timestep = 0.5;
+ this.layoutFailed = false;
+
+ this.bindEventListeners();
+ }
+
+ /**
+ * Binds event listeners
+ */
+ bindEventListeners() {
+ this.body.emitter.on('initPhysics', () => {this.initPhysics();});
+ this.body.emitter.on('_layoutFailed', () => {this.layoutFailed = true;});
+ this.body.emitter.on('resetPhysics', () => {this.stopSimulation(); this.ready = false;});
+ this.body.emitter.on('disablePhysics', () => {this.physicsEnabled = false; this.stopSimulation();});
+ this.body.emitter.on('restorePhysics', () => {
+ this.setOptions(this.options);
+ if (this.ready === true) {
+ this.startSimulation();
+ }
+ });
+ this.body.emitter.on('startSimulation', () => {
+ if (this.ready === true) {
+ this.startSimulation();
+ }
+ });
+ this.body.emitter.on('stopSimulation', () => {this.stopSimulation();});
+ this.body.emitter.on('destroy', () => {
+ this.stopSimulation(false);
+ this.body.emitter.off();
+ });
+ this.body.emitter.on("_dataChanged", () => {
+ // Nodes and/or edges have been added or removed, update shortcut lists.
+ this.updatePhysicsData();
+ });
+
+ // debug: show forces
+ // this.body.emitter.on("afterDrawing", (ctx) => {this._drawForces(ctx);});
+ }
+
+
+ /**
+ * set the physics options
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ if (options === false) {
+ this.options.enabled = false;
+ this.physicsEnabled = false;
+ this.stopSimulation();
+ }
+ else if (options === true) {
+ this.options.enabled = true;
+ this.physicsEnabled = true;
+ this.startSimulation();
+ }
+ else {
+ this.physicsEnabled = true;
+ util.selectiveNotDeepExtend(['stabilization'], this.options, options);
+ util.mergeOptions(this.options, options, 'stabilization');
+
+ if (options.enabled === undefined) {
+ this.options.enabled = true;
+ }
+
+ if (this.options.enabled === false) {
+ this.physicsEnabled = false;
+ this.stopSimulation();
+ }
+
+ // set the timestep
+ this.timestep = this.options.timestep;
+ }
+ }
+ this.init();
+ }
+
+
+ /**
+ * configure the engine.
+ */
+ init() {
+ var options;
+ if (this.options.solver === 'forceAtlas2Based') {
+ options = this.options.forceAtlas2Based;
+ this.nodesSolver = new ForceAtlas2BasedRepulsionSolver(this.body, this.physicsBody, options);
+ this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options);
+ this.gravitySolver = new ForceAtlas2BasedCentralGravitySolver(this.body, this.physicsBody, options);
+ }
+ else if (this.options.solver === 'repulsion') {
+ options = this.options.repulsion;
+ this.nodesSolver = new Repulsion(this.body, this.physicsBody, options);
+ this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options);
+ this.gravitySolver = new CentralGravitySolver(this.body, this.physicsBody, options);
+ }
+ else if (this.options.solver === 'hierarchicalRepulsion') {
+ options = this.options.hierarchicalRepulsion;
+ this.nodesSolver = new HierarchicalRepulsion(this.body, this.physicsBody, options);
+ this.edgesSolver = new HierarchicalSpringSolver(this.body, this.physicsBody, options);
+ this.gravitySolver = new CentralGravitySolver(this.body, this.physicsBody, options);
+ }
+ else { // barnesHut
+ options = this.options.barnesHut;
+ this.nodesSolver = new BarnesHutSolver(this.body, this.physicsBody, options);
+ this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options);
+ this.gravitySolver = new CentralGravitySolver(this.body, this.physicsBody, options);
+ }
+
+ this.modelOptions = options;
+ }
+
+
+ /**
+ * initialize the engine
+ */
+ initPhysics() {
+ if (this.physicsEnabled === true && this.options.enabled === true) {
+ if (this.options.stabilization.enabled === true) {
+ this.stabilize();
+ }
+ else {
+ this.stabilized = false;
+ this.ready = true;
+ this.body.emitter.emit('fit', {}, this.layoutFailed); // if the layout failed, we use the approximation for the zoom
+ this.startSimulation();
+ }
+ }
+ else {
+ this.ready = true;
+ this.body.emitter.emit('fit');
+ }
+ }
+
+ /**
+ * Start the simulation
+ */
+ startSimulation() {
+ if (this.physicsEnabled === true && this.options.enabled === true) {
+ this.stabilized = false;
+
+ // when visible, adaptivity is disabled.
+ this.adaptiveTimestep = false;
+
+ // this sets the width of all nodes initially which could be required for the avoidOverlap
+ this.body.emitter.emit("_resizeNodes");
+ if (this.viewFunction === undefined) {
+ this.viewFunction = this.simulationStep.bind(this);
+ this.body.emitter.on('initRedraw', this.viewFunction);
+ this.body.emitter.emit('_startRendering');
+ }
+ }
+ else {
+ this.body.emitter.emit('_redraw');
+ }
+ }
+
+
+ /**
+ * Stop the simulation, force stabilization.
+ * @param {boolean} [emit=true]
+ */
+ stopSimulation(emit = true) {
+ this.stabilized = true;
+ if (emit === true) {
+ this._emitStabilized();
+ }
+ if (this.viewFunction !== undefined) {
+ this.body.emitter.off('initRedraw', this.viewFunction);
+ this.viewFunction = undefined;
+ if (emit === true) {
+ this.body.emitter.emit('_stopRendering');
+ }
+ }
+ }
+
+
+ /**
+ * The viewFunction inserts this step into each render loop. It calls the physics tick and handles the cleanup at stabilized.
+ *
+ */
+ simulationStep() {
+ // check if the physics have settled
+ var startTime = Date.now();
+ this.physicsTick();
+ var physicsTime = Date.now() - startTime;
+
+ // run double speed if it is a little graph
+ if ((physicsTime < 0.4 * this.simulationInterval || this.runDoubleSpeed === true) && this.stabilized === false) {
+ this.physicsTick();
+
+ // this makes sure there is no jitter. The decision is taken once to run it at double speed.
+ this.runDoubleSpeed = true;
+ }
+
+ if (this.stabilized === true) {
+ this.stopSimulation();
+ }
+ }
+
+
+ /**
+ * trigger the stabilized event.
+ *
+ * @param {number} [amountOfIterations=this.stabilizationIterations]
+ * @private
+ */
+ _emitStabilized(amountOfIterations = this.stabilizationIterations) {
+ if (this.stabilizationIterations > 1 || this.startedStabilization === true) {
+ setTimeout(() => {
+ this.body.emitter.emit('stabilized', {iterations: amountOfIterations});
+ this.startedStabilization = false;
+ this.stabilizationIterations = 0;
+ }, 0);
+ }
+ }
+
+
+ /**
+ * Calculate the forces for one physics iteration and move the nodes.
+ * @private
+ */
+ physicsStep() {
+ this.gravitySolver.solve();
+ this.nodesSolver.solve();
+ this.edgesSolver.solve();
+ this.moveNodes();
+ }
+
+
+ /**
+ * Make dynamic adjustments to the timestep, based on current state.
+ *
+ * Helper function for physicsTick().
+ * @private
+ */
+ adjustTimeStep() {
+ const factor = 1.2; // Factor for increasing the timestep on success.
+
+ // we compare the two steps. if it is acceptable we double the step.
+ if (this._evaluateStepQuality() === true) {
+ this.timestep = factor * this.timestep;
+ }
+ else {
+ // if not, we decrease the step to a minimum of the options timestep.
+ // if the decreased timestep is smaller than the options step, we do not reset the counter
+ // we assume that the options timestep is stable enough.
+ if (this.timestep/factor < this.options.timestep) {
+ this.timestep = this.options.timestep;
+ }
+ else {
+ // if the timestep was larger than 2 times the option one we check the adaptivity again to ensure
+ // that large instabilities do not form.
+ this.adaptiveCounter = -1; // check again next iteration
+ this.timestep = Math.max(this.options.timestep, this.timestep/factor);
+ }
+ }
+ }
+
+
+ /**
+ * A single simulation step (or 'tick') in the physics simulation
+ *
+ * @private
+ */
+ physicsTick() {
+ this._startStabilizing(); // this ensures that there is no start event when the network is already stable.
+ if (this.stabilized === true) return;
+
+ // adaptivity means the timestep adapts to the situation, only applicable for stabilization
+ if (this.adaptiveTimestep === true && this.adaptiveTimestepEnabled === true) {
+ // timestep remains stable for "interval" iterations.
+ let doAdaptive = (this.adaptiveCounter % this.adaptiveInterval === 0);
+
+ if (doAdaptive) {
+ // first the big step and revert.
+ this.timestep = 2 * this.timestep;
+ this.physicsStep();
+ this.revert(); // saves the reference state
+
+ // now the normal step. Since this is the last step, it is the more stable one and we will take this.
+ this.timestep = 0.5 * this.timestep;
+
+ // since it's half the step, we do it twice.
+ this.physicsStep();
+ this.physicsStep();
+
+ this.adjustTimeStep();
+ }
+ else {
+ this.physicsStep(); // normal step, keeping timestep constant
+ }
+
+ this.adaptiveCounter += 1;
+ }
+ else {
+ // case for the static timestep, we reset it to the one in options and take a normal step.
+ this.timestep = this.options.timestep;
+ this.physicsStep();
+ }
+
+ if (this.stabilized === true) this.revert();
+ this.stabilizationIterations++;
+ }
+
+
+ /**
+ * Nodes and edges can have the physics toggles on or off. A collection of indices is created here so we can skip the check all the time.
+ *
+ * @private
+ */
+ updatePhysicsData() {
+ this.physicsBody.forces = {};
+ this.physicsBody.physicsNodeIndices = [];
+ this.physicsBody.physicsEdgeIndices = [];
+ let nodes = this.body.nodes;
+ let edges = this.body.edges;
+
+ // get node indices for physics
+ for (let nodeId in nodes) {
+ if (nodes.hasOwnProperty(nodeId)) {
+ if (nodes[nodeId].options.physics === true) {
+ this.physicsBody.physicsNodeIndices.push(nodes[nodeId].id);
+ }
+ }
+ }
+
+ // get edge indices for physics
+ for (let edgeId in edges) {
+ if (edges.hasOwnProperty(edgeId)) {
+ if (edges[edgeId].options.physics === true) {
+ this.physicsBody.physicsEdgeIndices.push(edges[edgeId].id);
+ }
+ }
+ }
+
+ // get the velocity and the forces vector
+ for (let i = 0; i < this.physicsBody.physicsNodeIndices.length; i++) {
+ let nodeId = this.physicsBody.physicsNodeIndices[i];
+ this.physicsBody.forces[nodeId] = {x:0,y:0};
+
+ // forces can be reset because they are recalculated. Velocities have to persist.
+ if (this.physicsBody.velocities[nodeId] === undefined) {
+ this.physicsBody.velocities[nodeId] = {x:0,y:0};
+ }
+ }
+
+ // clean deleted nodes from the velocity vector
+ for (let nodeId in this.physicsBody.velocities) {
+ if (nodes[nodeId] === undefined) {
+ delete this.physicsBody.velocities[nodeId];
+ }
+ }
+ }
+
+
+ /**
+ * Revert the simulation one step. This is done so after stabilization, every new start of the simulation will also say stabilized.
+ */
+ revert() {
+ var nodeIds = Object.keys(this.previousStates);
+ var nodes = this.body.nodes;
+ var velocities = this.physicsBody.velocities;
+ this.referenceState = {};
+
+ for (let i = 0; i < nodeIds.length; i++) {
+ let nodeId = nodeIds[i];
+ if (nodes[nodeId] !== undefined) {
+ if (nodes[nodeId].options.physics === true) {
+ this.referenceState[nodeId] = {
+ positions: {x:nodes[nodeId].x, y:nodes[nodeId].y}
+ };
+ velocities[nodeId].x = this.previousStates[nodeId].vx;
+ velocities[nodeId].y = this.previousStates[nodeId].vy;
+ nodes[nodeId].x = this.previousStates[nodeId].x;
+ nodes[nodeId].y = this.previousStates[nodeId].y;
+ }
+ }
+ else {
+ delete this.previousStates[nodeId];
+ }
+ }
+ }
+
+ /**
+ * This compares the reference state to the current state
+ *
+ * @returns {boolean}
+ * @private
+ */
+ _evaluateStepQuality() {
+ let dx, dy, dpos;
+ let nodes = this.body.nodes;
+ let reference = this.referenceState;
+ let posThreshold = 0.3;
+
+ for (let nodeId in this.referenceState) {
+ if (this.referenceState.hasOwnProperty(nodeId) && nodes[nodeId] !== undefined) {
+ dx = nodes[nodeId].x - reference[nodeId].positions.x;
+ dy = nodes[nodeId].y - reference[nodeId].positions.y;
+
+ dpos = Math.sqrt(Math.pow(dx,2) + Math.pow(dy,2))
+
+ if (dpos > posThreshold) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * move the nodes one timestep and check if they are stabilized
+ */
+ moveNodes() {
+ var nodeIndices = this.physicsBody.physicsNodeIndices;
+ var maxNodeVelocity = 0;
+ var averageNodeVelocity = 0;
+
+ // the velocity threshold (energy in the system) for the adaptivity toggle
+ var velocityAdaptiveThreshold = 5;
+
+ for (let i = 0; i < nodeIndices.length; i++) {
+ let nodeId = nodeIndices[i];
+ let nodeVelocity = this._performStep(nodeId);
+ // stabilized is true if stabilized is true and velocity is smaller than vmin --> all nodes must be stabilized
+ maxNodeVelocity = Math.max(maxNodeVelocity, nodeVelocity);
+ averageNodeVelocity += nodeVelocity;
+ }
+
+ // evaluating the stabilized and adaptiveTimestepEnabled conditions
+ this.adaptiveTimestepEnabled = (averageNodeVelocity/nodeIndices.length) < velocityAdaptiveThreshold;
+ this.stabilized = maxNodeVelocity < this.options.minVelocity;
+ }
+
+
+ /**
+ * Calculate new velocity for a coordinate direction
+ *
+ * @param {number} v velocity for current coordinate
+ * @param {number} f regular force for current coordinate
+ * @param {number} m mass of current node
+ * @returns {number} new velocity for current coordinate
+ * @private
+ */
+ calculateComponentVelocity(v,f, m) {
+ let df = this.modelOptions.damping * v; // damping force
+ let a = (f - df) / m; // acceleration
+
+ v += a * this.timestep;
+
+ // Put a limit on the velocities if it is really high
+ let maxV = this.options.maxVelocity || 1e9;
+ if (Math.abs(v) > maxV) {
+ v = ((v > 0) ? maxV: -maxV);
+ }
+
+ return v;
+ }
+
+
+ /**
+ * Perform the actual step
+ *
+ * @param {Node.id} nodeId
+ * @returns {number} the new velocity of given node
+ * @private
+ */
+ _performStep(nodeId) {
+ let node = this.body.nodes[nodeId];
+ let force = this.physicsBody.forces[nodeId];
+ let velocity = this.physicsBody.velocities[nodeId];
+
+ // store the state so we can revert
+ this.previousStates[nodeId] = {x:node.x, y:node.y, vx:velocity.x, vy:velocity.y};
+
+ if (node.options.fixed.x === false) {
+ velocity.x = this.calculateComponentVelocity(velocity.x, force.x, node.options.mass);
+ node.x += velocity.x * this.timestep;
+ }
+ else {
+ force.x = 0;
+ velocity.x = 0;
+ }
+
+ if (node.options.fixed.y === false) {
+ velocity.y = this.calculateComponentVelocity(velocity.y, force.y, node.options.mass);
+ node.y += velocity.y * this.timestep;
+ }
+ else {
+ force.y = 0;
+ velocity.y = 0;
+ }
+
+ let totalVelocity = Math.sqrt(Math.pow(velocity.x,2) + Math.pow(velocity.y,2));
+ return totalVelocity;
+ }
+
+
+ /**
+ * When initializing and stabilizing, we can freeze nodes with a predefined position.
+ * This greatly speeds up stabilization because only the supportnodes for the smoothCurves have to settle.
+ *
+ * @private
+ */
+ _freezeNodes() {
+ var nodes = this.body.nodes;
+ for (var id in nodes) {
+ if (nodes.hasOwnProperty(id)) {
+ if (nodes[id].x && nodes[id].y) {
+ let fixed = nodes[id].options.fixed;
+ this.freezeCache[id] = {x:fixed.x, y:fixed.y};
+ fixed.x = true;
+ fixed.y = true;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Unfreezes the nodes that have been frozen by _freezeDefinedNodes.
+ *
+ * @private
+ */
+ _restoreFrozenNodes() {
+ var nodes = this.body.nodes;
+ for (var id in nodes) {
+ if (nodes.hasOwnProperty(id)) {
+ if (this.freezeCache[id] !== undefined) {
+ nodes[id].options.fixed.x = this.freezeCache[id].x;
+ nodes[id].options.fixed.y = this.freezeCache[id].y;
+ }
+ }
+ }
+ this.freezeCache = {};
+ }
+
+ /**
+ * Find a stable position for all nodes
+ *
+ * @param {number} [iterations=this.options.stabilization.iterations]
+ */
+ stabilize(iterations = this.options.stabilization.iterations) {
+ if (typeof iterations !== 'number') {
+ iterations = this.options.stabilization.iterations;
+ console.log('The stabilize method needs a numeric amount of iterations. Switching to default: ', iterations);
+ }
+
+ if (this.physicsBody.physicsNodeIndices.length === 0) {
+ this.ready = true;
+ return;
+ }
+
+ // enable adaptive timesteps
+ this.adaptiveTimestep = true && this.options.adaptiveTimestep;
+
+ // this sets the width of all nodes initially which could be required for the avoidOverlap
+ this.body.emitter.emit("_resizeNodes");
+
+ this.stopSimulation(); // stop the render loop
+ this.stabilized = false;
+
+ // block redraw requests
+ this.body.emitter.emit('_blockRedraw');
+ this.targetIterations = iterations;
+
+ // start the stabilization
+ if (this.options.stabilization.onlyDynamicEdges === true) {
+ this._freezeNodes();
+ }
+ this.stabilizationIterations = 0;
+
+ setTimeout(() => this._stabilizationBatch(),0);
+ }
+
+
+ /**
+ * If not already stabilizing, start it and emit a start event.
+ *
+ * @returns {boolean} true if stabilization started with this call
+ * @private
+ */
+ _startStabilizing() {
+ if (this.startedStabilization === true) return false;
+
+ this.body.emitter.emit('startStabilizing');
+ this.startedStabilization = true;
+ return true;
+ }
+
+
+ /**
+ * One batch of stabilization
+ * @private
+ */
+ _stabilizationBatch() {
+ var running = () => (this.stabilized === false && this.stabilizationIterations < this.targetIterations);
+
+ var sendProgress = () => {
+ this.body.emitter.emit('stabilizationProgress', {
+ iterations: this.stabilizationIterations,
+ total: this.targetIterations
+ });
+ };
+
+ if (this._startStabilizing()) {
+ sendProgress(); // Ensure that there is at least one start event.
+ }
+
+ var count = 0;
+ while (running() && count < this.options.stabilization.updateInterval) {
+ this.physicsTick();
+ count++;
+ }
+
+ sendProgress();
+
+ if (running()) {
+ setTimeout(this._stabilizationBatch.bind(this),0);
+ }
+ else {
+ this._finalizeStabilization();
+ }
+ }
+
+
+ /**
+ * Wrap up the stabilization, fit and emit the events.
+ * @private
+ */
+ _finalizeStabilization() {
+ this.body.emitter.emit('_allowRedraw');
+ if (this.options.stabilization.fit === true) {
+ this.body.emitter.emit('fit');
+ }
+
+ if (this.options.stabilization.onlyDynamicEdges === true) {
+ this._restoreFrozenNodes();
+ }
+
+ this.body.emitter.emit('stabilizationIterationsDone');
+ this.body.emitter.emit('_requestRedraw');
+
+ if (this.stabilized === true) {
+ this._emitStabilized();
+ }
+ else {
+ this.startSimulation();
+ }
+
+ this.ready = true;
+ }
+
+
+ //--------------------------- DEBUGGING BELOW ---------------------------//
+
+
+ /**
+ * Debug function that display arrows for the forces currently active in the network.
+ *
+ * Use this when debugging only.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @private
+ */
+ _drawForces(ctx) {
+ for (var i = 0; i < this.physicsBody.physicsNodeIndices.length; i++) {
+ let index = this.physicsBody.physicsNodeIndices[i];
+ let node = this.body.nodes[index];
+ let force = this.physicsBody.forces[index];
+ let factor = 20;
+ let colorFactor = 0.03;
+ let forceSize = Math.sqrt(Math.pow(force.x,2) + Math.pow(force.x,2));
+
+ let size = Math.min(Math.max(5,forceSize),15);
+ let arrowSize = 3*size;
+
+ let color = util.HSVToHex((180 - Math.min(1,Math.max(0,colorFactor*forceSize))*180) / 360,1,1);
+
+ let point = {
+ x: node.x + factor*force.x,
+ y: node.y + factor*force.y
+ };
+
+ ctx.lineWidth = size;
+ ctx.strokeStyle = color;
+ ctx.beginPath();
+ ctx.moveTo(node.x,node.y);
+ ctx.lineTo(point.x, point.y);
+ ctx.stroke();
+
+ let angle = Math.atan2(force.y, force.x);
+ ctx.fillStyle = color;
+ EndPoints.draw(ctx, {type: 'arrow', point: point, angle: angle, length: arrowSize});
+ ctx.fill();
+
+ }
+ }
+}
+
+export default PhysicsEngine;
diff --git a/lib/network/modules/SelectionHandler.js b/lib/network/modules/SelectionHandler.js
new file mode 100644
index 0000000000..2ddd4c4832
--- /dev/null
+++ b/lib/network/modules/SelectionHandler.js
@@ -0,0 +1,858 @@
+import Node from './components/Node';
+import Edge from './components/Edge';
+
+import util from 'vis-util';
+
+/**
+ * The handler for selections
+ */
+class SelectionHandler {
+ /**
+ * @param {Object} body
+ * @param {Canvas} canvas
+ */
+ constructor(body, canvas) {
+ this.body = body;
+ this.canvas = canvas;
+ this.selectionObj = {nodes: [], edges: []};
+ this.hoverObj = {nodes:{},edges:{}};
+
+ this.options = {};
+ this.defaultOptions = {
+ multiselect: false,
+ selectable: true,
+ selectConnectedEdges: true,
+ hoverConnectedEdges: true
+ };
+ util.extend(this.options, this.defaultOptions);
+
+ this.body.emitter.on("_dataChanged", () => {
+ this.updateSelection()
+ });
+ }
+
+
+ /**
+ *
+ * @param {Object} [options]
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ let fields = ['multiselect','hoverConnectedEdges','selectable','selectConnectedEdges'];
+ util.selectiveDeepExtend(fields,this.options, options);
+ }
+ }
+
+
+ /**
+ * handles the selection part of the tap;
+ *
+ * @param {{x: number, y: number}} pointer
+ * @returns {boolean}
+ */
+ selectOnPoint(pointer) {
+ let selected = false;
+ if (this.options.selectable === true) {
+ let obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);
+
+ // unselect after getting the objects in order to restore width and height.
+ this.unselectAll();
+
+ if (obj !== undefined) {
+ selected = this.selectObject(obj);
+ }
+ this.body.emitter.emit("_requestRedraw");
+ }
+ return selected;
+ }
+
+ /**
+ *
+ * @param {{x: number, y: number}} pointer
+ * @returns {boolean}
+ */
+ selectAdditionalOnPoint(pointer) {
+ let selectionChanged = false;
+ if (this.options.selectable === true) {
+ let obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);
+
+ if (obj !== undefined) {
+ selectionChanged = true;
+ if (obj.isSelected() === true) {
+ this.deselectObject(obj);
+ }
+ else {
+ this.selectObject(obj);
+ }
+
+ this.body.emitter.emit("_requestRedraw");
+ }
+ }
+ return selectionChanged;
+ }
+
+
+ /**
+ * Create an object containing the standard fields for an event.
+ *
+ * @param {Event} event
+ * @param {{x: number, y: number}} pointer Object with the x and y screen coordinates of the mouse
+ * @returns {{}}
+ * @private
+ */
+ _initBaseEvent(event, pointer) {
+ let properties = {};
+
+ properties['pointer'] = {
+ DOM: {x: pointer.x, y: pointer.y},
+ canvas: this.canvas.DOMtoCanvas(pointer)
+ };
+ properties['event'] = event;
+
+ return properties;
+ }
+
+
+ /**
+ * Generate an event which the user can catch.
+ *
+ * This adds some extra data to the event with respect to cursor position and
+ * selected nodes and edges.
+ *
+ * @param {string} eventType Name of event to send
+ * @param {Event} event
+ * @param {{x: number, y: number}} pointer Object with the x and y screen coordinates of the mouse
+ * @param {Object|undefined} oldSelection If present, selection state before event occured
+ * @param {boolean|undefined} [emptySelection=false] Indicate if selection data should be passed
+ */
+ _generateClickEvent(eventType, event, pointer, oldSelection, emptySelection = false) {
+ let properties = this._initBaseEvent(event, pointer);
+
+ if (emptySelection === true) {
+ properties.nodes = [];
+ properties.edges = [];
+ }
+ else {
+ let tmp = this.getSelection();
+ properties.nodes = tmp.nodes;
+ properties.edges = tmp.edges;
+ }
+
+ if (oldSelection !== undefined) {
+ properties['previousSelection'] = oldSelection;
+ }
+
+ if (eventType == 'click') {
+ // For the time being, restrict this functionality to
+ // just the click event.
+ properties.items = this.getClickedItems(pointer);
+ }
+
+ this.body.emitter.emit(eventType, properties);
+ }
+
+ /**
+ *
+ * @param {Object} obj
+ * @param {boolean} [highlightEdges=this.options.selectConnectedEdges]
+ * @returns {boolean}
+ */
+ selectObject(obj, highlightEdges = this.options.selectConnectedEdges) {
+ if (obj !== undefined) {
+ if (obj instanceof Node) {
+ if (highlightEdges === true) {
+ this._selectConnectedEdges(obj);
+ }
+ }
+ obj.select();
+ this._addToSelection(obj);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @param {Object} obj
+ */
+ deselectObject(obj) {
+ if (obj.isSelected() === true) {
+ obj.selected = false;
+ this._removeFromSelection(obj);
+ }
+ }
+
+
+
+ /**
+ * retrieve all nodes overlapping with given object
+ * @param {Object} object An object with parameters left, top, right, bottom
+ * @return {number[]} An array with id's of the overlapping nodes
+ * @private
+ */
+ _getAllNodesOverlappingWith(object) {
+ let overlappingNodes = [];
+ let nodes = this.body.nodes;
+ for (let i = 0; i < this.body.nodeIndices.length; i++) {
+ let nodeId = this.body.nodeIndices[i];
+ if (nodes[nodeId].isOverlappingWith(object)) {
+ overlappingNodes.push(nodeId);
+ }
+ }
+ return overlappingNodes;
+ }
+
+
+ /**
+ * Return a position object in canvasspace from a single point in screenspace
+ *
+ * @param {{x: number, y: number}} pointer
+ * @returns {{left: number, top: number, right: number, bottom: number}}
+ * @private
+ */
+ _pointerToPositionObject(pointer) {
+ let canvasPos = this.canvas.DOMtoCanvas(pointer);
+ return {
+ left: canvasPos.x - 1,
+ top: canvasPos.y + 1,
+ right: canvasPos.x + 1,
+ bottom: canvasPos.y - 1
+ };
+ }
+
+
+ /**
+ * Get the top node at the passed point (like a click)
+ *
+ * @param {{x: number, y: number}} pointer
+ * @param {boolean} [returnNode=true]
+ * @return {Node | undefined} node
+ */
+ getNodeAt(pointer, returnNode = true) {
+ // we first check if this is an navigation controls element
+ let positionObject = this._pointerToPositionObject(pointer);
+ let overlappingNodes = this._getAllNodesOverlappingWith(positionObject);
+ // if there are overlapping nodes, select the last one, this is the
+ // one which is drawn on top of the others
+ if (overlappingNodes.length > 0) {
+ if (returnNode === true) {
+ return this.body.nodes[overlappingNodes[overlappingNodes.length - 1]];
+ }
+ else {
+ return overlappingNodes[overlappingNodes.length - 1];
+ }
+ }
+ else {
+ return undefined;
+ }
+ }
+
+
+ /**
+ * retrieve all edges overlapping with given object, selector is around center
+ * @param {Object} object An object with parameters left, top, right, bottom
+ * @param {number[]} overlappingEdges An array with id's of the overlapping nodes
+ * @private
+ */
+ _getEdgesOverlappingWith(object, overlappingEdges) {
+ let edges = this.body.edges;
+ for (let i = 0; i < this.body.edgeIndices.length; i++) {
+ let edgeId = this.body.edgeIndices[i];
+ if (edges[edgeId].isOverlappingWith(object)) {
+ overlappingEdges.push(edgeId);
+ }
+ }
+ }
+
+
+ /**
+ * retrieve all nodes overlapping with given object
+ * @param {Object} object An object with parameters left, top, right, bottom
+ * @return {number[]} An array with id's of the overlapping nodes
+ * @private
+ */
+ _getAllEdgesOverlappingWith(object) {
+ let overlappingEdges = [];
+ this._getEdgesOverlappingWith(object,overlappingEdges);
+ return overlappingEdges;
+ }
+
+
+ /**
+ * Get the edges nearest to the passed point (like a click)
+ *
+ * @param {{x: number, y: number}} pointer
+ * @param {boolean} [returnEdge=true]
+ * @return {Edge | undefined} node
+ */
+ getEdgeAt(pointer, returnEdge = true) {
+ // Iterate over edges, pick closest within 10
+ var canvasPos = this.canvas.DOMtoCanvas(pointer);
+ var mindist = 10;
+ var overlappingEdge = null;
+ var edges = this.body.edges;
+ for (var i = 0; i < this.body.edgeIndices.length; i++) {
+ var edgeId = this.body.edgeIndices[i];
+ var edge = edges[edgeId];
+ if (edge.connected) {
+ var xFrom = edge.from.x;
+ var yFrom = edge.from.y;
+ var xTo = edge.to.x;
+ var yTo = edge.to.y;
+ var dist = edge.edgeType.getDistanceToEdge(xFrom, yFrom, xTo, yTo, canvasPos.x, canvasPos.y);
+ if(dist < mindist){
+ overlappingEdge = edgeId;
+ mindist = dist;
+ }
+ }
+ }
+ if (overlappingEdge !== null) {
+ if (returnEdge === true) {
+ return this.body.edges[overlappingEdge];
+ }
+ else {
+ return overlappingEdge;
+ }
+ }
+ else {
+ return undefined;
+ }
+ }
+
+
+ /**
+ * Add object to the selection array.
+ *
+ * @param {Object} obj
+ * @private
+ */
+ _addToSelection(obj) {
+ if (obj instanceof Node) {
+ this.selectionObj.nodes[obj.id] = obj;
+ }
+ else {
+ this.selectionObj.edges[obj.id] = obj;
+ }
+ }
+
+ /**
+ * Add object to the selection array.
+ *
+ * @param {Object} obj
+ * @private
+ */
+ _addToHover(obj) {
+ if (obj instanceof Node) {
+ this.hoverObj.nodes[obj.id] = obj;
+ }
+ else {
+ this.hoverObj.edges[obj.id] = obj;
+ }
+ }
+
+
+ /**
+ * Remove a single option from selection.
+ *
+ * @param {Object} obj
+ * @private
+ */
+ _removeFromSelection(obj) {
+ if (obj instanceof Node) {
+ delete this.selectionObj.nodes[obj.id];
+ this._unselectConnectedEdges(obj);
+ }
+ else {
+ delete this.selectionObj.edges[obj.id];
+ }
+ }
+
+ /**
+ * Unselect all. The selectionObj is useful for this.
+ */
+ unselectAll() {
+ for(let nodeId in this.selectionObj.nodes) {
+ if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ this.selectionObj.nodes[nodeId].unselect();
+ }
+ }
+ for(let edgeId in this.selectionObj.edges) {
+ if(this.selectionObj.edges.hasOwnProperty(edgeId)) {
+ this.selectionObj.edges[edgeId].unselect();
+ }
+ }
+
+ this.selectionObj = {nodes:{},edges:{}};
+ }
+
+
+ /**
+ * return the number of selected nodes
+ *
+ * @returns {number}
+ * @private
+ */
+ _getSelectedNodeCount() {
+ let count = 0;
+ for (let nodeId in this.selectionObj.nodes) {
+ if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ count += 1;
+ }
+ }
+ return count;
+ }
+
+ /**
+ * return the selected node
+ *
+ * @returns {number}
+ * @private
+ */
+ _getSelectedNode() {
+ for (let nodeId in this.selectionObj.nodes) {
+ if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ return this.selectionObj.nodes[nodeId];
+ }
+ }
+ return undefined;
+ }
+
+ /**
+ * return the selected edge
+ *
+ * @returns {number}
+ * @private
+ */
+ _getSelectedEdge() {
+ for (let edgeId in this.selectionObj.edges) {
+ if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
+ return this.selectionObj.edges[edgeId];
+ }
+ }
+ return undefined;
+ }
+
+
+ /**
+ * return the number of selected edges
+ *
+ * @returns {number}
+ * @private
+ */
+ _getSelectedEdgeCount() {
+ let count = 0;
+ for (let edgeId in this.selectionObj.edges) {
+ if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
+ count += 1;
+ }
+ }
+ return count;
+ }
+
+
+ /**
+ * return the number of selected objects.
+ *
+ * @returns {number}
+ * @private
+ */
+ _getSelectedObjectCount() {
+ let count = 0;
+ for(let nodeId in this.selectionObj.nodes) {
+ if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ count += 1;
+ }
+ }
+ for(let edgeId in this.selectionObj.edges) {
+ if(this.selectionObj.edges.hasOwnProperty(edgeId)) {
+ count += 1;
+ }
+ }
+ return count;
+ }
+
+ /**
+ * Check if anything is selected
+ *
+ * @returns {boolean}
+ * @private
+ */
+ _selectionIsEmpty() {
+ for(let nodeId in this.selectionObj.nodes) {
+ if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ return false;
+ }
+ }
+ for(let edgeId in this.selectionObj.edges) {
+ if(this.selectionObj.edges.hasOwnProperty(edgeId)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ /**
+ * check if one of the selected nodes is a cluster.
+ *
+ * @returns {boolean}
+ * @private
+ */
+ _clusterInSelection() {
+ for(let nodeId in this.selectionObj.nodes) {
+ if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ if (this.selectionObj.nodes[nodeId].clusterSize > 1) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * select the edges connected to the node that is being selected
+ *
+ * @param {Node} node
+ * @private
+ */
+ _selectConnectedEdges(node) {
+ for (let i = 0; i < node.edges.length; i++) {
+ let edge = node.edges[i];
+ edge.select();
+ this._addToSelection(edge);
+ }
+ }
+
+ /**
+ * select the edges connected to the node that is being selected
+ *
+ * @param {Node} node
+ * @private
+ */
+ _hoverConnectedEdges(node) {
+ for (let i = 0; i < node.edges.length; i++) {
+ let edge = node.edges[i];
+ edge.hover = true;
+ this._addToHover(edge);
+ }
+ }
+
+
+ /**
+ * unselect the edges connected to the node that is being selected
+ *
+ * @param {Node} node
+ * @private
+ */
+ _unselectConnectedEdges(node) {
+ for (let i = 0; i < node.edges.length; i++) {
+ let edge = node.edges[i];
+ edge.unselect();
+ this._removeFromSelection(edge);
+ }
+ }
+
+
+ /**
+ * Remove the highlight from a node or edge, in response to mouse movement
+ *
+ * @param {Event} event
+ * @param {{x: number, y: number}} pointer object with the x and y screen coordinates of the mouse
+ * @param {Node|vis.Edge} object
+ * @private
+ */
+ emitBlurEvent(event, pointer, object) {
+ let properties = this._initBaseEvent(event, pointer);
+
+ if (object.hover === true) {
+ object.hover = false;
+ if (object instanceof Node) {
+ properties.node = object.id;
+ this.body.emitter.emit("blurNode", properties);
+ }
+ else {
+ properties.edge = object.id;
+ this.body.emitter.emit("blurEdge", properties);
+ }
+ }
+ }
+
+
+ /**
+ * Create the highlight for a node or edge, in response to mouse movement
+ *
+ * @param {Event} event
+ * @param {{x: number, y: number}} pointer object with the x and y screen coordinates of the mouse
+ * @param {Node|vis.Edge} object
+ * @returns {boolean} hoverChanged
+ * @private
+ */
+ emitHoverEvent(event, pointer, object) {
+ let properties = this._initBaseEvent(event, pointer);
+ let hoverChanged = false;
+
+ if (object.hover === false) {
+ object.hover = true;
+ this._addToHover(object);
+ hoverChanged = true;
+ if (object instanceof Node) {
+ properties.node = object.id;
+ this.body.emitter.emit("hoverNode", properties);
+ }
+ else {
+ properties.edge = object.id;
+ this.body.emitter.emit("hoverEdge", properties);
+ }
+ }
+
+ return hoverChanged;
+ }
+
+
+ /**
+ * Perform actions in response to a mouse movement.
+ *
+ * @param {Event} event
+ * @param {{x: number, y: number}} pointer | object with the x and y screen coordinates of the mouse
+ */
+ hoverObject(event, pointer) {
+ let object = this.getNodeAt(pointer);
+ if (object === undefined) {
+ object = this.getEdgeAt(pointer);
+ }
+
+ let hoverChanged = false;
+ // remove all node hover highlights
+ for (let nodeId in this.hoverObj.nodes) {
+ if (this.hoverObj.nodes.hasOwnProperty(nodeId)) {
+ if (object === undefined || (object instanceof Node && object.id != nodeId) || object instanceof Edge) {
+ this.emitBlurEvent(event, pointer, this.hoverObj.nodes[nodeId]);
+ delete this.hoverObj.nodes[nodeId];
+ hoverChanged = true;
+ }
+ }
+ }
+
+ // removing all edge hover highlights
+ for (let edgeId in this.hoverObj.edges) {
+ if (this.hoverObj.edges.hasOwnProperty(edgeId)) {
+ // if the hover has been changed here it means that the node has been hovered over or off
+ // we then do not use the emitBlurEvent method here.
+ if (hoverChanged === true) {
+ this.hoverObj.edges[edgeId].hover = false;
+ delete this.hoverObj.edges[edgeId];
+ }
+ // if the blur remains the same and the object is undefined (mouse off) or another
+ // edge has been hovered, or another node has been hovered we blur the edge.
+ else if (object === undefined || (object instanceof Edge && object.id != edgeId) || (object instanceof Node && !object.hover)) {
+ this.emitBlurEvent(event, pointer, this.hoverObj.edges[edgeId]);
+ delete this.hoverObj.edges[edgeId];
+ hoverChanged = true;
+ }
+ }
+ }
+
+ if (object !== undefined) {
+ hoverChanged = hoverChanged || this.emitHoverEvent(event, pointer, object);
+ if (object instanceof Node && this.options.hoverConnectedEdges === true) {
+ this._hoverConnectedEdges(object);
+ }
+ }
+
+ if (hoverChanged === true) {
+ this.body.emitter.emit('_requestRedraw');
+ }
+ }
+
+
+
+
+ /**
+ *
+ * retrieve the currently selected objects
+ * @return {{nodes: Array., edges: Array.}} selection
+ */
+ getSelection() {
+ let nodeIds = this.getSelectedNodes();
+ let edgeIds = this.getSelectedEdges();
+ return {nodes:nodeIds, edges:edgeIds};
+ }
+
+ /**
+ *
+ * retrieve the currently selected nodes
+ * @return {string[]} selection An array with the ids of the
+ * selected nodes.
+ */
+ getSelectedNodes() {
+ let idArray = [];
+ if (this.options.selectable === true) {
+ for (let nodeId in this.selectionObj.nodes) {
+ if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ idArray.push(this.selectionObj.nodes[nodeId].id);
+ }
+ }
+ }
+ return idArray;
+ }
+
+ /**
+ *
+ * retrieve the currently selected edges
+ * @return {Array} selection An array with the ids of the
+ * selected nodes.
+ */
+ getSelectedEdges() {
+ let idArray = [];
+ if (this.options.selectable === true) {
+ for (let edgeId in this.selectionObj.edges) {
+ if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
+ idArray.push(this.selectionObj.edges[edgeId].id);
+ }
+ }
+ }
+ return idArray;
+ }
+
+ /**
+ * Updates the current selection
+ * @param {{nodes: Array., edges: Array.}} selection
+ * @param {Object} options Options
+ */
+ setSelection(selection, options = {}) {
+ let i, id;
+
+ if (!selection || (!selection.nodes && !selection.edges))
+ throw 'Selection must be an object with nodes and/or edges properties';
+ // first unselect any selected node, if option is true or undefined
+ if (options.unselectAll || options.unselectAll === undefined) {
+ this.unselectAll();
+ }
+ if (selection.nodes) {
+ for (i = 0; i < selection.nodes.length; i++) {
+ id = selection.nodes[i];
+
+ let node = this.body.nodes[id];
+ if (!node) {
+ throw new RangeError('Node with id "' + id + '" not found');
+ }
+ // don't select edges with it
+ this.selectObject(node, options.highlightEdges);
+ }
+ }
+
+ if (selection.edges) {
+ for (i = 0; i < selection.edges.length; i++) {
+ id = selection.edges[i];
+
+ let edge = this.body.edges[id];
+ if (!edge) {
+ throw new RangeError('Edge with id "' + id + '" not found');
+ }
+ this.selectObject(edge);
+ }
+ }
+ this.body.emitter.emit('_requestRedraw');
+ }
+
+
+ /**
+ * select zero or more nodes with the option to highlight edges
+ * @param {number[] | string[]} selection An array with the ids of the
+ * selected nodes.
+ * @param {boolean} [highlightEdges]
+ */
+ selectNodes(selection, highlightEdges = true) {
+ if (!selection || (selection.length === undefined))
+ throw 'Selection must be an array with ids';
+
+ this.setSelection({nodes: selection}, {highlightEdges: highlightEdges});
+ }
+
+
+ /**
+ * select zero or more edges
+ * @param {number[] | string[]} selection An array with the ids of the
+ * selected nodes.
+ */
+ selectEdges(selection) {
+ if (!selection || (selection.length === undefined))
+ throw 'Selection must be an array with ids';
+
+ this.setSelection({edges: selection});
+ }
+
+ /**
+ * Validate the selection: remove ids of nodes which no longer exist
+ * @private
+ */
+ updateSelection() {
+ for (let nodeId in this.selectionObj.nodes) {
+ if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
+ if (!this.body.nodes.hasOwnProperty(nodeId)) {
+ delete this.selectionObj.nodes[nodeId];
+ }
+ }
+ }
+ for (let edgeId in this.selectionObj.edges) {
+ if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
+ if (!this.body.edges.hasOwnProperty(edgeId)) {
+ delete this.selectionObj.edges[edgeId];
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Determine all the visual elements clicked which are on the given point.
+ *
+ * All elements are returned; this includes nodes, edges and their labels.
+ * The order returned is from highest to lowest, i.e. element 0 of the return
+ * value is the topmost item clicked on.
+ *
+ * The return value consists of an array of the following possible elements:
+ *
+ * - `{nodeId:number}` - node with given id clicked on
+ * - `{nodeId:number, labelId:0}` - label of node with given id clicked on
+ * - `{edgeId:number}` - edge with given id clicked on
+ * - `{edge:number, labelId:0}` - label of edge with given id clicked on
+ *
+ * ## NOTES
+ *
+ * - Currently, there is only one label associated with a node or an edge,
+ * but this is expected to change somewhere in the future.
+ * - Since there is no z-indexing yet, it is not really possible to set the nodes and
+ * edges in the correct order. For the time being, nodes come first.
+ *
+ * @param {point} pointer mouse position in screen coordinates
+ * @returns {Array.}
+ * @private
+ */
+ getClickedItems(pointer) {
+ let point = this.canvas.DOMtoCanvas(pointer);
+ var items = [];
+
+ // Note reverse order; we want the topmost clicked items to be first in the array
+ // Also note that selected nodes are disregarded here; these normally display on top
+ let nodeIndices = this.body.nodeIndices;
+ let nodes = this.body.nodes;
+ for (let i = nodeIndices.length - 1; i >= 0; i--) {
+ let node = nodes[nodeIndices[i]];
+ let ret = node.getItemsOnPoint(point);
+ items.push.apply(items, ret); // Append the return value to the running list.
+ }
+
+ let edgeIndices = this.body.edgeIndices;
+ let edges = this.body.edges;
+ for (let i = edgeIndices.length - 1; i >= 0; i--) {
+ let edge = edges[edgeIndices[i]];
+ let ret = edge.getItemsOnPoint(point);
+ items.push.apply(items, ret); // Append the return value to the running list.
+ }
+
+ return items;
+ }
+}
+
+export default SelectionHandler;
diff --git a/lib/network/modules/View.js b/lib/network/modules/View.js
new file mode 100644
index 0000000000..15440b49db
--- /dev/null
+++ b/lib/network/modules/View.js
@@ -0,0 +1,303 @@
+import util from 'vis-util';
+
+import NetworkUtil from '../NetworkUtil';
+
+/**
+ * The view
+ */
+class View {
+ /**
+ * @param {Object} body
+ * @param {Canvas} canvas
+ */
+ constructor(body, canvas) {
+ this.body = body;
+ this.canvas = canvas;
+
+ this.animationSpeed = 1/this.renderRefreshRate;
+ this.animationEasingFunction = "easeInOutQuint";
+ this.easingTime = 0;
+ this.sourceScale = 0;
+ this.targetScale = 0;
+ this.sourceTranslation = 0;
+ this.targetTranslation = 0;
+ this.lockedOnNodeId = undefined;
+ this.lockedOnNodeOffset = undefined;
+ this.touchTime = 0;
+
+ this.viewFunction = undefined;
+
+ this.body.emitter.on("fit", this.fit.bind(this));
+ this.body.emitter.on("animationFinished", () => {this.body.emitter.emit("_stopRendering");});
+ this.body.emitter.on("unlockNode", this.releaseNode.bind(this));
+ }
+
+ /**
+ *
+ * @param {Object} [options={}]
+ */
+ setOptions(options = {}) {
+ this.options = options;
+ }
+
+
+ /**
+ * This function zooms out to fit all data on screen based on amount of nodes
+ * @param {Object} [options={{nodes=Array}}]
+ * @param {boolean} [initialZoom=false] | zoom based on fitted formula or range, true = fitted, default = false;
+ */
+ fit(options = {nodes:[]}, initialZoom = false) {
+ let range;
+ let zoomLevel;
+ options = Object.assign({}, options);
+ if (options.nodes === undefined || options.nodes.length === 0) {
+ options.nodes = this.body.nodeIndices;
+ }
+
+
+ if (initialZoom === true) {
+ // check if more than half of the nodes have a predefined position. If so, we use the range, not the approximation.
+ let positionDefined = 0;
+ for (let nodeId in this.body.nodes) {
+ if (this.body.nodes.hasOwnProperty(nodeId)) {
+ let node = this.body.nodes[nodeId];
+ if (node.predefinedPosition === true) {
+ positionDefined += 1;
+ }
+ }
+ }
+ if (positionDefined > 0.5 * this.body.nodeIndices.length) {
+ this.fit(options,false);
+ return;
+ }
+
+ range = NetworkUtil.getRange(this.body.nodes, options.nodes);
+
+ let numberOfNodes = this.body.nodeIndices.length;
+ zoomLevel = 12.662 / (numberOfNodes + 7.4147) + 0.0964822; // this is obtained from fitting a dataset from 5 points with scale levels that looked good.
+
+ // correct for larger canvasses.
+ let factor = Math.min(this.canvas.frame.canvas.clientWidth / 600, this.canvas.frame.canvas.clientHeight / 600);
+ zoomLevel *= factor;
+ }
+ else {
+ this.body.emitter.emit("_resizeNodes");
+ range = NetworkUtil.getRange(this.body.nodes, options.nodes);
+
+ let xDistance = Math.abs(range.maxX - range.minX) * 1.1;
+ let yDistance = Math.abs(range.maxY - range.minY) * 1.1;
+
+ let xZoomLevel = this.canvas.frame.canvas.clientWidth / xDistance;
+ let yZoomLevel = this.canvas.frame.canvas.clientHeight / yDistance;
+
+ zoomLevel = (xZoomLevel <= yZoomLevel) ? xZoomLevel : yZoomLevel;
+ }
+
+ if (zoomLevel > 1.0) {
+ zoomLevel = 1.0;
+ }
+ else if (zoomLevel === 0) {
+ zoomLevel = 1.0;
+ }
+
+ let center = NetworkUtil.findCenter(range);
+ let animationOptions = {position: center, scale: zoomLevel, animation: options.animation};
+ this.moveTo(animationOptions);
+ }
+
+ // animation
+
+ /**
+ * Center a node in view.
+ *
+ * @param {number} nodeId
+ * @param {number} [options]
+ */
+ focus(nodeId, options = {}) {
+ if (this.body.nodes[nodeId] !== undefined) {
+ let nodePosition = {x: this.body.nodes[nodeId].x, y: this.body.nodes[nodeId].y};
+ options.position = nodePosition;
+ options.lockedOnNode = nodeId;
+
+ this.moveTo(options)
+ }
+ else {
+ console.log("Node: " + nodeId + " cannot be found.");
+ }
+ }
+
+ /**
+ *
+ * @param {Object} options | options.offset = {x:number, y:number} // offset from the center in DOM pixels
+ * | options.scale = number // scale to move to
+ * | options.position = {x:number, y:number} // position to move to
+ * | options.animation = {duration:number, easingFunction:String} || Boolean // position to move to
+ */
+ moveTo(options) {
+ if (options === undefined) {
+ options = {};
+ return;
+ }
+ if (options.offset === undefined) {options.offset = {x: 0, y: 0}; }
+ if (options.offset.x === undefined) {options.offset.x = 0; }
+ if (options.offset.y === undefined) {options.offset.y = 0; }
+ if (options.scale === undefined) {options.scale = this.body.view.scale; }
+ if (options.position === undefined) {options.position = this.getViewPosition();}
+ if (options.animation === undefined) {options.animation = {duration:0}; }
+ if (options.animation === false ) {options.animation = {duration:0}; }
+ if (options.animation === true ) {options.animation = {}; }
+ if (options.animation.duration === undefined) {options.animation.duration = 1000; } // default duration
+ if (options.animation.easingFunction === undefined) {options.animation.easingFunction = "easeInOutQuad"; } // default easing function
+
+ this.animateView(options);
+ }
+
+ /**
+ *
+ * @param {Object} options | options.offset = {x:number, y:number} // offset from the center in DOM pixels
+ * | options.time = number // animation time in milliseconds
+ * | options.scale = number // scale to animate to
+ * | options.position = {x:number, y:number} // position to animate to
+ * | options.easingFunction = String // linear, easeInQuad, easeOutQuad, easeInOutQuad,
+ * // easeInCubic, easeOutCubic, easeInOutCubic,
+ * // easeInQuart, easeOutQuart, easeInOutQuart,
+ * // easeInQuint, easeOutQuint, easeInOutQuint
+ */
+ animateView(options) {
+ if (options === undefined) {
+ return;
+ }
+ this.animationEasingFunction = options.animation.easingFunction;
+ // release if something focussed on the node
+ this.releaseNode();
+ if (options.locked === true) {
+ this.lockedOnNodeId = options.lockedOnNode;
+ this.lockedOnNodeOffset = options.offset;
+ }
+
+ // forcefully complete the old animation if it was still running
+ if (this.easingTime != 0) {
+ this._transitionRedraw(true); // by setting easingtime to 1, we finish the animation.
+ }
+
+ this.sourceScale = this.body.view.scale;
+ this.sourceTranslation = this.body.view.translation;
+ this.targetScale = options.scale;
+
+ // set the scale so the viewCenter is based on the correct zoom level. This is overridden in the transitionRedraw
+ // but at least then we'll have the target transition
+ this.body.view.scale = this.targetScale;
+ let viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight});
+
+ let distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node
+ x: viewCenter.x - options.position.x,
+ y: viewCenter.y - options.position.y
+ };
+ this.targetTranslation = {
+ x: this.sourceTranslation.x + distanceFromCenter.x * this.targetScale + options.offset.x,
+ y: this.sourceTranslation.y + distanceFromCenter.y * this.targetScale + options.offset.y
+ };
+
+ // if the time is set to 0, don't do an animation
+ if (options.animation.duration === 0) {
+ if (this.lockedOnNodeId != undefined) {
+ this.viewFunction = this._lockedRedraw.bind(this);
+ this.body.emitter.on("initRedraw", this.viewFunction);
+ }
+ else {
+ this.body.view.scale = this.targetScale;
+ this.body.view.translation = this.targetTranslation;
+ this.body.emitter.emit("_requestRedraw");
+ }
+ }
+ else {
+ this.animationSpeed = 1 / (60 * options.animation.duration * 0.001) || 1 / 60; // 60 for 60 seconds, 0.001 for milli's
+ this.animationEasingFunction = options.animation.easingFunction;
+
+
+ this.viewFunction = this._transitionRedraw.bind(this);
+ this.body.emitter.on("initRedraw", this.viewFunction);
+ this.body.emitter.emit("_startRendering");
+ }
+ }
+
+ /**
+ * used to animate smoothly by hijacking the redraw function.
+ * @private
+ */
+ _lockedRedraw() {
+ let nodePosition = {x: this.body.nodes[this.lockedOnNodeId].x, y: this.body.nodes[this.lockedOnNodeId].y};
+ let viewCenter = this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight});
+ let distanceFromCenter = { // offset from view, distance view has to change by these x and y to center the node
+ x: viewCenter.x - nodePosition.x,
+ y: viewCenter.y - nodePosition.y
+ };
+ let sourceTranslation = this.body.view.translation;
+ let targetTranslation = {
+ x: sourceTranslation.x + distanceFromCenter.x * this.body.view.scale + this.lockedOnNodeOffset.x,
+ y: sourceTranslation.y + distanceFromCenter.y * this.body.view.scale + this.lockedOnNodeOffset.y
+ };
+
+ this.body.view.translation = targetTranslation;
+ }
+
+ /**
+ * Resets state of a locked on Node
+ */
+ releaseNode() {
+ if (this.lockedOnNodeId !== undefined && this.viewFunction !== undefined) {
+ this.body.emitter.off("initRedraw", this.viewFunction);
+ this.lockedOnNodeId = undefined;
+ this.lockedOnNodeOffset = undefined;
+ }
+ }
+
+ /**
+ * @param {boolean} [finished=false]
+ * @private
+ */
+ _transitionRedraw(finished = false) {
+ this.easingTime += this.animationSpeed;
+ this.easingTime = finished === true ? 1.0 : this.easingTime;
+
+ let progress = util.easingFunctions[this.animationEasingFunction](this.easingTime);
+
+ this.body.view.scale = this.sourceScale + (this.targetScale - this.sourceScale) * progress;
+ this.body.view.translation = {
+ x: this.sourceTranslation.x + (this.targetTranslation.x - this.sourceTranslation.x) * progress,
+ y: this.sourceTranslation.y + (this.targetTranslation.y - this.sourceTranslation.y) * progress
+ };
+
+ // cleanup
+ if (this.easingTime >= 1.0) {
+ this.body.emitter.off("initRedraw", this.viewFunction);
+ this.easingTime = 0;
+ if (this.lockedOnNodeId != undefined) {
+ this.viewFunction = this._lockedRedraw.bind(this);
+ this.body.emitter.on("initRedraw", this.viewFunction);
+ }
+ this.body.emitter.emit("animationFinished");
+ }
+ }
+
+
+ /**
+ *
+ * @returns {number}
+ */
+ getScale() {
+ return this.body.view.scale;
+ }
+
+ /**
+ *
+ * @returns {{x: number, y: number}}
+ */
+ getViewPosition() {
+ return this.canvas.DOMtoCanvas({x: 0.5 * this.canvas.frame.canvas.clientWidth, y: 0.5 * this.canvas.frame.canvas.clientHeight});
+ }
+
+
+}
+
+export default View;
diff --git a/lib/network/modules/components/DirectionStrategy.js b/lib/network/modules/components/DirectionStrategy.js
new file mode 100644
index 0000000000..da67b62379
--- /dev/null
+++ b/lib/network/modules/components/DirectionStrategy.js
@@ -0,0 +1,250 @@
+/**
+ * Helper classes for LayoutEngine.
+ *
+ * Strategy pattern for usage of direction methods for hierarchical layouts.
+ */
+import TimSort from 'timsort';
+
+
+/**
+ * Interface definition for direction strategy classes.
+ *
+ * This class describes the interface for the Strategy
+ * pattern classes used to differentiate horizontal and vertical
+ * direction of hierarchical results.
+ *
+ * For a given direction, one coordinate will be 'fixed', meaning that it is
+ * determined by level.
+ * The other coordinate is 'unfixed', meaning that the nodes on a given level
+ * can still move along that coordinate. So:
+ *
+ * - `vertical` layout: `x` unfixed, `y` fixed per level
+ * - `horizontal` layout: `x` fixed per level, `y` unfixed
+ *
+ * The local methods are stubs and should be regarded as abstract.
+ * Derived classes **must** implement all the methods themselves.
+ *
+ * @private
+ */
+class DirectionInterface {
+ /** @ignore **/
+ abstract() {
+ throw new Error("Can't instantiate abstract class!");
+ }
+
+ /**
+ * This is a dummy call which is used to suppress the jsdoc errors of type:
+ *
+ * "'param' is assigned a value but never used"
+ *
+ * @ignore
+ **/
+ fake_use() {
+ // Do nothing special
+ }
+
+ /**
+ * Type to use to translate dynamic curves to, in the case of hierarchical layout.
+ * Dynamic curves do not work for these.
+ *
+ * The value should be perpendicular to the actual direction of the layout.
+ *
+ * @return {string} Direction, either 'vertical' or 'horizontal'
+ */
+ curveType() { return this.abstract(); }
+
+
+ /**
+ * Return the value of the coordinate that is not fixed for this direction.
+ *
+ * @param {Node} node The node to read
+ * @return {number} Value of the unfixed coordinate
+ */
+ getPosition(node) { this.fake_use(node); return this.abstract(); }
+
+
+ /**
+ * Set the value of the coordinate that is not fixed for this direction.
+ *
+ * @param {Node} node The node to adjust
+ * @param {number} position
+ * @param {number} [level] if specified, the hierarchy level that this node should be fixed to
+ */
+ setPosition(node, position, level = undefined) { this.fake_use(node, position, level); this.abstract(); }
+
+
+ /**
+ * Get the width of a tree.
+ *
+ * A `tree` here is a subset of nodes within the network which are not connected to other nodes,
+ * only among themselves. In essence, it is a sub-network.
+ *
+ * @param {number} index The index number of a tree
+ * @return {number} the width of a tree in the view coordinates
+ */
+ getTreeSize(index) { this.fake_use(index); return this.abstract(); }
+
+
+ /**
+ * Sort array of nodes on the unfixed coordinates.
+ *
+ * **Note:** chrome has non-stable sorting implementation, which
+ * has a tendency to change the order of the array items,
+ * even if the custom sort function returns 0.
+ *
+ * For this reason, an external sort implementation is used,
+ * which has the added benefit of being faster than the standard
+ * platforms implementation. This has been verified on `node.js`,
+ * `firefox` and `chrome` (all linux).
+ *
+ * @param {Array.} nodeArray array of nodes to sort
+ */
+ sort(nodeArray) { this.fake_use(nodeArray); this.abstract(); }
+
+
+ /**
+ * Assign the fixed coordinate of the node to the given level
+ *
+ * @param {Node} node The node to adjust
+ * @param {number} level The level to fix to
+ */
+ fix(node, level) { this.fake_use(node, level); this.abstract(); }
+
+
+ /**
+ * Add an offset to the unfixed coordinate of the given node.
+ *
+ * @param {NodeId} nodeId Id of the node to adjust
+ * @param {number} diff Offset to add to the unfixed coordinate
+ */
+ shift(nodeId, diff) { this.fake_use(nodeId, diff); this.abstract(); }
+}
+
+
+/**
+ * Vertical Strategy
+ *
+ * Coordinate `y` is fixed on levels, coordinate `x` is unfixed.
+ *
+ * @extends DirectionInterface
+ * @private
+ */
+class VerticalStrategy extends DirectionInterface {
+ /**
+ * Constructor
+ *
+ * @param {Object} layout reference to the parent LayoutEngine instance.
+ */
+ constructor(layout) {
+ super();
+ this.layout = layout;
+ }
+
+ /** @inheritdoc */
+ curveType() {
+ return 'horizontal';
+ }
+
+ /** @inheritdoc */
+ getPosition(node) {
+ return node.x;
+ }
+
+ /** @inheritdoc */
+ setPosition(node, position, level = undefined) {
+ if (level !== undefined) {
+ this.layout.hierarchical.addToOrdering(node, level);
+ }
+ node.x = position;
+ }
+
+ /** @inheritdoc */
+ getTreeSize(index) {
+ let res = this.layout.hierarchical.getTreeSize(this.layout.body.nodes, index);
+ return {min: res.min_x, max: res.max_x};
+ }
+
+ /** @inheritdoc */
+ sort(nodeArray) {
+ TimSort.sort(nodeArray, function(a, b) {
+ return a.x - b.x;
+ });
+ }
+
+ /** @inheritdoc */
+ fix(node, level) {
+ node.y = this.layout.options.hierarchical.levelSeparation * level;
+ node.options.fixed.y = true;
+ }
+
+ /** @inheritdoc */
+ shift(nodeId, diff) {
+ this.layout.body.nodes[nodeId].x += diff;
+ }
+}
+
+
+/**
+ * Horizontal Strategy
+ *
+ * Coordinate `x` is fixed on levels, coordinate `y` is unfixed.
+ *
+ * @extends DirectionInterface
+ * @private
+ */
+class HorizontalStrategy extends DirectionInterface {
+ /**
+ * Constructor
+ *
+ * @param {Object} layout reference to the parent LayoutEngine instance.
+ */
+ constructor(layout) {
+ super();
+ this.layout = layout;
+ }
+
+ /** @inheritdoc */
+ curveType() {
+ return 'vertical';
+ }
+
+ /** @inheritdoc */
+ getPosition(node) {
+ return node.y;
+ }
+
+ /** @inheritdoc */
+ setPosition(node, position, level = undefined) {
+ if (level !== undefined) {
+ this.layout.hierarchical.addToOrdering(node, level);
+ }
+ node.y = position;
+ }
+
+ /** @inheritdoc */
+ getTreeSize(index) {
+ let res = this.layout.hierarchical.getTreeSize(this.layout.body.nodes, index);
+ return {min: res.min_y, max: res.max_y};
+ }
+
+ /** @inheritdoc */
+ sort(nodeArray) {
+ TimSort.sort(nodeArray, function(a, b) {
+ return a.y - b.y;
+ });
+ }
+
+ /** @inheritdoc */
+ fix(node, level) {
+ node.x = this.layout.options.hierarchical.levelSeparation * level;
+ node.options.fixed.x = true;
+ }
+
+ /** @inheritdoc */
+ shift(nodeId, diff) {
+ this.layout.body.nodes[nodeId].y += diff;
+ }
+}
+
+
+export {HorizontalStrategy, VerticalStrategy};
diff --git a/lib/network/modules/components/Edge.js b/lib/network/modules/components/Edge.js
new file mode 100644
index 0000000000..73617d8967
--- /dev/null
+++ b/lib/network/modules/components/Edge.js
@@ -0,0 +1,786 @@
+import util from 'vis-util';
+import Label from './shared/Label';
+import ComponentUtil from './shared/ComponentUtil';
+import CubicBezierEdge from './edges/CubicBezierEdge';
+import BezierEdgeDynamic from './edges/BezierEdgeDynamic';
+import BezierEdgeStatic from './edges/BezierEdgeStatic';
+import StraightEdge from './edges/StraightEdge';
+
+
+/**
+ * An edge connects two nodes and has a specific direction.
+ */
+class Edge {
+ /**
+ * @param {Object} options values specific to this edge, must contain at least 'from' and 'to'
+ * @param {Object} body shared state from Network instance
+ * @param {Object} globalOptions options from the EdgesHandler instance
+ * @param {Object} defaultOptions default options from the EdgeHandler instance. Value and reference are constant
+ */
+ constructor(options, body, globalOptions, defaultOptions) {
+ if (body === undefined) {
+ throw new Error("No body provided");
+ }
+
+ // Since globalOptions is constant in values as well as reference,
+ // Following needs to be done only once.
+
+ this.options = util.bridgeObject(globalOptions);
+ this.globalOptions = globalOptions;
+ this.defaultOptions = defaultOptions;
+ this.body = body;
+
+ // initialize variables
+ this.id = undefined;
+ this.fromId = undefined;
+ this.toId = undefined;
+ this.selected = false;
+ this.hover = false;
+ this.labelDirty = true;
+
+ this.baseWidth = this.options.width;
+ this.baseFontSize = this.options.font.size;
+
+ this.from = undefined; // a node
+ this.to = undefined; // a node
+
+ this.edgeType = undefined;
+
+ this.connected = false;
+
+ this.labelModule = new Label(this.body, this.options, true /* It's an edge label */);
+ this.setOptions(options);
+ }
+
+
+ /**
+ * Set or overwrite options for the edge
+ * @param {Object} options an object with options
+ * @returns {null|boolean} null if no options, boolean if date changed
+ */
+ setOptions(options) {
+ if (!options) {
+ return;
+ }
+
+ Edge.parseOptions(this.options, options, true, this.globalOptions);
+
+ if (options.id !== undefined) {
+ this.id = options.id;
+ }
+ if (options.from !== undefined) {
+ this.fromId = options.from;
+ }
+ if (options.to !== undefined) {
+ this.toId = options.to;
+ }
+ if (options.title !== undefined) {
+ this.title = options.title;
+ }
+ if (options.value !== undefined) {
+ options.value = parseFloat(options.value);
+ }
+
+ let pile = [options, this.options, this.defaultOptions];
+ this.chooser = ComponentUtil.choosify('edge', pile);
+
+ // update label Module
+ this.updateLabelModule(options);
+
+ let dataChanged = this.updateEdgeType();
+
+ // if anything has been updates, reset the selection width and the hover width
+ this._setInteractionWidths();
+
+ // A node is connected when it has a from and to node that both exist in the network.body.nodes.
+ this.connect();
+
+ if (options.hidden !== undefined || options.physics !== undefined) {
+ dataChanged = true;
+ }
+
+ return dataChanged;
+ }
+
+
+ /**
+ *
+ * @param {Object} parentOptions
+ * @param {Object} newOptions
+ * @param {boolean} [allowDeletion=false]
+ * @param {Object} [globalOptions={}]
+ * @param {boolean} [copyFromGlobals=false]
+ */
+ static parseOptions(parentOptions, newOptions, allowDeletion = false, globalOptions = {}, copyFromGlobals = false) {
+ var fields = [
+ 'arrowStrikethrough',
+ 'id',
+ 'from',
+ 'hidden',
+ 'hoverWidth',
+ 'labelHighlightBold',
+ 'length',
+ 'line',
+ 'opacity',
+ 'physics',
+ 'scaling',
+ 'selectionWidth',
+ 'selfReferenceSize',
+ 'to',
+ 'title',
+ 'value',
+ 'width',
+ 'font',
+ 'chosen',
+ 'widthConstraint'
+ ];
+
+ // only deep extend the items in the field array. These do not have shorthand.
+ util.selectiveDeepExtend(fields, parentOptions, newOptions, allowDeletion);
+
+ // Only copy label if it's a legal value.
+ if (ComponentUtil.isValidLabel(newOptions.label)) {
+ parentOptions.label = newOptions.label;
+ } else {
+ parentOptions.label = undefined;
+ }
+
+ util.mergeOptions(parentOptions, newOptions, 'smooth', globalOptions);
+ util.mergeOptions(parentOptions, newOptions, 'shadow', globalOptions);
+ util.mergeOptions(parentOptions, newOptions, 'background', globalOptions);
+
+ if (newOptions.dashes !== undefined && newOptions.dashes !== null) {
+ parentOptions.dashes = newOptions.dashes;
+ }
+ else if (allowDeletion === true && newOptions.dashes === null) {
+ parentOptions.dashes = Object.create(globalOptions.dashes); // this sets the pointer of the option back to the global option.
+ }
+
+ // set the scaling newOptions
+ if (newOptions.scaling !== undefined && newOptions.scaling !== null) {
+ if (newOptions.scaling.min !== undefined) {parentOptions.scaling.min = newOptions.scaling.min;}
+ if (newOptions.scaling.max !== undefined) {parentOptions.scaling.max = newOptions.scaling.max;}
+ util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', globalOptions.scaling);
+ }
+ else if (allowDeletion === true && newOptions.scaling === null) {
+ parentOptions.scaling = Object.create(globalOptions.scaling); // this sets the pointer of the option back to the global option.
+ }
+
+ // handle multiple input cases for arrows
+ if (newOptions.arrows !== undefined && newOptions.arrows !== null) {
+ if (typeof newOptions.arrows === 'string') {
+ let arrows = newOptions.arrows.toLowerCase();
+ parentOptions.arrows.to.enabled = arrows.indexOf("to") != -1;
+ parentOptions.arrows.middle.enabled = arrows.indexOf("middle") != -1;
+ parentOptions.arrows.from.enabled = arrows.indexOf("from") != -1;
+ }
+ else if (typeof newOptions.arrows === 'object') {
+ util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'to', globalOptions.arrows);
+ util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'middle', globalOptions.arrows);
+ util.mergeOptions(parentOptions.arrows, newOptions.arrows, 'from', globalOptions.arrows);
+ }
+ else {
+ throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:" + JSON.stringify(newOptions.arrows));
+ }
+ }
+ else if (allowDeletion === true && newOptions.arrows === null) {
+ parentOptions.arrows = Object.create(globalOptions.arrows); // this sets the pointer of the option back to the global option.
+ }
+
+ // handle multiple input cases for color
+ if (newOptions.color !== undefined && newOptions.color !== null) {
+ let fromColor = newOptions.color;
+ let toColor = parentOptions.color;
+
+ // If passed, fill in values from default options - required in the case of no prototype bridging
+ if (copyFromGlobals) {
+ util.deepExtend(toColor, globalOptions.color, false, allowDeletion);
+ } else {
+ // Clear local properties - need to do it like this in order to retain prototype bridges
+ for (var i in toColor) {
+ if (toColor.hasOwnProperty(i)) {
+ delete toColor[i];
+ }
+ }
+ }
+
+ if (util.isString(toColor)) {
+ toColor.color = toColor;
+ toColor.highlight = toColor;
+ toColor.hover = toColor;
+ toColor.inherit = false;
+ if (fromColor.opacity === undefined) {
+ toColor.opacity = 1.0; // set default
+ }
+ }
+ else {
+ let colorsDefined = false;
+ if (fromColor.color !== undefined) {toColor.color = fromColor.color; colorsDefined = true;}
+ if (fromColor.highlight !== undefined) {toColor.highlight = fromColor.highlight; colorsDefined = true;}
+ if (fromColor.hover !== undefined) {toColor.hover = fromColor.hover; colorsDefined = true;}
+ if (fromColor.inherit !== undefined) {toColor.inherit = fromColor.inherit;}
+ if (fromColor.opacity !== undefined) {toColor.opacity = Math.min(1,Math.max(0,fromColor.opacity));}
+
+ if (colorsDefined === true) {
+ toColor.inherit = false;
+ } else {
+ if (toColor.inherit === undefined) {
+ toColor.inherit = 'from'; // Set default
+ }
+ }
+ }
+ }
+ else if (allowDeletion === true && newOptions.color === null) {
+ parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options
+ }
+
+ if (allowDeletion === true && newOptions.font === null) {
+ parentOptions.font = util.bridgeObject(globalOptions.font); // set the object back to the global options
+ }
+ }
+
+
+ /**
+ *
+ * @returns {ArrowOptions}
+ */
+ getFormattingValues() {
+ let toArrow = (this.options.arrows.to === true) || (this.options.arrows.to.enabled === true)
+ let fromArrow = (this.options.arrows.from === true) || (this.options.arrows.from.enabled === true)
+ let middleArrow = (this.options.arrows.middle === true) || (this.options.arrows.middle.enabled === true)
+ let inheritsColor = this.options.color.inherit;
+ let values = {
+ toArrow: toArrow,
+ toArrowScale: this.options.arrows.to.scaleFactor,
+ toArrowType: this.options.arrows.to.type,
+ middleArrow: middleArrow,
+ middleArrowScale: this.options.arrows.middle.scaleFactor,
+ middleArrowType: this.options.arrows.middle.type,
+ fromArrow: fromArrow,
+ fromArrowScale: this.options.arrows.from.scaleFactor,
+ fromArrowType: this.options.arrows.from.type,
+ arrowStrikethrough: this.options.arrowStrikethrough,
+ color: (inheritsColor? undefined : this.options.color.color),
+ inheritsColor: inheritsColor,
+ opacity: this.options.color.opacity,
+ hidden: this.options.hidden,
+ length: this.options.length,
+ shadow: this.options.shadow.enabled,
+ shadowColor: this.options.shadow.color,
+ shadowSize: this.options.shadow.size,
+ shadowX: this.options.shadow.x,
+ shadowY: this.options.shadow.y,
+ dashes: this.options.dashes,
+ width: this.options.width,
+ background: this.options.background.enabled,
+ backgroundColor: this.options.background.color,
+ backgroundSize: this.options.background.size,
+ backgroundDashes: this.options.background.dashes
+ };
+ if (this.selected || this.hover) {
+ if (this.chooser === true) {
+ if (this.selected) {
+ let selectedWidth = this.options.selectionWidth;
+ if (typeof selectedWidth === 'function') {
+ values.width = selectedWidth(values.width);
+ } else if (typeof selectedWidth === 'number') {
+ values.width += selectedWidth;
+ }
+ values.width = Math.max(values.width, 0.3 / this.body.view.scale);
+ values.color = this.options.color.highlight;
+ values.shadow = this.options.shadow.enabled;
+ } else if (this.hover) {
+ let hoverWidth = this.options.hoverWidth;
+ if (typeof hoverWidth === 'function') {
+ values.width = hoverWidth(values.width);
+ } else if (typeof hoverWidth === 'number') {
+ values.width += hoverWidth;
+ }
+ values.width = Math.max(values.width, 0.3 / this.body.view.scale);
+ values.color = this.options.color.hover;
+ values.shadow = this.options.shadow.enabled;
+ }
+ } else if (typeof this.chooser === 'function') {
+ this.chooser(values, this.options.id, this.selected, this.hover);
+ if (values.color !== undefined) {
+ values.inheritsColor = false;
+ }
+ if (values.shadow === false) {
+ if ((values.shadowColor !== this.options.shadow.color) ||
+ (values.shadowSize !== this.options.shadow.size) ||
+ (values.shadowX !== this.options.shadow.x) ||
+ (values.shadowY !== this.options.shadow.y)) {
+ values.shadow = true;
+ }
+ }
+ }
+ } else {
+ values.shadow = this.options.shadow.enabled;
+ values.width = Math.max(values.width, 0.3 / this.body.view.scale);
+ }
+ return values;
+ }
+
+ /**
+ * update the options in the label module
+ *
+ * @param {Object} options
+ */
+ updateLabelModule(options) {
+ let pile = [
+ options,
+ this.options,
+ this.globalOptions, // Currently set global edge options
+ this.defaultOptions
+ ];
+
+ this.labelModule.update(this.options, pile);
+
+ if (this.labelModule.baseSize !== undefined) {
+ this.baseFontSize = this.labelModule.baseSize;
+ }
+ }
+
+ /**
+ * update the edge type, set the options
+ * @returns {boolean}
+ */
+ updateEdgeType() {
+ let smooth = this.options.smooth;
+ let dataChanged = false;
+ let changeInType = true;
+ if (this.edgeType !== undefined) {
+ if ((((this.edgeType instanceof BezierEdgeDynamic) &&
+ (smooth.enabled === true) &&
+ (smooth.type === 'dynamic'))) ||
+ (((this.edgeType instanceof CubicBezierEdge) &&
+ (smooth.enabled === true) &&
+ (smooth.type === 'cubicBezier'))) ||
+ (((this.edgeType instanceof BezierEdgeStatic) &&
+ (smooth.enabled === true) &&
+ (smooth.type !== 'dynamic') &&
+ (smooth.type !== 'cubicBezier'))) ||
+ (((this.edgeType instanceof StraightEdge) &&
+ (smooth.type.enabled === false)))) {
+ changeInType = false;
+ }
+ if (changeInType === true) {
+ dataChanged = this.cleanup();
+ }
+ }
+ if (changeInType === true) {
+ if (smooth.enabled === true) {
+ if (smooth.type === 'dynamic') {
+ dataChanged = true;
+ this.edgeType = new BezierEdgeDynamic(this.options, this.body, this.labelModule);
+ } else if (smooth.type === 'cubicBezier') {
+ this.edgeType = new CubicBezierEdge(this.options, this.body, this.labelModule);
+ } else {
+ this.edgeType = new BezierEdgeStatic(this.options, this.body, this.labelModule);
+ }
+ } else {
+ this.edgeType = new StraightEdge(this.options, this.body, this.labelModule);
+ }
+ } else { // if nothing changes, we just set the options.
+ this.edgeType.setOptions(this.options);
+ }
+ return dataChanged;
+ }
+
+ /**
+ * Connect an edge to its nodes
+ */
+ connect() {
+ this.disconnect();
+
+ this.from = this.body.nodes[this.fromId] || undefined;
+ this.to = this.body.nodes[this.toId] || undefined;
+ this.connected = (this.from !== undefined && this.to !== undefined);
+
+ if (this.connected === true) {
+ this.from.attachEdge(this);
+ this.to.attachEdge(this);
+ }
+ else {
+ if (this.from) {
+ this.from.detachEdge(this);
+ }
+ if (this.to) {
+ this.to.detachEdge(this);
+ }
+ }
+
+ this.edgeType.connect();
+ }
+
+
+ /**
+ * Disconnect an edge from its nodes
+ */
+ disconnect() {
+ if (this.from) {
+ this.from.detachEdge(this);
+ this.from = undefined;
+ }
+ if (this.to) {
+ this.to.detachEdge(this);
+ this.to = undefined;
+ }
+
+ this.connected = false;
+ }
+
+
+ /**
+ * get the title of this edge.
+ * @return {string} title The title of the edge, or undefined when no title
+ * has been set.
+ */
+ getTitle() {
+ return this.title;
+ }
+
+
+ /**
+ * check if this node is selecte
+ * @return {boolean} selected True if node is selected, else false
+ */
+ isSelected() {
+ return this.selected;
+ }
+
+
+ /**
+ * Retrieve the value of the edge. Can be undefined
+ * @return {number} value
+ */
+ getValue() {
+ return this.options.value;
+ }
+
+
+ /**
+ * Adjust the value range of the edge. The edge will adjust it's width
+ * based on its value.
+ * @param {number} min
+ * @param {number} max
+ * @param {number} total
+ */
+ setValueRange(min, max, total) {
+ if (this.options.value !== undefined) {
+ var scale = this.options.scaling.customScalingFunction(min, max, total, this.options.value);
+ var widthDiff = this.options.scaling.max - this.options.scaling.min;
+ if (this.options.scaling.label.enabled === true) {
+ var fontDiff = this.options.scaling.label.max - this.options.scaling.label.min;
+ this.options.font.size = this.options.scaling.label.min + scale * fontDiff;
+ }
+ this.options.width = this.options.scaling.min + scale * widthDiff;
+ }
+ else {
+ this.options.width = this.baseWidth;
+ this.options.font.size = this.baseFontSize;
+ }
+
+ this._setInteractionWidths();
+ this.updateLabelModule();
+ }
+
+ /**
+ *
+ * @private
+ */
+ _setInteractionWidths() {
+ if (typeof this.options.hoverWidth === 'function') {
+ this.edgeType.hoverWidth = this.options.hoverWidth(this.options.width);
+ } else {
+ this.edgeType.hoverWidth = this.options.hoverWidth + this.options.width;
+ }
+ if (typeof this.options.selectionWidth === 'function') {
+ this.edgeType.selectionWidth = this.options.selectionWidth(this.options.width);
+ } else {
+ this.edgeType.selectionWidth = this.options.selectionWidth + this.options.width;
+ }
+ }
+
+
+ /**
+ * Redraw a edge
+ * Draw this edge in the given canvas
+ * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d");
+ * @param {CanvasRenderingContext2D} ctx
+ */
+ draw(ctx) {
+ let values = this.getFormattingValues();
+ if (values.hidden) {
+ return;
+ }
+
+ // get the via node from the edge type
+ let viaNode = this.edgeType.getViaNode();
+ let arrowData = {};
+
+ // restore edge targets to defaults
+ this.edgeType.fromPoint = this.edgeType.from;
+ this.edgeType.toPoint = this.edgeType.to;
+
+ // from and to arrows give a different end point for edges. we set them here
+ if (values.fromArrow) {
+ arrowData.from = this.edgeType.getArrowData(ctx, 'from', viaNode, this.selected, this.hover, values);
+ if (values.arrowStrikethrough === false)
+ this.edgeType.fromPoint = arrowData.from.core;
+ }
+ if (values.toArrow) {
+ arrowData.to = this.edgeType.getArrowData(ctx, 'to', viaNode, this.selected, this.hover, values);
+ if (values.arrowStrikethrough === false)
+ this.edgeType.toPoint = arrowData.to.core;
+ }
+
+ // the middle arrow depends on the line, which can depend on the to and from arrows so we do this one lastly.
+ if (values.middleArrow) {
+ arrowData.middle = this.edgeType.getArrowData(ctx,'middle', viaNode, this.selected, this.hover, values);
+ }
+
+ // draw everything
+ this.edgeType.drawLine(ctx, values, this.selected, this.hover, viaNode);
+ this.drawArrows(ctx, arrowData, values);
+ this.drawLabel(ctx, viaNode);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Object} arrowData
+ * @param {ArrowOptions} values
+ */
+ drawArrows(ctx, arrowData, values) {
+ if (values.fromArrow) {
+ this.edgeType.drawArrowHead(ctx, values, this.selected, this.hover, arrowData.from);
+ }
+ if (values.middleArrow) {
+ this.edgeType.drawArrowHead(ctx, values, this.selected, this.hover, arrowData.middle);
+ }
+ if (values.toArrow) {
+ this.edgeType.drawArrowHead(ctx, values, this.selected, this.hover, arrowData.to);
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Node} viaNode
+ */
+ drawLabel(ctx, viaNode) {
+ if (this.options.label !== undefined) {
+ // set style
+ var node1 = this.from;
+ var node2 = this.to;
+
+ if (this.labelModule.differentState(this.selected, this.hover)) {
+ this.labelModule.getTextSize(ctx, this.selected, this.hover);
+ }
+
+ if (node1.id != node2.id) {
+ this.labelModule.pointToSelf = false;
+ var point = this.edgeType.getPoint(0.5, viaNode);
+ ctx.save();
+
+ let rotationPoint = this._getRotation(ctx);
+ if (rotationPoint.angle != 0) {
+ ctx.translate(rotationPoint.x, rotationPoint.y);
+ ctx.rotate(rotationPoint.angle);
+ }
+
+ // draw the label
+ this.labelModule.draw(ctx, point.x, point.y, this.selected, this.hover);
+
+/*
+ // Useful debug code: draw a border around the label
+ // This should **not** be enabled in production!
+ var size = this.labelModule.getSize();; // ;; intentional so lint catches it
+ ctx.strokeStyle = "#ff0000";
+ ctx.strokeRect(size.left, size.top, size.width, size.height);
+ // End debug code
+*/
+
+ ctx.restore();
+ }
+ else {
+ // Ignore the orientations.
+ this.labelModule.pointToSelf = true;
+ var x, y;
+ var radius = this.options.selfReferenceSize;
+ if (node1.shape.width > node1.shape.height) {
+ x = node1.x + node1.shape.width * 0.5;
+ y = node1.y - radius;
+ }
+ else {
+ x = node1.x + radius;
+ y = node1.y - node1.shape.height * 0.5;
+ }
+ point = this._pointOnCircle(x, y, radius, 0.125);
+ this.labelModule.draw(ctx, point.x, point.y, this.selected, this.hover);
+ }
+ }
+ }
+
+
+ /**
+ * Determine all visual elements of this edge instance, in which the given
+ * point falls within the bounding shape.
+ *
+ * @param {point} point
+ * @returns {Array.} list with the items which are on the point
+ */
+ getItemsOnPoint(point) {
+ var ret = [];
+
+ if (this.labelModule.visible()) {
+ let rotationPoint = this._getRotation();
+ if (ComponentUtil.pointInRect(this.labelModule.getSize(), point, rotationPoint)) {
+ ret.push({edgeId:this.id, labelId:0});
+ }
+ }
+
+ let obj = {
+ left: point.x,
+ top: point.y
+ };
+
+ if (this.isOverlappingWith(obj)) {
+ ret.push({edgeId:this.id});
+ }
+
+ return ret;
+ }
+
+
+ /**
+ * Check if this object is overlapping with the provided object
+ * @param {Object} obj an object with parameters left, top
+ * @return {boolean} True if location is located on the edge
+ */
+ isOverlappingWith(obj) {
+ if (this.connected) {
+ var distMax = 10;
+ var xFrom = this.from.x;
+ var yFrom = this.from.y;
+ var xTo = this.to.x;
+ var yTo = this.to.y;
+ var xObj = obj.left;
+ var yObj = obj.top;
+
+ var dist = this.edgeType.getDistanceToEdge(xFrom, yFrom, xTo, yTo, xObj, yObj);
+
+ return (dist < distMax);
+ }
+ else {
+ return false
+ }
+ }
+
+
+ /**
+ * Determine the rotation point, if any.
+ *
+ * @param {CanvasRenderingContext2D} [ctx] if passed, do a recalculation of the label size
+ * @returns {rotationPoint} the point to rotate around and the angle in radians to rotate
+ * @private
+ */
+ _getRotation(ctx) {
+ let viaNode = this.edgeType.getViaNode();
+ let point = this.edgeType.getPoint(0.5, viaNode);
+
+ if (ctx !== undefined) {
+ this.labelModule.calculateLabelSize(ctx, this.selected, this.hover, point.x, point.y);
+ }
+
+ let ret = {
+ x: point.x,
+ y: this.labelModule.size.yLine,
+ angle: 0
+ };
+
+ if (!this.labelModule.visible()) {
+ return ret; // Don't even bother doing the atan2, there's nothing to draw
+ }
+
+ if (this.options.font.align === "horizontal") {
+ return ret; // No need to calculate angle
+ }
+
+ var dy = this.from.y - this.to.y;
+ var dx = this.from.x - this.to.x;
+ var angle = Math.atan2(dy, dx); // radians
+
+ // rotate so that label is readable
+ if ((angle < -1 && dx < 0) || (angle > 0 && dx < 0)) {
+ angle += Math.PI;
+ }
+ ret.angle = angle;
+
+ return ret;
+ }
+
+
+ /**
+ * Get a point on a circle
+ * @param {number} x
+ * @param {number} y
+ * @param {number} radius
+ * @param {number} percentage Value between 0 (line start) and 1 (line end)
+ * @return {Object} point
+ * @private
+ */
+ _pointOnCircle(x, y, radius, percentage) {
+ var angle = percentage * 2 * Math.PI;
+ return {
+ x: x + radius * Math.cos(angle),
+ y: y - radius * Math.sin(angle)
+ }
+ }
+
+ /**
+ * Sets selected state to true
+ */
+ select() {
+ this.selected = true;
+ }
+
+ /**
+ * Sets selected state to false
+ */
+ unselect() {
+ this.selected = false;
+ }
+
+
+ /**
+ * cleans all required things on delete
+ * @returns {*}
+ */
+ cleanup() {
+ return this.edgeType.cleanup();
+ }
+
+
+ /**
+ * Remove edge from the list and perform necessary cleanup.
+ */
+ remove() {
+ this.cleanup();
+ this.disconnect();
+ delete this.body.edges[this.id];
+ }
+
+
+ /**
+ * Check if both connecting nodes exist
+ * @returns {boolean}
+ */
+ endPointsValid() {
+ return this.body.nodes[this.fromId] !== undefined
+ && this.body.nodes[this.toId] !== undefined;
+ }
+}
+
+export default Edge;
diff --git a/lib/network/modules/components/NavigationHandler.js b/lib/network/modules/components/NavigationHandler.js
new file mode 100644
index 0000000000..02559fd2d5
--- /dev/null
+++ b/lib/network/modules/components/NavigationHandler.js
@@ -0,0 +1,278 @@
+import Hammer from '../../../module/hammer';
+import hammerUtil from '../../../hammerUtil';
+import keycharm from 'keycharm';
+
+/**
+ * Navigation Handler
+ */
+class NavigationHandler {
+ /**
+ * @param {Object} body
+ * @param {Canvas} canvas
+ */
+ constructor(body, canvas) {
+ this.body = body;
+ this.canvas = canvas;
+
+ this.iconsCreated = false;
+ this.navigationHammers = [];
+ this.boundFunctions = {};
+ this.touchTime = 0;
+ this.activated = false;
+
+
+ this.body.emitter.on("activate", () => {this.activated = true; this.configureKeyboardBindings();});
+ this.body.emitter.on("deactivate", () => {this.activated = false; this.configureKeyboardBindings();});
+ this.body.emitter.on("destroy", () => {if (this.keycharm !== undefined) {this.keycharm.destroy();}});
+
+ this.options = {}
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ this.options = options;
+ this.create();
+ }
+ }
+
+ /**
+ * Creates or refreshes navigation and sets key bindings
+ */
+ create() {
+ if (this.options.navigationButtons === true) {
+ if (this.iconsCreated === false) {
+ this.loadNavigationElements();
+ }
+ }
+ else if (this.iconsCreated === true) {
+ this.cleanNavigation();
+ }
+
+ this.configureKeyboardBindings();
+ }
+
+ /**
+ * Cleans up previous navigation items
+ */
+ cleanNavigation() {
+ // clean hammer bindings
+ if (this.navigationHammers.length != 0) {
+ for (var i = 0; i < this.navigationHammers.length; i++) {
+ this.navigationHammers[i].destroy();
+ }
+ this.navigationHammers = [];
+ }
+
+ // clean up previous navigation items
+ if (this.navigationDOM && this.navigationDOM['wrapper'] && this.navigationDOM['wrapper'].parentNode) {
+ this.navigationDOM['wrapper'].parentNode.removeChild(this.navigationDOM['wrapper']);
+ }
+
+ this.iconsCreated = false;
+ }
+
+ /**
+ * Creation of the navigation controls nodes. They are drawn over the rest of the nodes and are not affected by scale and translation
+ * they have a triggerFunction which is called on click. If the position of the navigation controls is dependent
+ * on this.frame.canvas.clientWidth or this.frame.canvas.clientHeight, we flag horizontalAlignLeft and verticalAlignTop false.
+ * This means that the location will be corrected by the _relocateNavigation function on a size change of the canvas.
+ *
+ * @private
+ */
+ loadNavigationElements() {
+ this.cleanNavigation();
+
+ this.navigationDOM = {};
+ var navigationDivs = ['up','down','left','right','zoomIn','zoomOut','zoomExtends'];
+ var navigationDivActions = ['_moveUp','_moveDown','_moveLeft','_moveRight','_zoomIn','_zoomOut','_fit'];
+
+ this.navigationDOM['wrapper'] = document.createElement('div');
+ this.navigationDOM['wrapper'].className = 'vis-navigation';
+ this.canvas.frame.appendChild(this.navigationDOM['wrapper']);
+
+ for (var i = 0; i < navigationDivs.length; i++) {
+ this.navigationDOM[navigationDivs[i]] = document.createElement('div');
+ this.navigationDOM[navigationDivs[i]].className = 'vis-button vis-' + navigationDivs[i];
+ this.navigationDOM['wrapper'].appendChild(this.navigationDOM[navigationDivs[i]]);
+
+ var hammer = new Hammer(this.navigationDOM[navigationDivs[i]]);
+ if (navigationDivActions[i] === "_fit") {
+ hammerUtil.onTouch(hammer, this._fit.bind(this));
+ }
+ else {
+ hammerUtil.onTouch(hammer, this.bindToRedraw.bind(this,navigationDivActions[i]));
+ }
+
+ this.navigationHammers.push(hammer);
+ }
+
+ // use a hammer for the release so we do not require the one used in the rest of the network
+ // the one the rest uses can be overloaded by the manipulation system.
+ var hammerFrame = new Hammer(this.canvas.frame);
+ hammerUtil.onRelease(hammerFrame, () => {this._stopMovement();});
+ this.navigationHammers.push(hammerFrame);
+
+ this.iconsCreated = true;
+ }
+
+ /**
+ *
+ * @param {string} action
+ */
+ bindToRedraw(action) {
+ if (this.boundFunctions[action] === undefined) {
+ this.boundFunctions[action] = this[action].bind(this);
+ this.body.emitter.on("initRedraw", this.boundFunctions[action]);
+ this.body.emitter.emit("_startRendering");
+ }
+ }
+
+ /**
+ *
+ * @param {string} action
+ */
+ unbindFromRedraw(action) {
+ if (this.boundFunctions[action] !== undefined) {
+ this.body.emitter.off("initRedraw", this.boundFunctions[action]);
+ this.body.emitter.emit("_stopRendering");
+ delete this.boundFunctions[action];
+ }
+ }
+
+ /**
+ * this stops all movement induced by the navigation buttons
+ *
+ * @private
+ */
+ _fit() {
+ if (new Date().valueOf() - this.touchTime > 700) { // TODO: fix ugly hack to avoid hammer's double fireing of event (because we use release?)
+ this.body.emitter.emit("fit", {duration: 700});
+ this.touchTime = new Date().valueOf();
+ }
+ }
+
+ /**
+ * this stops all movement induced by the navigation buttons
+ *
+ * @private
+ */
+ _stopMovement() {
+ for (let boundAction in this.boundFunctions) {
+ if (this.boundFunctions.hasOwnProperty(boundAction)) {
+ this.body.emitter.off("initRedraw", this.boundFunctions[boundAction]);
+ this.body.emitter.emit("_stopRendering");
+ }
+ }
+ this.boundFunctions = {};
+ }
+ /**
+ *
+ * @private
+ */
+ _moveUp() {this.body.view.translation.y += this.options.keyboard.speed.y;}
+ /**
+ *
+ * @private
+ */
+ _moveDown() {this.body.view.translation.y -= this.options.keyboard.speed.y;}
+ /**
+ *
+ * @private
+ */
+ _moveLeft() {this.body.view.translation.x += this.options.keyboard.speed.x;}
+ /**
+ *
+ * @private
+ */
+ _moveRight(){this.body.view.translation.x -= this.options.keyboard.speed.x;}
+ /**
+ *
+ * @private
+ */
+ _zoomIn() {
+ var scaleOld = this.body.view.scale;
+ var scale = this.body.view.scale * (1 + this.options.keyboard.speed.zoom);
+ var translation = this.body.view.translation;
+ var scaleFrac = scale / scaleOld;
+ var tx = (1 - scaleFrac) * this.canvas.canvasViewCenter.x + translation.x * scaleFrac;
+ var ty = (1 - scaleFrac) * this.canvas.canvasViewCenter.y + translation.y * scaleFrac;
+
+ this.body.view.scale = scale;
+ this.body.view.translation = { x: tx, y: ty };
+ this.body.emitter.emit('zoom', { direction: '+', scale: this.body.view.scale, pointer: null });
+
+ }
+
+ /**
+ *
+ * @private
+ */
+ _zoomOut() {
+ var scaleOld = this.body.view.scale;
+ var scale = this.body.view.scale / (1 + this.options.keyboard.speed.zoom);
+ var translation = this.body.view.translation;
+ var scaleFrac = scale / scaleOld;
+ var tx = (1 - scaleFrac) * this.canvas.canvasViewCenter.x + translation.x * scaleFrac;
+ var ty = (1 - scaleFrac) * this.canvas.canvasViewCenter.y + translation.y * scaleFrac;
+
+ this.body.view.scale = scale;
+ this.body.view.translation = { x: tx, y: ty };
+ this.body.emitter.emit('zoom', { direction: '-', scale: this.body.view.scale, pointer: null });
+ }
+
+
+ /**
+ * bind all keys using keycharm.
+ */
+ configureKeyboardBindings() {
+ if (this.keycharm !== undefined) {
+ this.keycharm.destroy();
+ }
+
+ if (this.options.keyboard.enabled === true) {
+ if (this.options.keyboard.bindToWindow === true) {
+ this.keycharm = keycharm({container: window, preventDefault: true});
+ }
+ else {
+ this.keycharm = keycharm({container: this.canvas.frame, preventDefault: true});
+ }
+
+ this.keycharm.reset();
+
+ if (this.activated === true) {
+ this.keycharm.bind("up", () => {this.bindToRedraw("_moveUp") ;}, "keydown");
+ this.keycharm.bind("down", () => {this.bindToRedraw("_moveDown") ;}, "keydown");
+ this.keycharm.bind("left", () => {this.bindToRedraw("_moveLeft") ;}, "keydown");
+ this.keycharm.bind("right", () => {this.bindToRedraw("_moveRight");}, "keydown");
+ this.keycharm.bind("=", () => {this.bindToRedraw("_zoomIn") ;}, "keydown");
+ this.keycharm.bind("num+", () => {this.bindToRedraw("_zoomIn") ;}, "keydown");
+ this.keycharm.bind("num-", () => {this.bindToRedraw("_zoomOut") ;}, "keydown");
+ this.keycharm.bind("-", () => {this.bindToRedraw("_zoomOut") ;}, "keydown");
+ this.keycharm.bind("[", () => {this.bindToRedraw("_zoomOut") ;}, "keydown");
+ this.keycharm.bind("]", () => {this.bindToRedraw("_zoomIn") ;}, "keydown");
+ this.keycharm.bind("pageup", () => {this.bindToRedraw("_zoomIn") ;}, "keydown");
+ this.keycharm.bind("pagedown", () => {this.bindToRedraw("_zoomOut") ;}, "keydown");
+
+ this.keycharm.bind("up", () => {this.unbindFromRedraw("_moveUp") ;}, "keyup");
+ this.keycharm.bind("down", () => {this.unbindFromRedraw("_moveDown") ;}, "keyup");
+ this.keycharm.bind("left", () => {this.unbindFromRedraw("_moveLeft") ;}, "keyup");
+ this.keycharm.bind("right", () => {this.unbindFromRedraw("_moveRight");}, "keyup");
+ this.keycharm.bind("=", () => {this.unbindFromRedraw("_zoomIn") ;}, "keyup");
+ this.keycharm.bind("num+", () => {this.unbindFromRedraw("_zoomIn") ;}, "keyup");
+ this.keycharm.bind("num-", () => {this.unbindFromRedraw("_zoomOut") ;}, "keyup");
+ this.keycharm.bind("-", () => {this.unbindFromRedraw("_zoomOut") ;}, "keyup");
+ this.keycharm.bind("[", () => {this.unbindFromRedraw("_zoomOut") ;}, "keyup");
+ this.keycharm.bind("]", () => {this.unbindFromRedraw("_zoomIn") ;}, "keyup");
+ this.keycharm.bind("pageup", () => {this.unbindFromRedraw("_zoomIn") ;}, "keyup");
+ this.keycharm.bind("pagedown", () => {this.unbindFromRedraw("_zoomOut") ;}, "keyup");
+ }
+ }
+ }
+}
+
+
+export default NavigationHandler;
diff --git a/lib/network/modules/components/Node.js b/lib/network/modules/components/Node.js
new file mode 100644
index 0000000000..5dd33d7720
--- /dev/null
+++ b/lib/network/modules/components/Node.js
@@ -0,0 +1,659 @@
+import util from 'vis-util';
+
+import Label from './shared/Label';
+import ComponentUtil from './shared/ComponentUtil';
+import Box from './nodes/shapes/Box';
+import Circle from './nodes/shapes/Circle';
+import CircularImage from './nodes/shapes/CircularImage';
+import Database from './nodes/shapes/Database';
+import Diamond from './nodes/shapes/Diamond';
+import Dot from './nodes/shapes/Dot';
+import Ellipse from './nodes/shapes/Ellipse';
+import Icon from './nodes/shapes/Icon';
+import Image from './nodes/shapes/Image';
+import Square from './nodes/shapes/Square';
+import Hexagon from './nodes/shapes/Hexagon';
+import Star from './nodes/shapes/Star';
+import Text from './nodes/shapes/Text';
+import Triangle from './nodes/shapes/Triangle';
+import TriangleDown from './nodes/shapes/TriangleDown';
+import { printStyle } from "../../../shared/Validator";
+
+
+/**
+ * A node. A node can be connected to other nodes via one or multiple edges.
+ */
+class Node {
+ /**
+ *
+ * @param {object} options An object containing options for the node. All
+ * options are optional, except for the id.
+ * {number} id Id of the node. Required
+ * {string} label Text label for the node
+ * {number} x Horizontal position of the node
+ * {number} y Vertical position of the node
+ * {string} shape Node shape
+ * {string} image An image url
+ * {string} title A title text, can be HTML
+ * {anytype} group A group name or number
+ *
+ * @param {Object} body Shared state of current network instance
+ * @param {Network.Images} imagelist A list with images. Only needed when the node has an image
+ * @param {Groups} grouplist A list with groups. Needed for retrieving group options
+ * @param {Object} globalOptions Current global node options; these serve as defaults for the node instance
+ * @param {Object} defaultOptions Global default options for nodes; note that this is also the prototype
+ * for parameter `globalOptions`.
+ */
+ constructor(options, body, imagelist, grouplist, globalOptions, defaultOptions) {
+ this.options = util.bridgeObject(globalOptions);
+ this.globalOptions = globalOptions;
+ this.defaultOptions = defaultOptions;
+ this.body = body;
+
+ this.edges = []; // all edges connected to this node
+
+ // set defaults for the options
+ this.id = undefined;
+ this.imagelist = imagelist;
+ this.grouplist = grouplist;
+
+ // state options
+ this.x = undefined;
+ this.y = undefined;
+ this.baseSize = this.options.size;
+ this.baseFontSize = this.options.font.size;
+ this.predefinedPosition = false; // used to check if initial fit should just take the range or approximate
+ this.selected = false;
+ this.hover = false;
+
+ this.labelModule = new Label(this.body, this.options, false /* Not edge label */);
+ this.setOptions(options);
+ }
+
+
+ /**
+ * Attach a edge to the node
+ * @param {Edge} edge
+ */
+ attachEdge(edge) {
+ if (this.edges.indexOf(edge) === -1) {
+ this.edges.push(edge);
+ }
+ }
+
+
+ /**
+ * Detach a edge from the node
+ *
+ * @param {Edge} edge
+ */
+ detachEdge(edge) {
+ var index = this.edges.indexOf(edge);
+ if (index != -1) {
+ this.edges.splice(index, 1);
+ }
+ }
+
+
+ /**
+ * Set or overwrite options for the node
+ *
+ * @param {Object} options an object with options
+ * @returns {null|boolean}
+ */
+ setOptions(options) {
+ let currentShape = this.options.shape;
+ if (!options) {
+ return; // Note that the return value will be 'undefined'! This is OK.
+ }
+
+ // basic options
+ if (options.id !== undefined) {this.id = options.id;}
+
+ if (this.id === undefined) {
+ throw new Error("Node must have an id");
+ }
+
+ Node.checkMass(options, this.id);
+
+ // set these options locally
+ // clear x and y positions
+ if (options.x !== undefined) {
+ if (options.x === null) {this.x = undefined; this.predefinedPosition = false;}
+ else {this.x = parseInt(options.x); this.predefinedPosition = true;}
+ }
+ if (options.y !== undefined) {
+ if (options.y === null) {this.y = undefined; this.predefinedPosition = false;}
+ else {this.y = parseInt(options.y); this.predefinedPosition = true;}
+ }
+ if (options.size !== undefined) {this.baseSize = options.size;}
+ if (options.value !== undefined) {options.value = parseFloat(options.value);}
+
+ // this transforms all shorthands into fully defined options
+ Node.parseOptions(this.options, options, true, this.globalOptions, this.grouplist);
+
+ let pile = [options, this.options, this.defaultOptions];
+ this.chooser = ComponentUtil.choosify('node', pile);
+
+ this._load_images();
+ this.updateLabelModule(options);
+ this.updateShape(currentShape);
+
+ return (options.hidden !== undefined || options.physics !== undefined);
+ }
+
+
+ /**
+ * Load the images from the options, for the nodes that need them.
+ *
+ * Images are always loaded, even if they are not used in the current shape.
+ * The user may switch to an image shape later on.
+ *
+ * @private
+ */
+ _load_images() {
+ if (this.options.shape === 'circularImage' || this.options.shape === 'image') {
+ if (this.options.image === undefined) {
+ throw new Error("Option image must be defined for node type '" + this.options.shape + "'");
+ }
+ }
+
+ if (this.options.image === undefined) {
+ return;
+ }
+
+ if (this.imagelist === undefined) {
+ throw new Error("Internal Error: No images provided");
+ }
+
+ if (typeof this.options.image === 'string') {
+ this.imageObj = this.imagelist.load(this.options.image, this.options.brokenImage, this.id);
+ } else {
+ if (this.options.image.unselected === undefined) {
+ throw new Error("No unselected image provided");
+ }
+
+ this.imageObj = this.imagelist.load(this.options.image.unselected, this.options.brokenImage, this.id);
+
+ if (this.options.image.selected !== undefined) {
+ this.imageObjAlt = this.imagelist.load(this.options.image.selected, this.options.brokenImage, this.id);
+ } else {
+ this.imageObjAlt = undefined;
+ }
+ }
+ }
+
+
+ /**
+ * Copy group option values into the node options.
+ *
+ * The group options override the global node options, so the copy of group options
+ * must happen *after* the global node options have been set.
+ *
+ * This method must also be called also if the global node options have changed and the group options did not.
+ *
+ * @param {Object} parentOptions
+ * @param {Object} newOptions new values for the options, currently only passed in for check
+ * @param {Object} groupList
+ */
+ static updateGroupOptions(parentOptions, newOptions, groupList) {
+ if (groupList === undefined) return; // No groups, nothing to do
+
+ var group = parentOptions.group;
+
+ // paranoia: the selected group is already merged into node options, check.
+ if (newOptions !== undefined && newOptions.group !== undefined && group !== newOptions.group) {
+ throw new Error("updateGroupOptions: group values in options don't match.");
+ }
+
+ var hasGroup = (typeof group === 'number' || (typeof group === 'string' && group != ''));
+ if (!hasGroup) return; // current node has no group, no need to merge
+
+ var groupObj = groupList.get(group);
+
+ // Skip merging of group font options into parent; these are required to be distinct for labels
+ // Also skip mergin of color IF it is already defined in the node itself. This is to avoid the color of the
+ // group overriding the color set at the node level
+ // TODO: It might not be a good idea either to merge the rest of the options, investigate this.
+ var skipProperties = ['font'];
+ if (newOptions !== undefined && newOptions.color !== undefined && newOptions.color != null) skipProperties.push('color');
+ util.selectiveNotDeepExtend(skipProperties, parentOptions, groupObj);
+
+ // the color object needs to be completely defined.
+ // Since groups can partially overwrite the colors, we parse it again, just in case.
+ parentOptions.color = util.parseColor(parentOptions.color);
+ }
+
+
+ /**
+ * This process all possible shorthands in the new options and makes sure that the parentOptions are fully defined.
+ * Static so it can also be used by the handler.
+ *
+ * @param {Object} parentOptions
+ * @param {Object} newOptions
+ * @param {boolean} [allowDeletion=false]
+ * @param {Object} [globalOptions={}]
+ * @param {Object} [groupList]
+ * @static
+ */
+ static parseOptions(parentOptions, newOptions, allowDeletion = false, globalOptions = {}, groupList) {
+
+ var fields = [
+ 'color',
+ 'fixed',
+ 'shadow'
+ ];
+ util.selectiveNotDeepExtend(fields, parentOptions, newOptions, allowDeletion);
+
+ Node.checkMass(newOptions);
+
+ // merge the shadow options into the parent.
+ util.mergeOptions(parentOptions, newOptions, 'shadow', globalOptions);
+
+ // individual shape newOptions
+ if (newOptions.color !== undefined && newOptions.color !== null) {
+ let parsedColor = util.parseColor(newOptions.color);
+ util.fillIfDefined(parentOptions.color, parsedColor);
+ }
+ else if (allowDeletion === true && newOptions.color === null) {
+ parentOptions.color = util.bridgeObject(globalOptions.color); // set the object back to the global options
+ }
+
+ // handle the fixed options
+ if (newOptions.fixed !== undefined && newOptions.fixed !== null) {
+ if (typeof newOptions.fixed === 'boolean') {
+ parentOptions.fixed.x = newOptions.fixed;
+ parentOptions.fixed.y = newOptions.fixed;
+ }
+ else {
+ if (newOptions.fixed.x !== undefined && typeof newOptions.fixed.x === 'boolean') {
+ parentOptions.fixed.x = newOptions.fixed.x;
+ }
+ if (newOptions.fixed.y !== undefined && typeof newOptions.fixed.y === 'boolean') {
+ parentOptions.fixed.y = newOptions.fixed.y;
+ }
+ }
+ }
+
+ if (allowDeletion === true && newOptions.font === null) {
+ parentOptions.font = util.bridgeObject(globalOptions.font); // set the object back to the global options
+ }
+
+ Node.updateGroupOptions(parentOptions, newOptions, groupList);
+
+ // handle the scaling options, specifically the label part
+ if (newOptions.scaling !== undefined) {
+ util.mergeOptions(parentOptions.scaling, newOptions.scaling, 'label', globalOptions.scaling);
+ }
+ }
+
+
+ /**
+ *
+ * @returns {{color: *, borderWidth: *, borderColor: *, size: *, borderDashes: (boolean|Array|allOptions.nodes.shapeProperties.borderDashes|{boolean, array}), borderRadius: (number|allOptions.nodes.shapeProperties.borderRadius|{number}|Array), shadow: *, shadowColor: *, shadowSize: *, shadowX: *, shadowY: *}}
+ */
+ getFormattingValues() {
+ let values = {
+ color: this.options.color.background,
+ borderWidth: this.options.borderWidth,
+ borderColor: this.options.color.border,
+ size: this.options.size,
+ borderDashes: this.options.shapeProperties.borderDashes,
+ borderRadius: this.options.shapeProperties.borderRadius,
+ shadow: this.options.shadow.enabled,
+ shadowColor: this.options.shadow.color,
+ shadowSize: this.options.shadow.size,
+ shadowX: this.options.shadow.x,
+ shadowY: this.options.shadow.y
+ };
+ if (this.selected || this.hover) {
+ if (this.chooser === true) {
+ if (this.selected) {
+ values.borderWidth *= 2;
+ values.color = this.options.color.highlight.background;
+ values.borderColor = this.options.color.highlight.border;
+ values.shadow = this.options.shadow.enabled;
+ } else if (this.hover) {
+ values.color = this.options.color.hover.background;
+ values.borderColor = this.options.color.hover.border;
+ values.shadow = this.options.shadow.enabled;
+ }
+ } else if (typeof this.chooser === 'function') {
+ this.chooser(values, this.options.id, this.selected, this.hover);
+ if (values.shadow === false) {
+ if ((values.shadowColor !== this.options.shadow.color) ||
+ (values.shadowSize !== this.options.shadow.size) ||
+ (values.shadowX !== this.options.shadow.x) ||
+ (values.shadowY !== this.options.shadow.y)) {
+ values.shadow = true;
+ }
+ }
+ }
+ } else {
+ values.shadow = this.options.shadow.enabled;
+ }
+ return values;
+ }
+
+
+ /**
+ *
+ * @param {Object} options
+ */
+ updateLabelModule(options) {
+ if (this.options.label === undefined || this.options.label === null) {
+ this.options.label = '';
+ }
+
+ Node.updateGroupOptions(this.options, options, this.grouplist);
+
+ //
+ // Note:The prototype chain for this.options is:
+ //
+ // this.options -> NodesHandler.options -> NodesHandler.defaultOptions
+ // (also: this.globalOptions)
+ //
+ // Note that the prototypes are mentioned explicitly in the pile list below;
+ // WE DON'T WANT THE ORDER OF THE PROTOTYPES!!!! At least, not for font handling of labels.
+ // This is a good indication that the prototype usage of options is deficient.
+ //
+ var currentGroup = this.grouplist.get(this.options.group, false);
+ let pile = [
+ options, // new options
+ this.options, // current node options, see comment above for prototype
+ currentGroup, // group options, if any
+ this.globalOptions, // Currently set global node options
+ this.defaultOptions // Default global node options
+ ];
+ this.labelModule.update(this.options, pile);
+
+ if (this.labelModule.baseSize !== undefined) {
+ this.baseFontSize = this.labelModule.baseSize;
+ }
+ }
+
+
+ /**
+ *
+ * @param {string} currentShape
+ */
+ updateShape(currentShape) {
+ if (currentShape === this.options.shape && this.shape) {
+ this.shape.setOptions(this.options, this.imageObj, this.imageObjAlt);
+ }
+ else {
+ // choose draw method depending on the shape
+ switch (this.options.shape) {
+ case 'box':
+ this.shape = new Box(this.options, this.body, this.labelModule);
+ break;
+ case 'circle':
+ this.shape = new Circle(this.options, this.body, this.labelModule);
+ break;
+ case 'circularImage':
+ this.shape = new CircularImage(this.options, this.body, this.labelModule, this.imageObj, this.imageObjAlt);
+ break;
+ case 'database':
+ this.shape = new Database(this.options, this.body, this.labelModule);
+ break;
+ case 'diamond':
+ this.shape = new Diamond(this.options, this.body, this.labelModule);
+ break;
+ case 'dot':
+ this.shape = new Dot(this.options, this.body, this.labelModule);
+ break;
+ case 'ellipse':
+ this.shape = new Ellipse(this.options, this.body, this.labelModule);
+ break;
+ case 'icon':
+ this.shape = new Icon(this.options, this.body, this.labelModule);
+ break;
+ case 'image':
+ this.shape = new Image(this.options, this.body, this.labelModule, this.imageObj, this.imageObjAlt);
+ break;
+ case 'square':
+ this.shape = new Square(this.options, this.body, this.labelModule);
+ break;
+ case 'hexagon':
+ this.shape = new Hexagon(this.options, this.body, this.labelModule);
+ break;
+ case 'star':
+ this.shape = new Star(this.options, this.body, this.labelModule);
+ break;
+ case 'text':
+ this.shape = new Text(this.options, this.body, this.labelModule);
+ break;
+ case 'triangle':
+ this.shape = new Triangle(this.options, this.body, this.labelModule);
+ break;
+ case 'triangleDown':
+ this.shape = new TriangleDown(this.options, this.body, this.labelModule);
+ break;
+ default:
+ this.shape = new Ellipse(this.options, this.body, this.labelModule);
+ break;
+ }
+ }
+ this.needsRefresh();
+ }
+
+
+ /**
+ * select this node
+ */
+ select() {
+ this.selected = true;
+ this.needsRefresh();
+ }
+
+
+ /**
+ * unselect this node
+ */
+ unselect() {
+ this.selected = false;
+ this.needsRefresh();
+ }
+
+
+
+ /**
+ * Reset the calculated size of the node, forces it to recalculate its size
+ */
+ needsRefresh() {
+ this.shape.refreshNeeded = true;
+ }
+
+
+ /**
+ * get the title of this node.
+ * @return {string} title The title of the node, or undefined when no title
+ * has been set.
+ */
+ getTitle() {
+ return this.options.title;
+ }
+
+
+ /**
+ * Calculate the distance to the border of the Node
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle Angle in radians
+ * @returns {number} distance Distance to the border in pixels
+ */
+ distanceToBorder(ctx, angle) {
+ return this.shape.distanceToBorder(ctx,angle);
+ }
+
+
+ /**
+ * Check if this node has a fixed x and y position
+ * @return {boolean} true if fixed, false if not
+ */
+ isFixed() {
+ return (this.options.fixed.x && this.options.fixed.y);
+ }
+
+
+ /**
+ * check if this node is selecte
+ * @return {boolean} selected True if node is selected, else false
+ */
+ isSelected() {
+ return this.selected;
+ }
+
+
+ /**
+ * Retrieve the value of the node. Can be undefined
+ * @return {number} value
+ */
+ getValue() {
+ return this.options.value;
+ }
+
+
+ /**
+ * Get the current dimensions of the label
+ *
+ * @return {rect}
+ */
+ getLabelSize() {
+ return this.labelModule.size();
+ }
+
+
+ /**
+ * Adjust the value range of the node. The node will adjust it's size
+ * based on its value.
+ * @param {number} min
+ * @param {number} max
+ * @param {number} total
+ */
+ setValueRange(min, max, total) {
+ if (this.options.value !== undefined) {
+ var scale = this.options.scaling.customScalingFunction(min, max, total, this.options.value);
+ var sizeDiff = this.options.scaling.max - this.options.scaling.min;
+ if (this.options.scaling.label.enabled === true) {
+ var fontDiff = this.options.scaling.label.max - this.options.scaling.label.min;
+ this.options.font.size = this.options.scaling.label.min + scale * fontDiff;
+ }
+ this.options.size = this.options.scaling.min + scale * sizeDiff;
+ }
+ else {
+ this.options.size = this.baseSize;
+ this.options.font.size = this.baseFontSize;
+ }
+
+ this.updateLabelModule();
+ }
+
+
+ /**
+ * Draw this node in the given canvas
+ * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d");
+ * @param {CanvasRenderingContext2D} ctx
+ */
+ draw(ctx) {
+ let values = this.getFormattingValues();
+ this.shape.draw(ctx, this.x, this.y, this.selected, this.hover, values);
+ }
+
+
+ /**
+ * Update the bounding box of the shape
+ * @param {CanvasRenderingContext2D} ctx
+ */
+ updateBoundingBox(ctx) {
+ this.shape.updateBoundingBox(this.x,this.y,ctx);
+ }
+
+
+ /**
+ * Recalculate the size of this node in the given canvas
+ * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d");
+ * @param {CanvasRenderingContext2D} ctx
+ */
+ resize(ctx) {
+ let values = this.getFormattingValues();
+ this.shape.resize(ctx, this.selected, this.hover, values);
+ }
+
+
+ /**
+ * Determine all visual elements of this node instance, in which the given
+ * point falls within the bounding shape.
+ *
+ * @param {point} point
+ * @returns {Array.} list with the items which are on the point
+ */
+ getItemsOnPoint(point) {
+ var ret = [];
+
+ if (this.labelModule.visible()) {
+ if (ComponentUtil.pointInRect(this.labelModule.getSize(), point)) {
+ ret.push({nodeId:this.id, labelId:0});
+ }
+ }
+
+ if (ComponentUtil.pointInRect(this.shape.boundingBox, point)) {
+ ret.push({nodeId:this.id});
+ }
+
+ return ret;
+ }
+
+
+ /**
+ * Check if this object is overlapping with the provided object
+ * @param {Object} obj an object with parameters left, top, right, bottom
+ * @return {boolean} True if location is located on node
+ */
+ isOverlappingWith(obj) {
+ return (
+ this.shape.left < obj.right &&
+ this.shape.left + this.shape.width > obj.left &&
+ this.shape.top < obj.bottom &&
+ this.shape.top + this.shape.height > obj.top
+ );
+ }
+
+
+ /**
+ * Check if this object is overlapping with the provided object
+ * @param {Object} obj an object with parameters left, top, right, bottom
+ * @return {boolean} True if location is located on node
+ */
+ isBoundingBoxOverlappingWith(obj) {
+ return (
+ this.shape.boundingBox.left < obj.right &&
+ this.shape.boundingBox.right > obj.left &&
+ this.shape.boundingBox.top < obj.bottom &&
+ this.shape.boundingBox.bottom > obj.top
+ );
+ }
+
+
+ /**
+ * Check valid values for mass
+ *
+ * The mass may not be negative or zero. If it is, reset to 1
+ *
+ * @param {object} options
+ * @param {Node.id} id
+ * @static
+ */
+ static checkMass(options, id) {
+ if (options.mass !== undefined && options.mass <= 0) {
+ let strId = '';
+ if (id !== undefined) {
+ strId = ' in node id: ' + id;
+ }
+ console.log('%cNegative or zero mass disallowed' + strId +
+ ', setting mass to 1.' , printStyle);
+ options.mass = 1;
+ }
+ }
+}
+
+export default Node;
diff --git a/lib/network/modules/components/algorithms/FloydWarshall.js b/lib/network/modules/components/algorithms/FloydWarshall.js
new file mode 100644
index 0000000000..5b481c18ba
--- /dev/null
+++ b/lib/network/modules/components/algorithms/FloydWarshall.js
@@ -0,0 +1,68 @@
+/**
+ * The Floyd–Warshall algorithm is an algorithm for finding shortest paths in
+ * a weighted graph with positive or negative edge weights (but with no negative
+ * cycles). - https://en.wikipedia.org/wiki/Floyd–Warshall_algorithm
+ */
+class FloydWarshall {
+ /**
+ * @ignore
+ */
+ constructor() {
+ }
+
+ /**
+ *
+ * @param {Object} body
+ * @param {Array.} nodesArray
+ * @param {Array.} edgesArray
+ * @returns {{}}
+ */
+ getDistances(body, nodesArray, edgesArray) {
+ let D_matrix = {};
+ let edges = body.edges;
+
+ // prepare matrix with large numbers
+ for (let i = 0; i < nodesArray.length; i++) {
+ let node = nodesArray[i];
+ let cell = {};
+ D_matrix[node] = cell;
+ for (let j = 0; j < nodesArray.length; j++) {
+ cell[nodesArray[j]] = (i == j ? 0 : 1e9);
+ }
+ }
+
+ // put the weights for the edges in. This assumes unidirectionality.
+ for (let i = 0; i < edgesArray.length; i++) {
+ let edge = edges[edgesArray[i]];
+ // edge has to be connected if it counts to the distances. If it is connected to inner clusters it will crash so we also check if it is in the D_matrix
+ if (edge.connected === true && D_matrix[edge.fromId] !== undefined && D_matrix[edge.toId] !== undefined) {
+ D_matrix[edge.fromId][edge.toId] = 1;
+ D_matrix[edge.toId][edge.fromId] = 1;
+ }
+ }
+
+ let nodeCount = nodesArray.length;
+
+ // Adapted FloydWarshall based on unidirectionality to greatly reduce complexity.
+ for (let k = 0; k < nodeCount; k++) {
+ let knode = nodesArray[k];
+ let kcolm = D_matrix[knode];
+ for (let i = 0; i < nodeCount - 1; i++) {
+ let inode = nodesArray[i];
+ let icolm = D_matrix[inode];
+ for (let j = i + 1; j < nodeCount; j++) {
+ let jnode = nodesArray[j];
+ let jcolm = D_matrix[jnode];
+
+ let val = Math.min(icolm[jnode], icolm[knode] + kcolm[jnode]);
+ icolm[jnode] = val;
+ jcolm[inode] = val;
+ }
+ }
+ }
+
+ return D_matrix;
+ }
+}
+
+export default FloydWarshall;
\ No newline at end of file
diff --git a/lib/network/modules/components/edges/BezierEdgeDynamic.js b/lib/network/modules/components/edges/BezierEdgeDynamic.js
new file mode 100644
index 0000000000..4a3300944c
--- /dev/null
+++ b/lib/network/modules/components/edges/BezierEdgeDynamic.js
@@ -0,0 +1,194 @@
+import BezierEdgeBase from './util/BezierEdgeBase'
+
+/**
+ * A Dynamic Bezier Edge. Bezier curves are used to model smooth gradual
+ * curves in paths between nodes. The Dynamic piece refers to how the curve
+ * reacts to physics changes.
+ *
+ * @extends BezierEdgeBase
+ */
+class BezierEdgeDynamic extends BezierEdgeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ //this.via = undefined; // Here for completeness but not allowed to defined before super() is invoked.
+ super(options, body, labelModule); // --> this calls the setOptions below
+ this._boundFunction = () => {this.positionBezierNode();};
+ this.body.emitter.on("_repositionBezierNodes", this._boundFunction);
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ // check if the physics has changed.
+ let physicsChange = false;
+ if (this.options.physics !== options.physics) {
+ physicsChange = true;
+ }
+
+ // set the options and the to and from nodes
+ this.options = options;
+ this.id = this.options.id;
+ this.from = this.body.nodes[this.options.from];
+ this.to = this.body.nodes[this.options.to];
+
+ // setup the support node and connect
+ this.setupSupportNode();
+ this.connect();
+
+ // when we change the physics state of the edge, we reposition the support node.
+ if (physicsChange === true) {
+ this.via.setOptions({physics: this.options.physics});
+ this.positionBezierNode();
+ }
+ }
+
+ /**
+ * Connects an edge to node(s)
+ */
+ connect() {
+ this.from = this.body.nodes[this.options.from];
+ this.to = this.body.nodes[this.options.to];
+ if (this.from === undefined || this.to === undefined || this.options.physics === false) {
+ this.via.setOptions({physics:false})
+ }
+ else {
+ // fix weird behaviour where a self referencing node has physics enabled
+ if (this.from.id === this.to.id) {
+ this.via.setOptions({physics: false})
+ }
+ else {
+ this.via.setOptions({physics: true})
+ }
+ }
+ }
+
+ /**
+ * remove the support nodes
+ * @returns {boolean}
+ */
+ cleanup() {
+ this.body.emitter.off("_repositionBezierNodes", this._boundFunction);
+ if (this.via !== undefined) {
+ delete this.body.nodes[this.via.id];
+ this.via = undefined;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Bezier curves require an anchor point to calculate the smooth flow. These points are nodes. These nodes are invisible but
+ * are used for the force calculation.
+ *
+ * The changed data is not called, if needed, it is returned by the main edge constructor.
+ * @private
+ */
+ setupSupportNode() {
+ if (this.via === undefined) {
+ var nodeId = "edgeId:" + this.id;
+ var node = this.body.functions.createNode({
+ id: nodeId,
+ shape: 'circle',
+ physics:true,
+ hidden:true
+ });
+ this.body.nodes[nodeId] = node;
+ this.via = node;
+ this.via.parentEdgeId = this.id;
+ this.positionBezierNode();
+ }
+ }
+
+ /**
+ * Positions bezier node
+ */
+ positionBezierNode() {
+ if (this.via !== undefined && this.from !== undefined && this.to !== undefined) {
+ this.via.x = 0.5 * (this.from.x + this.to.x);
+ this.via.y = 0.5 * (this.from.y + this.to.y);
+ }
+ else if (this.via !== undefined) {
+ this.via.x = 0;
+ this.via.y = 0;
+ }
+ }
+
+ /**
+ * Draw a line between two nodes
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ * @param {Node} viaNode
+ * @private
+ */
+ _line(ctx, values, viaNode) {
+ this._bezierCurve(ctx, values, viaNode);
+ }
+
+ /**
+ *
+ * @returns {Node|undefined|*|{index, line, column}}
+ */
+ getViaNode() {
+ return this.via;
+ }
+
+
+ /**
+ * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way
+ *
+ * @param {number} percentage
+ * @param {Node} viaNode
+ * @returns {{x: number, y: number}}
+ * @private
+ */
+ getPoint(percentage, viaNode = this.via) {
+ let t = percentage;
+ let x, y;
+ if (this.from === this.to){
+ let [cx,cy,cr] = this._getCircleData(this.from);
+ let a = 2 * Math.PI * (1 - t);
+ x = cx + cr * Math.sin(a);
+ y = cy + cr - cr * (1 - Math.cos(a));
+ } else {
+ x = Math.pow(1 - t, 2) * this.fromPoint.x + 2 * t * (1 - t) * viaNode.x + Math.pow(t, 2) * this.toPoint.x;
+ y = Math.pow(1 - t, 2) * this.fromPoint.y + 2 * t * (1 - t) * viaNode.y + Math.pow(t, 2) * this.toPoint.y;
+ }
+
+ return {x: x, y: y};
+ }
+
+ /**
+ *
+ * @param {Node} nearNode
+ * @param {CanvasRenderingContext2D} ctx
+ * @returns {*}
+ * @private
+ */
+ _findBorderPosition(nearNode, ctx) {
+ return this._findBorderPositionBezier(nearNode, ctx, this.via);
+ }
+
+ /**
+ *
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @returns {number}
+ * @private
+ */
+ _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { // x3,y3 is the point
+ return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, this.via);
+ }
+}
+
+
+export default BezierEdgeDynamic;
diff --git a/lib/network/modules/components/edges/BezierEdgeStatic.js b/lib/network/modules/components/edges/BezierEdgeStatic.js
new file mode 100644
index 0000000000..4f219c113b
--- /dev/null
+++ b/lib/network/modules/components/edges/BezierEdgeStatic.js
@@ -0,0 +1,207 @@
+import BezierEdgeBase from './util/BezierEdgeBase'
+
+/**
+ * A Static Bezier Edge. Bezier curves are used to model smooth gradual
+ * curves in paths between nodes.
+ *
+ * @extends BezierEdgeBase
+ */
+class BezierEdgeStatic extends BezierEdgeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ }
+
+ /**
+ * Draw a line between two nodes
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ * @param {Node} viaNode
+ * @private
+ */
+ _line(ctx, values, viaNode) {
+ this._bezierCurve(ctx, values, viaNode);
+ }
+
+ /**
+ *
+ * @returns {Array.<{x: number, y: number}>}
+ */
+ getViaNode() {
+ return this._getViaCoordinates();
+ }
+
+
+ /**
+ * We do not use the to and fromPoints here to make the via nodes the same as edges without arrows.
+ * @returns {{x: undefined, y: undefined}}
+ * @private
+ */
+ _getViaCoordinates() {
+ // Assumption: x/y coordinates in from/to always defined
+ let xVia = undefined;
+ let yVia = undefined;
+ let factor = this.options.smooth.roundness;
+ let type = this.options.smooth.type;
+ let dx = Math.abs(this.from.x - this.to.x);
+ let dy = Math.abs(this.from.y - this.to.y);
+ if (type === 'discrete' || type === 'diagonalCross') {
+ let stepX;
+ let stepY;
+
+ if (dx <= dy) {
+ stepX = stepY = factor * dy;
+ } else {
+ stepX = stepY = factor * dx;
+ }
+
+ if (this.from.x > this.to.x) stepX = -stepX;
+ if (this.from.y >= this.to.y) stepY = -stepY;
+
+ xVia = this.from.x + stepX;
+ yVia = this.from.y + stepY;
+
+ if (type === "discrete") {
+ if (dx <= dy) {
+ xVia = dx < factor * dy ? this.from.x : xVia;
+ } else {
+ yVia = dy < factor * dx ? this.from.y : yVia;
+ }
+ }
+ }
+ else if (type === "straightCross") {
+ let stepX = (1 - factor) * dx;
+ let stepY = (1 - factor) * dy;
+
+ if (dx <= dy) { // up - down
+ stepX = 0;
+ if (this.from.y < this.to.y) stepY = -stepY;
+ }
+ else { // left - right
+ if (this.from.x < this.to.x) stepX = -stepX;
+ stepY = 0;
+ }
+ xVia = this.to.x + stepX;
+ yVia = this.to.y + stepY;
+ }
+ else if (type === 'horizontal') {
+ let stepX = (1 - factor) * dx;
+ if (this.from.x < this.to.x) stepX = -stepX;
+ xVia = this.to.x + stepX;
+ yVia = this.from.y;
+ }
+ else if (type === 'vertical') {
+ let stepY = (1 - factor) * dy;
+ if (this.from.y < this.to.y) stepY = -stepY;
+ xVia = this.from.x;
+ yVia = this.to.y + stepY;
+ }
+ else if (type === 'curvedCW') {
+ dx = this.to.x - this.from.x;
+ dy = this.from.y - this.to.y;
+ let radius = Math.sqrt(dx * dx + dy * dy);
+ let pi = Math.PI;
+
+ let originalAngle = Math.atan2(dy, dx);
+ let myAngle = (originalAngle + ((factor * 0.5) + 0.5) * pi) % (2 * pi);
+
+ xVia = this.from.x + (factor * 0.5 + 0.5) * radius * Math.sin(myAngle);
+ yVia = this.from.y + (factor * 0.5 + 0.5) * radius * Math.cos(myAngle);
+ }
+ else if (type === 'curvedCCW') {
+ dx = this.to.x - this.from.x;
+ dy = this.from.y - this.to.y;
+ let radius = Math.sqrt(dx * dx + dy * dy);
+ let pi = Math.PI;
+
+ let originalAngle = Math.atan2(dy, dx);
+ let myAngle = (originalAngle + ((-factor * 0.5) + 0.5) * pi) % (2 * pi);
+
+ xVia = this.from.x + (factor * 0.5 + 0.5) * radius * Math.sin(myAngle);
+ yVia = this.from.y + (factor * 0.5 + 0.5) * radius * Math.cos(myAngle);
+ }
+ else { // continuous
+ let stepX;
+ let stepY;
+
+ if (dx <= dy) {
+ stepX = stepY = factor * dy;
+ } else {
+ stepX = stepY = factor * dx;
+ }
+
+ if (this.from.x > this.to.x) stepX = -stepX;
+ if (this.from.y >= this.to.y) stepY = -stepY;
+
+ xVia = this.from.x + stepX;
+ yVia = this.from.y + stepY;
+
+ if (dx <= dy) {
+ if (this.from.x <= this.to.x) {
+ xVia = this.to.x < xVia ? this.to.x : xVia;
+ }
+ else {
+ xVia = this.to.x > xVia ? this.to.x : xVia;
+ }
+ }
+ else {
+ if (this.from.y >= this.to.y) {
+ yVia = this.to.y > yVia ? this.to.y : yVia;
+ } else {
+ yVia = this.to.y < yVia ? this.to.y : yVia;
+ }
+ }
+ }
+ return {x: xVia, y: yVia};
+ }
+
+ /**
+ *
+ * @param {Node} nearNode
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Object} options
+ * @returns {*}
+ * @private
+ */
+ _findBorderPosition(nearNode, ctx, options = {}) {
+ return this._findBorderPositionBezier(nearNode, ctx, options.via);
+ }
+
+ /**
+ *
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @param {Node} viaNode
+ * @returns {number}
+ * @private
+ */
+ _getDistanceToEdge(x1, y1, x2, y2, x3, y3, viaNode = this._getViaCoordinates()) { // x3,y3 is the point
+ return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, viaNode);
+ }
+
+ /**
+ * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way
+ * @param {number} percentage
+ * @param {Node} viaNode
+ * @returns {{x: number, y: number}}
+ * @private
+ */
+ getPoint(percentage, viaNode = this._getViaCoordinates()) {
+ var t = percentage;
+ var x = Math.pow(1 - t, 2) * this.fromPoint.x + (2 * t * (1 - t)) * viaNode.x + Math.pow(t, 2) * this.toPoint.x;
+ var y = Math.pow(1 - t, 2) * this.fromPoint.y + (2 * t * (1 - t)) * viaNode.y + Math.pow(t, 2) * this.toPoint.y;
+
+ return {x: x, y: y};
+ }
+}
+
+
+export default BezierEdgeStatic;
diff --git a/lib/network/modules/components/edges/CubicBezierEdge.js b/lib/network/modules/components/edges/CubicBezierEdge.js
new file mode 100644
index 0000000000..ee36212820
--- /dev/null
+++ b/lib/network/modules/components/edges/CubicBezierEdge.js
@@ -0,0 +1,121 @@
+import CubicBezierEdgeBase from './util/CubicBezierEdgeBase'
+
+/**
+ * A Cubic Bezier Edge. Bezier curves are used to model smooth gradual
+ * curves in paths between nodes.
+ *
+ * @extends CubicBezierEdgeBase
+ */
+class CubicBezierEdge extends CubicBezierEdgeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ }
+
+ /**
+ * Draw a line between two nodes
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ * @param {Array.} viaNodes
+ * @private
+ */
+ _line(ctx, values, viaNodes) {
+ // get the coordinates of the support points.
+ let via1 = viaNodes[0];
+ let via2 = viaNodes[1];
+ this._bezierCurve(ctx, values, via1, via2);
+ }
+
+ /**
+ *
+ * @returns {Array.<{x: number, y: number}>}
+ * @private
+ */
+ _getViaCoordinates() {
+ let dx = this.from.x - this.to.x;
+ let dy = this.from.y - this.to.y;
+
+ let x1, y1, x2, y2;
+ let roundness = this.options.smooth.roundness;
+
+ // horizontal if x > y or if direction is forced or if direction is horizontal
+ if ((Math.abs(dx) > Math.abs(dy) || this.options.smooth.forceDirection === true || this.options.smooth.forceDirection === 'horizontal') && this.options.smooth.forceDirection !== 'vertical') {
+ y1 = this.from.y;
+ y2 = this.to.y;
+ x1 = this.from.x - roundness * dx;
+ x2 = this.to.x + roundness * dx;
+ }
+ else {
+ y1 = this.from.y - roundness * dy;
+ y2 = this.to.y + roundness * dy;
+ x1 = this.from.x;
+ x2 = this.to.x;
+ }
+
+ return [{x: x1, y: y1},{x: x2, y: y2}];
+ }
+
+ /**
+ *
+ * @returns {Array.<{x: number, y: number}>}
+ */
+ getViaNode() {
+ return this._getViaCoordinates();
+ }
+
+ /**
+ *
+ * @param {Node} nearNode
+ * @param {CanvasRenderingContext2D} ctx
+ * @returns {{x: number, y: number, t: number}}
+ * @private
+ */
+ _findBorderPosition(nearNode, ctx) {
+ return this._findBorderPositionBezier(nearNode, ctx);
+ }
+
+ /**
+ *
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @param {Node} via1
+ * @param {Node} via2
+ * @returns {number}
+ * @private
+ */
+ _getDistanceToEdge(x1, y1, x2, y2, x3, y3, [via1, via2] = this._getViaCoordinates()) { // x3,y3 is the point
+ return this._getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2);
+ }
+
+ /**
+ * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way
+ * @param {number} percentage
+ * @param {{x: number, y: number}} [via1=this._getViaCoordinates()[0]]
+ * @param {{x: number, y: number}} [via2=this._getViaCoordinates()[1]]
+ * @returns {{x: number, y: number}}
+ * @private
+ */
+ getPoint(percentage, [via1, via2] = this._getViaCoordinates()) {
+ let t = percentage;
+ let vec = [];
+ vec[0] = Math.pow(1 - t, 3);
+ vec[1] = 3 * t * Math.pow(1 - t, 2);
+ vec[2] = 3 * Math.pow(t,2) * (1 - t);
+ vec[3] = Math.pow(t, 3);
+ let x = vec[0] * this.fromPoint.x + vec[1] * via1.x + vec[2] * via2.x + vec[3] * this.toPoint.x;
+ let y = vec[0] * this.fromPoint.y + vec[1] * via1.y + vec[2] * via2.y + vec[3] * this.toPoint.y;
+
+ return {x: x, y: y};
+ }
+}
+
+
+export default CubicBezierEdge;
diff --git a/lib/network/modules/components/edges/StraightEdge.js b/lib/network/modules/components/edges/StraightEdge.js
new file mode 100644
index 0000000000..42368b3dcd
--- /dev/null
+++ b/lib/network/modules/components/edges/StraightEdge.js
@@ -0,0 +1,103 @@
+import EdgeBase from './util/EdgeBase'
+
+/**
+ * A Straight Edge.
+ *
+ * @extends EdgeBase
+ */
+class StraightEdge extends EdgeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ }
+
+ /**
+ * Draw a line between two nodes
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ * @private
+ */
+ _line(ctx, values) {
+ // draw a straight line
+ ctx.beginPath();
+ ctx.moveTo(this.fromPoint.x, this.fromPoint.y);
+ ctx.lineTo(this.toPoint.x, this.toPoint.y);
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+ ctx.stroke();
+ this.disableShadow(ctx, values);
+ }
+
+ /**
+ *
+ * @returns {undefined}
+ */
+ getViaNode() {
+ return undefined;
+ }
+
+ /**
+ * Combined function of pointOnLine and pointOnBezier. This gives the coordinates of a point on the line at a certain percentage of the way
+ *
+ * @param {number} percentage
+ * @returns {{x: number, y: number}}
+ * @private
+ */
+ getPoint(percentage) {
+ return {
+ x: (1 - percentage) * this.fromPoint.x + percentage * this.toPoint.x,
+ y: (1 - percentage) * this.fromPoint.y + percentage * this.toPoint.y
+ }
+ }
+
+ /**
+ *
+ * @param {Node} nearNode
+ * @param {CanvasRenderingContext2D} ctx
+ * @returns {{x: number, y: number}}
+ * @private
+ */
+ _findBorderPosition(nearNode, ctx) {
+ let node1 = this.to;
+ let node2 = this.from;
+ if (nearNode.id === this.from.id) {
+ node1 = this.from;
+ node2 = this.to;
+ }
+
+ let angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x));
+ let dx = (node1.x - node2.x);
+ let dy = (node1.y - node2.y);
+ let edgeSegmentLength = Math.sqrt(dx * dx + dy * dy);
+ let toBorderDist = nearNode.distanceToBorder(ctx, angle);
+ let toBorderPoint = (edgeSegmentLength - toBorderDist) / edgeSegmentLength;
+
+ let borderPos = {};
+ borderPos.x = (1 - toBorderPoint) * node2.x + toBorderPoint * node1.x;
+ borderPos.y = (1 - toBorderPoint) * node2.y + toBorderPoint * node1.y;
+
+ return borderPos;
+ }
+
+ /**
+ *
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @returns {number}
+ * @private
+ */
+ _getDistanceToEdge(x1, y1, x2, y2, x3, y3) { // x3,y3 is the point
+ return this._getDistanceToLine(x1, y1, x2, y2, x3, y3);
+ }
+
+}
+
+export default StraightEdge;
diff --git a/lib/network/modules/components/edges/util/BezierEdgeBase.js b/lib/network/modules/components/edges/util/BezierEdgeBase.js
new file mode 100644
index 0000000000..576b76bbce
--- /dev/null
+++ b/lib/network/modules/components/edges/util/BezierEdgeBase.js
@@ -0,0 +1,161 @@
+import EdgeBase from './EdgeBase'
+
+/**
+ * The Base Class for all Bezier edges. Bezier curves are used to model smooth
+ * gradual curves in paths between nodes.
+ *
+ * @extends EdgeBase
+ */
+class BezierEdgeBase extends EdgeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ }
+
+ /**
+ * This function uses binary search to look for the point where the bezier curve crosses the border of the node.
+ *
+ * @param {Node} nearNode
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Node} viaNode
+ * @returns {*}
+ * @private
+ */
+ _findBorderPositionBezier(nearNode, ctx, viaNode = this._getViaCoordinates()) {
+ var maxIterations = 10;
+ var iteration = 0;
+ var low = 0;
+ var high = 1;
+ var pos, angle, distanceToBorder, distanceToPoint, difference;
+ var threshold = 0.2;
+ var node = this.to;
+ var from = false;
+ if (nearNode.id === this.from.id) {
+ node = this.from;
+ from = true;
+ }
+
+ while (low <= high && iteration < maxIterations) {
+ var middle = (low + high) * 0.5;
+
+ pos = this.getPoint(middle, viaNode);
+ angle = Math.atan2((node.y - pos.y), (node.x - pos.x));
+ distanceToBorder = node.distanceToBorder(ctx, angle);
+ distanceToPoint = Math.sqrt(Math.pow(pos.x - node.x, 2) + Math.pow(pos.y - node.y, 2));
+ difference = distanceToBorder - distanceToPoint;
+ if (Math.abs(difference) < threshold) {
+ break; // found
+ }
+ else if (difference < 0) { // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node.
+ if (from === false) {
+ low = middle;
+ }
+ else {
+ high = middle;
+ }
+ }
+ else {
+ if (from === false) {
+ high = middle;
+ }
+ else {
+ low = middle;
+ }
+ }
+
+ iteration++;
+ }
+ pos.t = middle;
+
+ return pos;
+ }
+
+
+
+ /**
+ * Calculate the distance between a point (x3,y3) and a line segment from
+ * (x1,y1) to (x2,y2).
+ * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment
+ * @param {number} x1 from x
+ * @param {number} y1 from y
+ * @param {number} x2 to x
+ * @param {number} y2 to y
+ * @param {number} x3 point to check x
+ * @param {number} y3 point to check y
+ * @param {Node} via
+ * @returns {number}
+ * @private
+ */
+ _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via) { // x3,y3 is the point
+ let minDistance = 1e9;
+ let distance;
+ let i, t, x, y;
+ let lastX = x1;
+ let lastY = y1;
+ for (i = 1; i < 10; i++) {
+ t = 0.1 * i;
+ x = Math.pow(1 - t, 2) * x1 + (2 * t * (1 - t)) * via.x + Math.pow(t, 2) * x2;
+ y = Math.pow(1 - t, 2) * y1 + (2 * t * (1 - t)) * via.y + Math.pow(t, 2) * y2;
+ if (i > 0) {
+ distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3);
+ minDistance = distance < minDistance ? distance : minDistance;
+ }
+ lastX = x;
+ lastY = y;
+ }
+
+ return minDistance;
+ }
+
+
+ /**
+ * Draw a bezier curve between two nodes
+ *
+ * The method accepts zero, one or two control points.
+ * Passing zero control points just draws a straight line
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Object} values | options for shadow drawing
+ * @param {Object|undefined} viaNode1 | first control point for curve drawing
+ * @param {Object|undefined} viaNode2 | second control point for curve drawing
+ *
+ * @protected
+ */
+ _bezierCurve(ctx, values, viaNode1, viaNode2) {
+ var hasNode1 = (viaNode1 !== undefined && viaNode1.x !== undefined);
+ var hasNode2 = (viaNode2 !== undefined && viaNode2.x !== undefined);
+
+ ctx.beginPath();
+ ctx.moveTo(this.fromPoint.x, this.fromPoint.y);
+
+ if (hasNode1 && hasNode2) {
+ ctx.bezierCurveTo(viaNode1.x, viaNode1.y, viaNode2.x, viaNode2.y, this.toPoint.x, this.toPoint.y);
+ } else if (hasNode1) {
+ ctx.quadraticCurveTo(viaNode1.x, viaNode1.y, this.toPoint.x, this.toPoint.y);
+ } else {
+ // fallback to normal straight edge
+ ctx.lineTo(this.toPoint.x, this.toPoint.y);
+ }
+ // draw a background
+ this.drawBackground(ctx, values);
+
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+ ctx.stroke();
+ this.disableShadow(ctx, values);
+ }
+
+ /**
+ *
+ * @returns {*|{x, y}|{x: undefined, y: undefined}}
+ */
+ getViaNode() {
+ return this._getViaCoordinates();
+ }
+}
+
+export default BezierEdgeBase;
diff --git a/lib/network/modules/components/edges/util/CubicBezierEdgeBase.js b/lib/network/modules/components/edges/util/CubicBezierEdgeBase.js
new file mode 100644
index 0000000000..6a7f2a73d8
--- /dev/null
+++ b/lib/network/modules/components/edges/util/CubicBezierEdgeBase.js
@@ -0,0 +1,62 @@
+import BezierEdgeBase from './BezierEdgeBase'
+
+/**
+ * A Base Class for all Cubic Bezier Edges. Bezier curves are used to model
+ * smooth gradual curves in paths between nodes.
+ *
+ * @extends BezierEdgeBase
+ */
+class CubicBezierEdgeBase extends BezierEdgeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ }
+
+ /**
+ * Calculate the distance between a point (x3,y3) and a line segment from
+ * (x1,y1) to (x2,y2).
+ * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment
+ * https://en.wikipedia.org/wiki/B%C3%A9zier_curve
+ * @param {number} x1 from x
+ * @param {number} y1 from y
+ * @param {number} x2 to x
+ * @param {number} y2 to y
+ * @param {number} x3 point to check x
+ * @param {number} y3 point to check y
+ * @param {Node} via1
+ * @param {Node} via2
+ * @returns {number}
+ * @private
+ */
+ _getDistanceToBezierEdge(x1, y1, x2, y2, x3, y3, via1, via2) { // x3,y3 is the point
+ let minDistance = 1e9;
+ let distance;
+ let i, t, x, y;
+ let lastX = x1;
+ let lastY = y1;
+ let vec = [0,0,0,0]
+ for (i = 1; i < 10; i++) {
+ t = 0.1 * i;
+ vec[0] = Math.pow(1 - t, 3);
+ vec[1] = 3 * t * Math.pow(1 - t, 2);
+ vec[2] = 3 * Math.pow(t,2) * (1 - t);
+ vec[3] = Math.pow(t, 3);
+ x = vec[0] * x1 + vec[1] * via1.x + vec[2] * via2.x + vec[3] * x2;
+ y = vec[0] * y1 + vec[1] * via1.y + vec[2] * via2.y + vec[3] * y2;
+ if (i > 0) {
+ distance = this._getDistanceToLine(lastX, lastY, x, y, x3, y3);
+ minDistance = distance < minDistance ? distance : minDistance;
+ }
+ lastX = x;
+ lastY = y;
+ }
+
+ return minDistance;
+ }
+}
+
+export default CubicBezierEdgeBase;
\ No newline at end of file
diff --git a/lib/network/modules/components/edges/util/EdgeBase.js b/lib/network/modules/components/edges/util/EdgeBase.js
new file mode 100644
index 0000000000..62887d88fd
--- /dev/null
+++ b/lib/network/modules/components/edges/util/EdgeBase.js
@@ -0,0 +1,653 @@
+import util from 'vis-util';
+import EndPoints from './EndPoints';
+
+
+/**
+ * The Base Class for all edges.
+ *
+ */
+class EdgeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ this.body = body;
+ this.labelModule = labelModule;
+ this.options = {};
+ this.setOptions(options);
+ this.colorDirty = true;
+ this.color = {};
+ this.selectionWidth = 2;
+ this.hoverWidth = 1.5;
+ this.fromPoint = this.from;
+ this.toPoint = this.to;
+ }
+
+ /**
+ * Connects a node to itself
+ */
+ connect() {
+ this.from = this.body.nodes[this.options.from];
+ this.to = this.body.nodes[this.options.to];
+ }
+
+ /**
+ *
+ * @returns {boolean} always false
+ */
+ cleanup() {
+ return false;
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ this.from = this.body.nodes[this.options.from];
+ this.to = this.body.nodes[this.options.to];
+ this.id = this.options.id;
+ }
+
+ /**
+ * Redraw a edge as a line
+ * Draw this edge in the given canvas
+ * The 2d context of a HTML canvas can be retrieved by canvas.getContext("2d");
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Array} values
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {Node} viaNode
+ * @private
+ */
+ drawLine(ctx, values, selected, hover, viaNode) {
+ // set style
+ ctx.strokeStyle = this.getColor(ctx, values, selected, hover);
+ ctx.lineWidth = values.width;
+
+ if (values.dashes !== false) {
+ this._drawDashedLine(ctx, values, viaNode);
+ }
+ else {
+ this._drawLine(ctx, values, viaNode);
+ }
+ }
+
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Array} values
+ * @param {Node} viaNode
+ * @param {{x: number, y: number}} [fromPoint]
+ * @param {{x: number, y: number}} [toPoint]
+ * @private
+ */
+ _drawLine(ctx, values, viaNode, fromPoint, toPoint) {
+ if (this.from != this.to) {
+ // draw line
+ this._line(ctx, values, viaNode, fromPoint, toPoint);
+ }
+ else {
+ let [x,y,radius] = this._getCircleData(ctx);
+ this._circle(ctx, values, x, y, radius);
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Array} values
+ * @param {Node} viaNode
+ * @param {{x: number, y: number}} [fromPoint] TODO: Remove in next major release
+ * @param {{x: number, y: number}} [toPoint] TODO: Remove in next major release
+ * @private
+ */
+ _drawDashedLine(ctx, values, viaNode, fromPoint, toPoint) { // eslint-disable-line no-unused-vars
+ ctx.lineCap = 'round';
+ let pattern = [5,5];
+ if (Array.isArray(values.dashes) === true) {
+ pattern = values.dashes;
+ }
+
+ // only firefox and chrome support this method, else we use the legacy one.
+ if (ctx.setLineDash !== undefined) {
+ ctx.save();
+
+ // set dash settings for chrome or firefox
+ ctx.setLineDash(pattern);
+ ctx.lineDashOffset = 0;
+
+ // draw the line
+ if (this.from != this.to) {
+ // draw line
+ this._line(ctx, values, viaNode);
+ }
+ else {
+ let [x,y,radius] = this._getCircleData(ctx);
+ this._circle(ctx, values, x, y, radius);
+ }
+
+ // restore the dash settings.
+ ctx.setLineDash([0]);
+ ctx.lineDashOffset = 0;
+ ctx.restore();
+ }
+ else { // unsupporting smooth lines
+ if (this.from != this.to) {
+ // draw line
+ ctx.dashedLine(this.from.x, this.from.y, this.to.x, this.to.y, pattern);
+ }
+ else {
+ let [x,y,radius] = this._getCircleData(ctx);
+ this._circle(ctx, values, x, y, radius);
+ }
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+
+ ctx.stroke();
+
+ // disable shadows for other elements.
+ this.disableShadow(ctx, values);
+ }
+ }
+
+
+ /**
+ *
+ * @param {Node} nearNode
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Object} options
+ * @returns {{x: number, y: number}}
+ */
+ findBorderPosition(nearNode, ctx, options) {
+ if (this.from != this.to) {
+ return this._findBorderPosition(nearNode, ctx, options);
+ }
+ else {
+ return this._findBorderPositionCircle(nearNode, ctx, options);
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @returns {{from: ({x: number, y: number, t: number}|*), to: ({x: number, y: number, t: number}|*)}}
+ */
+ findBorderPositions(ctx) {
+ let from = {};
+ let to = {};
+ if (this.from != this.to) {
+ from = this._findBorderPosition(this.from, ctx);
+ to = this._findBorderPosition(this.to, ctx);
+ }
+ else {
+ let [x,y] = this._getCircleData(ctx).slice(0, 2);
+
+ from = this._findBorderPositionCircle(this.from, ctx, {x, y, low:0.25, high:0.6, direction:-1});
+ to = this._findBorderPositionCircle(this.from, ctx, {x, y, low:0.6, high:0.8, direction:1});
+ }
+ return {from, to};
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @returns {Array.} x, y, radius
+ * @private
+ */
+ _getCircleData(ctx) {
+ let x, y;
+ let node = this.from;
+ let radius = this.options.selfReferenceSize;
+
+ if (ctx !== undefined) {
+ if (node.shape.width === undefined) {
+ node.shape.resize(ctx);
+ }
+ }
+
+ // get circle coordinates
+ if (node.shape.width > node.shape.height) {
+ x = node.x + node.shape.width * 0.5;
+ y = node.y - radius;
+ }
+ else {
+ x = node.x + radius;
+ y = node.y - node.shape.height * 0.5;
+ }
+ return [x,y,radius];
+ }
+
+ /**
+ * Get a point on a circle
+ * @param {number} x
+ * @param {number} y
+ * @param {number} radius
+ * @param {number} percentage - Value between 0 (line start) and 1 (line end)
+ * @return {Object} point
+ * @private
+ */
+ _pointOnCircle(x, y, radius, percentage) {
+ let angle = percentage * 2 * Math.PI;
+ return {
+ x: x + radius * Math.cos(angle),
+ y: y - radius * Math.sin(angle)
+ }
+ }
+
+ /**
+ * This function uses binary search to look for the point where the circle crosses the border of the node.
+ * @param {Node} node
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Object} options
+ * @returns {*}
+ * @private
+ */
+ _findBorderPositionCircle(node, ctx, options) {
+ let x = options.x;
+ let y = options.y;
+ let low = options.low;
+ let high = options.high;
+ let direction = options.direction;
+
+ let maxIterations = 10;
+ let iteration = 0;
+ let radius = this.options.selfReferenceSize;
+ let pos, angle, distanceToBorder, distanceToPoint, difference;
+ let threshold = 0.05;
+ let middle = (low + high) * 0.5;
+
+ while (low <= high && iteration < maxIterations) {
+ middle = (low + high) * 0.5;
+
+ pos = this._pointOnCircle(x, y, radius, middle);
+ angle = Math.atan2((node.y - pos.y), (node.x - pos.x));
+ distanceToBorder = node.distanceToBorder(ctx, angle);
+ distanceToPoint = Math.sqrt(Math.pow(pos.x - node.x, 2) + Math.pow(pos.y - node.y, 2));
+ difference = distanceToBorder - distanceToPoint;
+ if (Math.abs(difference) < threshold) {
+ break; // found
+ }
+ else if (difference > 0) { // distance to nodes is larger than distance to border --> t needs to be bigger if we're looking at the to node.
+ if (direction > 0) {
+ low = middle;
+ }
+ else {
+ high = middle;
+ }
+ }
+ else {
+ if (direction > 0) {
+ high = middle;
+ }
+ else {
+ low = middle;
+ }
+ }
+ iteration++;
+
+ }
+ pos.t = middle;
+
+ return pos;
+ }
+
+ /**
+ * Get the line width of the edge. Depends on width and whether one of the
+ * connected nodes is selected.
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @returns {number} width
+ * @private
+ */
+ getLineWidth(selected, hover) {
+ if (selected === true) {
+ return Math.max(this.selectionWidth, 0.3 / this.body.view.scale);
+ }
+ else {
+ if (hover === true) {
+ return Math.max(this.hoverWidth, 0.3 / this.body.view.scale);
+ }
+ else {
+ return Math.max(this.options.width, 0.3 / this.body.view.scale);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ * @param {boolean} selected - Unused
+ * @param {boolean} hover - Unused
+ * @returns {string}
+ */
+ getColor(ctx, values, selected, hover) { // eslint-disable-line no-unused-vars
+ if (values.inheritsColor !== false) {
+ // when this is a loop edge, just use the 'from' method
+ if ((values.inheritsColor === 'both') && (this.from.id !== this.to.id)) {
+ let grd = ctx.createLinearGradient(this.from.x, this.from.y, this.to.x, this.to.y);
+ let fromColor, toColor;
+ fromColor = this.from.options.color.highlight.border;
+ toColor = this.to.options.color.highlight.border;
+
+ if ((this.from.selected === false) && (this.to.selected === false)) {
+ fromColor = util.overrideOpacity(this.from.options.color.border, values.opacity);
+ toColor = util.overrideOpacity(this.to.options.color.border, values.opacity);
+ }
+ else if ((this.from.selected === true) && (this.to.selected === false)) {
+ toColor = this.to.options.color.border;
+ }
+ else if ((this.from.selected === false) && (this.to.selected === true)) {
+ fromColor = this.from.options.color.border;
+ }
+ grd.addColorStop(0, fromColor);
+ grd.addColorStop(1, toColor);
+
+ // -------------------- this returns -------------------- //
+ return grd;
+ }
+
+ if (values.inheritsColor === "to") {
+ return util.overrideOpacity(this.to.options.color.border, values.opacity);
+ } else { // "from"
+ return util.overrideOpacity(this.from.options.color.border, values.opacity);
+ }
+ } else {
+ return util.overrideOpacity(values.color, values.opacity);
+ }
+ }
+
+ /**
+ * Draw a line from a node to itself, a circle
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Array} values
+ * @param {number} x
+ * @param {number} y
+ * @param {number} radius
+ * @private
+ */
+ _circle(ctx, values, x, y, radius) {
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+
+ // draw a circle
+ ctx.beginPath();
+ ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
+ ctx.stroke();
+
+ // disable shadows for other elements.
+ this.disableShadow(ctx, values);
+ }
+
+
+ /**
+ * Calculate the distance between a point (x3,y3) and a line segment from (x1,y1) to (x2,y2).
+ * (x3,y3) is the point.
+ *
+ * http://stackoverflow.com/questions/849211/shortest-distancae-between-a-point-and-a-line-segment
+ *
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @param {Node} via
+ * @param {Array} values
+ * @returns {number}
+ */
+ getDistanceToEdge(x1, y1, x2, y2, x3, y3, via, values) { // eslint-disable-line no-unused-vars
+ let returnValue = 0;
+ if (this.from != this.to) {
+ returnValue = this._getDistanceToEdge(x1, y1, x2, y2, x3, y3, via)
+ }
+ else {
+ let [x,y,radius] = this._getCircleData(undefined);
+ let dx = x - x3;
+ let dy = y - y3;
+ returnValue = Math.abs(Math.sqrt(dx * dx + dy * dy) - radius);
+ }
+
+ return returnValue;
+ }
+
+
+ /**
+ *
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @returns {number}
+ * @private
+ */
+ _getDistanceToLine(x1, y1, x2, y2, x3, y3) {
+ let px = x2 - x1;
+ let py = y2 - y1;
+ let something = px * px + py * py;
+ let u = ((x3 - x1) * px + (y3 - y1) * py) / something;
+
+ if (u > 1) {
+ u = 1;
+ }
+ else if (u < 0) {
+ u = 0;
+ }
+
+ let x = x1 + u * px;
+ let y = y1 + u * py;
+ let dx = x - x3;
+ let dy = y - y3;
+
+ //# Note: If the actual distance does not matter,
+ //# if you only want to compare what this function
+ //# returns to other results of this function, you
+ //# can just return the squared distance instead
+ //# (i.e. remove the sqrt) to gain a little performance
+
+ return Math.sqrt(dx * dx + dy * dy);
+ }
+
+
+ /**
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {string} position
+ * @param {Node} viaNode
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {Array} values
+ * @returns {{point: *, core: {x: number, y: number}, angle: *, length: number, type: *}}
+ */
+ getArrowData(ctx, position, viaNode, selected, hover, values) {
+ // set lets
+ let angle;
+ let arrowPoint;
+ let node1;
+ let node2;
+ let guideOffset;
+ let scaleFactor;
+ let type;
+ let lineWidth = values.width;
+
+ if (position === 'from') {
+ node1 = this.from;
+ node2 = this.to;
+ guideOffset = 0.1;
+ scaleFactor = values.fromArrowScale;
+ type = values.fromArrowType;
+ }
+ else if (position === 'to') {
+ node1 = this.to;
+ node2 = this.from;
+ guideOffset = -0.1;
+ scaleFactor = values.toArrowScale;
+ type = values.toArrowType;
+ }
+ else {
+ node1 = this.to;
+ node2 = this.from;
+ scaleFactor = values.middleArrowScale;
+ type = values.middleArrowType;
+ }
+
+ // if not connected to itself
+ if (node1 != node2) {
+ if (position !== 'middle') {
+ // draw arrow head
+ if (this.options.smooth.enabled === true) {
+ arrowPoint = this.findBorderPosition(node1, ctx, { via: viaNode });
+ let guidePos = this.getPoint(Math.max(0.0, Math.min(1.0, arrowPoint.t + guideOffset)), viaNode);
+ angle = Math.atan2((arrowPoint.y - guidePos.y), (arrowPoint.x - guidePos.x));
+ } else {
+ angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x));
+ arrowPoint = this.findBorderPosition(node1, ctx);
+ }
+ } else {
+ angle = Math.atan2((node1.y - node2.y), (node1.x - node2.x));
+ arrowPoint = this.getPoint(0.5, viaNode); // this is 0.6 to account for the size of the arrow.
+ }
+ } else {
+ // draw circle
+ let [x,y,radius] = this._getCircleData(ctx);
+
+ if (position === 'from') {
+ arrowPoint = this.findBorderPosition(this.from, ctx, { x, y, low: 0.25, high: 0.6, direction: -1 });
+ angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI;
+ } else if (position === 'to') {
+ arrowPoint = this.findBorderPosition(this.from, ctx, { x, y, low: 0.6, high: 1.0, direction: 1 });
+ angle = arrowPoint.t * -2 * Math.PI + 1.5 * Math.PI - 1.1 * Math.PI;
+ } else {
+ arrowPoint = this._pointOnCircle(x, y, radius, 0.175);
+ angle = 3.9269908169872414; // === 0.175 * -2 * Math.PI + 1.5 * Math.PI + 0.1 * Math.PI;
+ }
+ }
+
+ if (position === 'middle' && scaleFactor < 0) lineWidth *= -1; // reversed middle arrow
+ let length = 15 * scaleFactor + 3 * lineWidth; // 3* lineWidth is the width of the edge.
+
+ var xi = arrowPoint.x - length * 0.9 * Math.cos(angle);
+ var yi = arrowPoint.y - length * 0.9 * Math.sin(angle);
+ let arrowCore = { x: xi, y: yi };
+
+ return { point: arrowPoint, core: arrowCore, angle: angle, length: length, type: type };
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {Object} arrowData
+ */
+ drawArrowHead(ctx, values, selected, hover, arrowData) {
+ // set style
+ ctx.strokeStyle = this.getColor(ctx, values, selected, hover);
+ ctx.fillStyle = ctx.strokeStyle;
+ ctx.lineWidth = values.width;
+
+ EndPoints.draw(ctx, arrowData);
+
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+ ctx.fill();
+ // disable shadows for other elements.
+ this.disableShadow(ctx, values);
+ }
+
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ enableShadow(ctx, values) {
+ if (values.shadow === true) {
+ ctx.shadowColor = values.shadowColor;
+ ctx.shadowBlur = values.shadowSize;
+ ctx.shadowOffsetX = values.shadowX;
+ ctx.shadowOffsetY = values.shadowY;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ disableShadow(ctx, values) {
+ if (values.shadow === true) {
+ ctx.shadowColor = 'rgba(0,0,0,0)';
+ ctx.shadowBlur = 0;
+ ctx.shadowOffsetX = 0;
+ ctx.shadowOffsetY = 0;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {{toArrow: boolean, toArrowScale: (allOptions.edges.arrows.to.scaleFactor|{number}|allOptions.edges.arrows.middle.scaleFactor|allOptions.edges.arrows.from.scaleFactor|Array|number), toArrowType: *, middleArrow: boolean, middleArrowScale: (number|allOptions.edges.arrows.middle.scaleFactor|{number}|Array), middleArrowType: (allOptions.edges.arrows.middle.type|{string}|string|*), fromArrow: boolean, fromArrowScale: (allOptions.edges.arrows.to.scaleFactor|{number}|allOptions.edges.arrows.middle.scaleFactor|allOptions.edges.arrows.from.scaleFactor|Array|number), fromArrowType: *, arrowStrikethrough: (*|boolean|allOptions.edges.arrowStrikethrough|{boolean}), color: undefined, inheritsColor: (string|string|string|allOptions.edges.color.inherit|{string, boolean}|Array|*), opacity: *, hidden: *, length: *, shadow: *, shadowColor: *, shadowSize: *, shadowX: *, shadowY: *, dashes: (*|boolean|Array|allOptions.edges.dashes|{boolean, array}), width: *}} values
+ */
+ drawBackground(ctx, values) {
+ if (values.background !== false) {
+ let attrs = ['strokeStyle', 'lineWidth', 'dashes'];
+ let origCtxAttr = {};
+ // save original line attrs
+ attrs.forEach(function(attrname) {
+ origCtxAttr[attrname] = ctx[attrname];
+ });
+
+ ctx.strokeStyle = values.backgroundColor;
+ ctx.lineWidth = values.backgroundSize;
+ this.setStrokeDashed(ctx, values.backgroundDashes);
+
+ ctx.stroke();
+
+ // restore original line attrs
+ attrs.forEach(function(attrname) {
+ ctx[attrname] = origCtxAttr[attrname];
+ });
+ this.setStrokeDashed(ctx, values.dashes);
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean|Array} dashes
+ */
+ setStrokeDashed(ctx, dashes) {
+ if (dashes !== false) {
+ if (ctx.setLineDash !== undefined) {
+ let pattern = [5, 5];
+ if (Array.isArray(dashes) === true) {
+ pattern = dashes;
+ }
+ ctx.setLineDash(pattern);
+ }
+ else {
+ console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.");
+ }
+ }
+ else {
+ if (ctx.setLineDash !== undefined) {
+ ctx.setLineDash([]);
+ }
+ else {
+ console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.");
+ }
+ }
+ }
+}
+
+export default EdgeBase;
diff --git a/lib/network/modules/components/edges/util/EndPoints.js b/lib/network/modules/components/edges/util/EndPoints.js
new file mode 100644
index 0000000000..cf8882ebc7
--- /dev/null
+++ b/lib/network/modules/components/edges/util/EndPoints.js
@@ -0,0 +1,457 @@
+/** ============================================================================
+ * Location of all the endpoint drawing routines.
+ *
+ * Every endpoint has its own drawing routine, which contains an endpoint definition.
+ *
+ * The endpoint definitions must have the following properies:
+ *
+ * - (0,0) is the connection point to the node it attaches to
+ * - The endpoints are orientated to the positive x-direction
+ * - The length of the endpoint is at most 1
+ *
+ * As long as the endpoint classes remain simple and not too numerous, they will
+ * be contained within this module.
+ * All classes here except `EndPoints` should be considered as private to this module.
+ *
+ * -----------------------------------------------------------------------------
+ * ### Further Actions
+ *
+ * After adding a new endpoint here, you also need to do the following things:
+ *
+ * - Add the new endpoint name to `network/options.js` in array `endPoints`.
+ * - Add the new endpoint name to the documentation.
+ * Scan for 'arrows.to.type` and add it to the description.
+ * - Add the endpoint to the examples. At the very least, add it to example
+ * `edgeStyles/arrowTypes`.
+ * ============================================================================= */
+
+/**
+ * Common methods for endpoints
+ *
+ * @class
+ */
+class EndPoint {
+
+ /**
+ * Apply transformation on points for display.
+ *
+ * The following is done:
+ * - rotate by the specified angle
+ * - multiply the (normalized) coordinates by the passed length
+ * - offset by the target coordinates
+ *
+ * @param {Array} points
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static transform(points, arrowData) {
+ if (!(points instanceof Array)) {
+ points = [points];
+ }
+
+ var x = arrowData.point.x;
+ var y = arrowData.point.y;
+ var angle = arrowData.angle
+ var length = arrowData.length;
+
+ for(var i = 0; i < points.length; ++i) {
+ var p = points[i];
+ var xt = p.x * Math.cos(angle) - p.y * Math.sin(angle);
+ var yt = p.x * Math.sin(angle) + p.y * Math.cos(angle);
+
+ p.x = x + length*xt;
+ p.y = y + length*yt;
+ }
+ }
+
+
+ /**
+ * Draw a closed path using the given real coordinates.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {Array.} points
+ * @static
+ */
+ static drawPath(ctx, points) {
+ ctx.beginPath();
+ ctx.moveTo(points[0].x, points[0].y);
+ for(var i = 1; i < points.length; ++i) {
+ ctx.lineTo(points[i].x, points[i].y);
+ }
+ ctx.closePath();
+ }
+}
+
+
+
+
+/**
+ * Drawing methods for the arrow endpoint.
+ * @extends EndPoint
+ */
+class Arrow extends EndPoint {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ // Normalized points of closed path, in the order that they should be drawn.
+ // (0, 0) is the attachment point, and the point around which should be rotated
+ var points = [
+ { x: 0 , y: 0 },
+ { x:-1 , y: 0.3},
+ { x:-0.9, y: 0 },
+ { x:-1 , y:-0.3},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the crow endpoint.
+ * @extends EndPoint
+ */
+class Crow {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ // Normalized points of closed path, in the order that they should be drawn.
+ // (0, 0) is the attachment point, and the point around which should be rotated
+ var points = [
+ { x:-1, y: 0},
+ { x:0, y: 0.3},
+ { x:-0.4, y: 0},
+ { x:0, y:-0.3},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the curve endpoint.
+ * @extends EndPoint
+ */
+class Curve {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ // Normalized points of closed path, in the order that they should be drawn.
+ // (0, 0) is the attachment point, and the point around which should be rotated
+ var point = {x:-0.4, y:0};
+ EndPoint.transform(point, arrowData);
+
+ // Update endpoint style for drawing transparent arc.
+ ctx.strokeStyle = ctx.fillStyle;
+ ctx.fillStyle = 'rgba(0, 0, 0, 0)';
+
+ // Define curve endpoint as semicircle.
+ var pi = Math.PI
+ var start_angle = arrowData.angle - pi/2;
+ var end_angle = arrowData.angle + pi/2;
+ ctx.beginPath();
+ ctx.arc(point.x, point.y, arrowData.length*0.4, start_angle, end_angle, false);
+ ctx.stroke()
+ }
+}
+
+/**
+ * Drawing methods for the inverted curve endpoint.
+ * @extends EndPoint
+ */
+class InvertedCurve {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ // Normalized points of closed path, in the order that they should be drawn.
+ // (0, 0) is the attachment point, and the point around which should be rotated
+ var point = {x:-0.3, y:0};
+ EndPoint.transform(point, arrowData);
+
+ // Update endpoint style for drawing transparent arc.
+ ctx.strokeStyle = ctx.fillStyle;
+ ctx.fillStyle = 'rgba(0, 0, 0, 0)';
+
+ // Define inverted curve endpoint as semicircle.
+ var pi = Math.PI
+ var start_angle = arrowData.angle + pi/2;
+ var end_angle = arrowData.angle + 3*pi/2;
+ ctx.beginPath();
+ ctx.arc(point.x, point.y, arrowData.length*0.4, start_angle, end_angle, false);
+ ctx.stroke()
+ }
+}
+
+/**
+ * Drawing methods for the trinagle endpoint.
+ * @extends EndPoint
+ */
+class Triangle {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ // Normalized points of closed path, in the order that they should be drawn.
+ // (0, 0) is the attachment point, and the point around which should be rotated
+ var points = [
+ { x:0.02, y:0},
+ { x:-1, y: 0.3},
+ { x:-1, y:-0.3},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the inverted trinagle endpoint.
+ * @extends EndPoint
+ */
+class InvertedTriangle {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ // Normalized points of closed path, in the order that they should be drawn.
+ // (0, 0) is the attachment point, and the point around which should be rotated
+ var points = [
+ { x:0, y:0.3},
+ { x:0, y: -0.3},
+ { x:-1, y:0},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the circle endpoint.
+ */
+class Circle {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ var point = {x:-0.4, y:0};
+
+ EndPoint.transform(point, arrowData);
+ ctx.circle(point.x, point.y, arrowData.length*0.4);
+ }
+}
+
+
+/**
+ * Drawing methods for the bar endpoint.
+ */
+class Bar {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+/*
+ var points = [
+ {x:0, y:0.5},
+ {x:0, y:-0.5}
+ ];
+
+ EndPoint.transform(points, arrowData);
+ ctx.beginPath();
+ ctx.moveTo(points[0].x, points[0].y);
+ ctx.lineTo(points[1].x, points[1].y);
+ ctx.stroke();
+*/
+
+ var points = [
+ {x:0, y:0.5},
+ {x:0, y:-0.5},
+ {x:-0.15, y:-0.5},
+ {x:-0.15, y:0.5},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the box endpoint.
+ */
+class Box {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ var points = [
+ {x:0, y:0.3},
+ {x:0, y:-0.3},
+ {x:-0.6, y:-0.3},
+ {x:-0.6, y:0.3},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the diamond endpoint.
+ */
+class Diamond {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ var points = [
+ {x:0, y:0},
+ {x:-0.5, y:-0.3},
+ {x:-1, y:0},
+ {x:-0.5, y:0.3},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the vee endpoint.
+ * @extends EndPoint
+ */
+class Vee {
+
+ /**
+ * Draw this shape at the end of a line.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ // Normalized points of closed path, in the order that they should be drawn.
+ // (0, 0) is the attachment point, and the point around which should be rotated
+ var points = [
+ { x:-1, y: 0.3},
+ { x:-0.5, y: 0},
+ { x:-1, y:-0.3},
+ { x:0, y: 0},
+ ];
+
+ EndPoint.transform(points, arrowData);
+ EndPoint.drawPath(ctx, points);
+ }
+}
+
+/**
+ * Drawing methods for the endpoints.
+ */
+class EndPoints {
+
+ /**
+ * Draw an endpoint
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowData} arrowData
+ * @static
+ */
+ static draw(ctx, arrowData) {
+ var type;
+ if (arrowData.type) {
+ type = arrowData.type.toLowerCase();
+ }
+
+ switch (type) {
+ case 'circle':
+ Circle.draw(ctx, arrowData);
+ break;
+ case 'box':
+ Box.draw(ctx, arrowData);
+ break;
+ case 'crow':
+ Crow.draw(ctx, arrowData);
+ break;
+ case 'curve':
+ Curve.draw(ctx, arrowData);
+ break;
+ case 'diamond':
+ Diamond.draw(ctx, arrowData);
+ break;
+ case 'inv_curve':
+ InvertedCurve.draw(ctx, arrowData);
+ break;
+ case 'triangle':
+ Triangle.draw(ctx, arrowData);
+ break;
+ case 'inv_triangle':
+ InvertedTriangle.draw(ctx, arrowData);
+ break;
+ case 'bar':
+ Bar.draw(ctx, arrowData);
+ break;
+ case 'vee':
+ Vee.draw(ctx, arrowData);
+ break;
+ case 'arrow': // fall-through
+ default:
+ Arrow.draw(ctx, arrowData);
+ }
+ }
+}
+
+export default EndPoints;
diff --git a/lib/network/modules/components/nodes/Cluster.js b/lib/network/modules/components/nodes/Cluster.js
new file mode 100644
index 0000000000..ffd7de1105
--- /dev/null
+++ b/lib/network/modules/components/nodes/Cluster.js
@@ -0,0 +1,85 @@
+import util from 'vis-util';
+import Node from "../Node";
+
+/**
+ * A Cluster is a special Node that allows a group of Nodes positioned closely together
+ * to be represented by a single Cluster Node.
+ *
+ * @extends Node
+ */
+class Cluster extends Node {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Array.}imagelist
+ * @param {Array} grouplist
+ * @param {Object} globalOptions
+ * @param {Object} defaultOptions Global default options for nodes
+ */
+ constructor(options, body, imagelist, grouplist, globalOptions, defaultOptions) {
+ super(options, body, imagelist, grouplist, globalOptions, defaultOptions);
+
+ this.isCluster = true;
+ this.containedNodes = {};
+ this.containedEdges = {};
+ }
+
+
+ /**
+ * Transfer child cluster data to current and disconnect the child cluster.
+ *
+ * Please consult the header comment in 'Clustering.js' for the fields set here.
+ *
+ * @param {string|number} childClusterId id of child cluster to open
+ */
+ _openChildCluster(childClusterId) {
+ let childCluster = this.body.nodes[childClusterId];
+ if (this.containedNodes[childClusterId] === undefined) {
+ throw new Error('node with id: ' + childClusterId + ' not in current cluster');
+ }
+ if (!childCluster.isCluster) {
+ throw new Error('node with id: ' + childClusterId + ' is not a cluster');
+ }
+
+ // Disconnect child cluster from current cluster
+ delete this.containedNodes[childClusterId];
+ util.forEach(childCluster.edges, (edge) => {
+ delete this.containedEdges[edge.id];
+ });
+
+ // Transfer nodes and edges
+ util.forEach(childCluster.containedNodes, (node, nodeId) => {
+ this.containedNodes[nodeId] = node;
+ });
+ childCluster.containedNodes = {};
+
+ util.forEach(childCluster.containedEdges, (edge, edgeId) => {
+ this.containedEdges[edgeId] = edge;
+ });
+ childCluster.containedEdges = {};
+
+ // Transfer edges within cluster edges which are clustered
+ util.forEach(childCluster.edges, (clusterEdge) => {
+ util.forEach(this.edges, (parentClusterEdge) => {
+ // Assumption: a clustered edge can only be present in a single clustering edge
+ // Not tested here
+ let index = parentClusterEdge.clusteringEdgeReplacingIds.indexOf(clusterEdge.id);
+ if (index === -1) return;
+
+ util.forEach(clusterEdge.clusteringEdgeReplacingIds, (srcId) => {
+ parentClusterEdge.clusteringEdgeReplacingIds.push(srcId);
+
+ // Maintain correct bookkeeping for transferred edge
+ this.body.edges[srcId].edgeReplacedById = parentClusterEdge.id;
+ });
+
+ // Remove cluster edge from parent cluster edge
+ parentClusterEdge.clusteringEdgeReplacingIds.splice(index, 1);
+ });
+ });
+ childCluster.edges = [];
+ }
+}
+
+
+export default Cluster;
diff --git a/lib/network/modules/components/nodes/shapes/Box.js b/lib/network/modules/components/nodes/shapes/Box.js
new file mode 100644
index 0000000000..40d4375cae
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Box.js
@@ -0,0 +1,91 @@
+'use strict';
+
+import NodeBase from '../util/NodeBase'
+
+/**
+ * A Box Node/Cluster shape.
+ *
+ * @extends NodeBase
+ */
+class Box extends NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor (options, body, labelModule) {
+ super(options,body,labelModule);
+ this._setMargins(labelModule);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ */
+ resize(ctx, selected = this.selected, hover = this.hover) {
+ if (this.needsRefresh(selected, hover)) {
+ var dimensions = this.getDimensionsFromLabel(ctx, selected, hover);
+
+ this.width = dimensions.width + this.margin.right + this.margin.left;
+ this.height = dimensions.height + this.margin.top + this.margin.bottom;
+ this.radius = this.width / 2;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.resize(ctx, selected, hover);
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+
+ this.initContextForDraw(ctx, values);
+ ctx.roundRect(this.left, this.top, this.width, this.height, values.borderRadius);
+ this.performFill(ctx, values);
+
+ this.updateBoundingBox(x, y, ctx, selected, hover);
+ this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,
+ this.top + this.textSize.height / 2 + this.margin.top, selected, hover);
+ }
+
+ /**
+ *
+ * @param {number} x width
+ * @param {number} y height
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ */
+ updateBoundingBox(x, y, ctx, selected, hover) {
+ this._updateBoundingBox(x, y, ctx, selected, hover);
+
+ let borderRadius = this.options.shapeProperties.borderRadius; // only effective for box
+ this._addBoundingBoxMargin(borderRadius);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ this.resize(ctx);
+ let borderWidth = this.options.borderWidth;
+
+ return Math.min(
+ Math.abs((this.width) / 2 / Math.cos(angle)),
+ Math.abs((this.height) / 2 / Math.sin(angle))) + borderWidth;
+ }
+}
+
+export default Box;
diff --git a/lib/network/modules/components/nodes/shapes/Circle.js b/lib/network/modules/components/nodes/shapes/Circle.js
new file mode 100644
index 0000000000..643b57e421
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Circle.js
@@ -0,0 +1,86 @@
+'use strict';
+
+import CircleImageBase from '../util/CircleImageBase'
+
+/**
+ * A Circle Node/Cluster shape.
+ *
+ * @extends CircleImageBase
+ */
+class Circle extends CircleImageBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ this._setMargins(labelModule);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ */
+ resize(ctx, selected = this.selected, hover = this.hover) {
+ if (this.needsRefresh(selected, hover)) {
+ var dimensions = this.getDimensionsFromLabel(ctx, selected, hover);
+
+ var diameter = Math.max(dimensions.width + this.margin.right + this.margin.left,
+ dimensions.height + this.margin.top + this.margin.bottom);
+
+ this.options.size = diameter / 2; // NOTE: this size field only set here, not in Ellipse, Database, Box
+ this.width = diameter;
+ this.height = diameter;
+ this.radius = this.width / 2;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.resize(ctx, selected, hover);
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+
+ this._drawRawCircle(ctx, x, y, values);
+
+ this.updateBoundingBox(x,y);
+ this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,
+ y, selected, hover);
+ }
+
+ /**
+ *
+ * @param {number} x width
+ * @param {number} y height
+ */
+ updateBoundingBox(x, y) {
+ this.boundingBox.top = y - this.options.size;
+ this.boundingBox.left = x - this.options.size;
+ this.boundingBox.right = x + this.options.size;
+ this.boundingBox.bottom = y + this.options.size;
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle - Unused
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) { // eslint-disable-line no-unused-vars
+ this.resize(ctx);
+ return this.width * 0.5;
+ }
+}
+
+export default Circle;
diff --git a/lib/network/modules/components/nodes/shapes/CircularImage.js b/lib/network/modules/components/nodes/shapes/CircularImage.js
new file mode 100644
index 0000000000..04b719ca04
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/CircularImage.js
@@ -0,0 +1,112 @@
+'use strict';
+
+import CircleImageBase from '../util/CircleImageBase'
+
+/**
+ * A CircularImage Node/Cluster shape.
+ *
+ * @extends CircleImageBase
+ */
+class CircularImage extends CircleImageBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ * @param {Image} imageObj
+ * @param {Image} imageObjAlt
+ */
+ constructor (options, body, labelModule, imageObj, imageObjAlt) {
+ super(options, body, labelModule);
+
+ this.setImages(imageObj, imageObjAlt);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ */
+ resize(ctx, selected = this.selected, hover = this.hover) {
+ var imageAbsent = (this.imageObj.src === undefined) ||
+ (this.imageObj.width === undefined) ||
+ (this.imageObj.height === undefined);
+
+ if (imageAbsent) {
+ var diameter = this.options.size * 2;
+ this.width = diameter;
+ this.height = diameter;
+ this.radius = 0.5*this.width;
+ return;
+ }
+
+ // At this point, an image is present, i.e. this.imageObj is valid.
+ if (this.needsRefresh(selected, hover)) {
+ this._resizeImage();
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.switchImages(selected);
+ this.resize();
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+
+ // draw the background circle. IMPORTANT: the stroke in this method is used by the clip method below.
+ this._drawRawCircle(ctx, x, y, values);
+
+ // now we draw in the circle, we save so we can revert the clip operation after drawing.
+ ctx.save();
+ // clip is used to use the stroke in drawRawCircle as an area that we can draw in.
+ ctx.clip();
+ // draw the image
+ this._drawImageAtPosition(ctx, values);
+ // restore so we can again draw on the full canvas
+ ctx.restore();
+
+ this._drawImageLabel(ctx, x, y, selected, hover);
+
+ this.updateBoundingBox(x,y);
+ }
+
+ // TODO: compare with Circle.updateBoundingBox(), consolidate? More stuff is happening here
+ /**
+ *
+ * @param {number} x width
+ * @param {number} y height
+ */
+ updateBoundingBox(x,y) {
+ this.boundingBox.top = y - this.options.size;
+ this.boundingBox.left = x - this.options.size;
+ this.boundingBox.right = x + this.options.size;
+ this.boundingBox.bottom = y + this.options.size;
+
+ // TODO: compare with Image.updateBoundingBox(), consolidate?
+ this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);
+ this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);
+ this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelOffset);
+ }
+
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle - Unused
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) { // eslint-disable-line no-unused-vars
+ this.resize(ctx);
+ return this.width * 0.5;
+ }
+}
+
+export default CircularImage;
diff --git a/lib/network/modules/components/nodes/shapes/Database.js b/lib/network/modules/components/nodes/shapes/Database.js
new file mode 100644
index 0000000000..b25bc3f347
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Database.js
@@ -0,0 +1,71 @@
+'use strict';
+
+import NodeBase from '../util/NodeBase'
+
+/**
+ * A Database Node/Cluster shape.
+ *
+ * @extends NodeBase
+ */
+class Database extends NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor (options, body, labelModule) {
+ super(options, body, labelModule);
+ this._setMargins(labelModule);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ */
+ resize(ctx, selected, hover) {
+ if (this.needsRefresh(selected, hover)) {
+ var dimensions = this.getDimensionsFromLabel(ctx, selected, hover);
+ var size = dimensions.width + this.margin.right + this.margin.left;
+
+ this.width = size;
+ this.height = size;
+ this.radius = this.width / 2;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.resize(ctx, selected, hover);
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+
+ this.initContextForDraw(ctx, values);
+ ctx.database(x - this.width / 2, y - this.height / 2, this.width, this.height);
+ this.performFill(ctx, values);
+
+ this.updateBoundingBox(x, y, ctx, selected, hover);
+ this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,
+ this.top + this.textSize.height / 2 + this.margin.top, selected, hover);
+ }
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx, angle);
+ }
+}
+
+export default Database;
diff --git a/lib/network/modules/components/nodes/shapes/Diamond.js b/lib/network/modules/components/nodes/shapes/Diamond.js
new file mode 100644
index 0000000000..832afc7016
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Diamond.js
@@ -0,0 +1,44 @@
+'use strict';
+
+import ShapeBase from '../util/ShapeBase'
+
+/**
+ * A Diamond Node/Cluster shape.
+ *
+ * @extends ShapeBase
+ */
+class Diamond extends ShapeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this._drawShape(ctx, 'diamond', 4, x, y, selected, hover, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Diamond;
diff --git a/lib/network/modules/components/nodes/shapes/Dot.js b/lib/network/modules/components/nodes/shapes/Dot.js
new file mode 100644
index 0000000000..1cde7813ee
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Dot.js
@@ -0,0 +1,45 @@
+'use strict';
+
+import ShapeBase from '../util/ShapeBase'
+
+/**
+ * A Dot Node/Cluster shape.
+ *
+ * @extends ShapeBase
+ */
+class Dot extends ShapeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this._drawShape(ctx, 'circle', 2, x, y, selected, hover, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) { // eslint-disable-line no-unused-vars
+ this.resize(ctx);
+ return this.options.size;
+ }
+}
+
+export default Dot;
diff --git a/lib/network/modules/components/nodes/shapes/Ellipse.js b/lib/network/modules/components/nodes/shapes/Ellipse.js
new file mode 100644
index 0000000000..feb934f7b1
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Ellipse.js
@@ -0,0 +1,74 @@
+'use strict';
+
+import NodeBase from '../util/NodeBase'
+
+/**
+ * Am Ellipse Node/Cluster shape.
+ *
+ * @extends NodeBase
+ */
+class Ellipse extends NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ */
+ resize(ctx, selected = this.selected, hover = this.hover) {
+ if (this.needsRefresh(selected, hover)) {
+ var dimensions = this.getDimensionsFromLabel(ctx, selected, hover);
+
+ this.height = dimensions.height * 2;
+ this.width = dimensions.width + dimensions.height;
+ this.radius = 0.5*this.width;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.resize(ctx, selected, hover);
+ this.left = x - this.width * 0.5;
+ this.top = y - this.height * 0.5;
+
+ this.initContextForDraw(ctx, values);
+ ctx.ellipse_vis(this.left, this.top, this.width, this.height);
+ this.performFill(ctx, values);
+
+ this.updateBoundingBox(x, y, ctx, selected, hover);
+ this.labelModule.draw(ctx, x, y, selected, hover);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ this.resize(ctx);
+ var a = this.width * 0.5;
+ var b = this.height * 0.5;
+ var w = (Math.sin(angle) * a);
+ var h = (Math.cos(angle) * b);
+ return a * b / Math.sqrt(w * w + h * h);
+ }
+}
+
+export default Ellipse;
diff --git a/lib/network/modules/components/nodes/shapes/Hexagon.js b/lib/network/modules/components/nodes/shapes/Hexagon.js
new file mode 100644
index 0000000000..e7359f4f10
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Hexagon.js
@@ -0,0 +1,44 @@
+'use strict';
+
+import ShapeBase from '../util/ShapeBase'
+
+/**
+ * A Hexagon Node/Cluster shape.
+ *
+ * @extends ShapeBase
+ */
+class Hexagon extends ShapeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this._drawShape(ctx, 'hexagon', 4, x, y, selected, hover, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Hexagon;
diff --git a/lib/network/modules/components/nodes/shapes/Icon.js b/lib/network/modules/components/nodes/shapes/Icon.js
new file mode 100644
index 0000000000..ae74817a23
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Icon.js
@@ -0,0 +1,127 @@
+'use strict';
+
+import NodeBase from '../util/NodeBase'
+
+/**
+ * An icon replacement for the default Node shape.
+ *
+ * @extends NodeBase
+ */
+class Icon extends NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ this._setMargins(labelModule);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx - Unused.
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ */
+ resize(ctx, selected, hover) {
+ if (this.needsRefresh(selected, hover)) {
+ this.iconSize = {
+ width: Number(this.options.icon.size),
+ height: Number(this.options.icon.size)
+ };
+ this.width = this.iconSize.width + this.margin.right + this.margin.left;
+ this.height = this.iconSize.height + this.margin.top + this.margin.bottom;
+ this.radius = 0.5*this.width;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.resize(ctx, selected, hover);
+ this.options.icon.size = this.options.icon.size || 50;
+
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+ this._icon(ctx, x, y, selected, hover, values);
+
+ if (this.options.label !== undefined) {
+ var iconTextSpacing = 5;
+ this.labelModule.draw(ctx, this.left + this.iconSize.width / 2 + this.margin.left,
+ y + this.height / 2 + iconTextSpacing, selected);
+ }
+
+ this.updateBoundingBox(x, y)
+ }
+
+ /**
+ *
+ * @param {number} x
+ * @param {number} y
+ */
+ updateBoundingBox(x, y) {
+ this.boundingBox.top = y - this.options.icon.size * 0.5;
+ this.boundingBox.left = x - this.options.icon.size * 0.5;
+ this.boundingBox.right = x + this.options.icon.size * 0.5;
+ this.boundingBox.bottom = y + this.options.icon.size * 0.5;
+
+ if (this.options.label !== undefined && this.labelModule.size.width > 0) {
+ var iconTextSpacing = 5;
+ this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);
+ this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);
+ this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelModule.size.height + iconTextSpacing);
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover - Unused
+ * @param {ArrowOptions} values
+ */
+ _icon(ctx, x, y, selected, hover, values) {
+ let iconSize = Number(this.options.icon.size);
+
+ if (this.options.icon.code !== undefined) {
+ ctx.font = (selected ? "bold " : "") + iconSize + "px " + this.options.icon.face;
+
+ // draw icon
+ ctx.fillStyle = this.options.icon.color || "black";
+ ctx.textAlign = "center";
+ ctx.textBaseline = "middle";
+
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+ ctx.fillText(this.options.icon.code, x, y);
+
+ // disable shadows for other elements.
+ this.disableShadow(ctx, values);
+ } else {
+ console.error('When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.')
+ }
+
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Icon;
diff --git a/lib/network/modules/components/nodes/shapes/Image.js b/lib/network/modules/components/nodes/shapes/Image.js
new file mode 100644
index 0000000000..1aa2a9580d
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Image.js
@@ -0,0 +1,123 @@
+'use strict';
+
+import CircleImageBase from '../util/CircleImageBase'
+
+
+/**
+ * An image-based replacement for the default Node shape.
+ *
+ * @extends CircleImageBase
+ */
+class Image extends CircleImageBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ * @param {Image} imageObj
+ * @param {Image} imageObjAlt
+ */
+ constructor (options, body, labelModule, imageObj, imageObjAlt) {
+ super(options, body, labelModule);
+
+ this.setImages(imageObj, imageObjAlt);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx - Unused.
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ */
+ resize(ctx, selected = this.selected, hover = this.hover) {
+ var imageAbsent = (this.imageObj.src === undefined) ||
+ (this.imageObj.width === undefined) ||
+ (this.imageObj.height === undefined);
+
+ if (imageAbsent) {
+ var side = this.options.size * 2;
+ this.width = side;
+ this.height = side;
+ return;
+ }
+
+ if (this.needsRefresh(selected, hover)) {
+ this._resizeImage();
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.switchImages(selected);
+ this.resize();
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+
+ if (this.options.shapeProperties.useBorderWithImage === true) {
+ var neutralborderWidth = this.options.borderWidth;
+ var selectionLineWidth = this.options.borderWidthSelected || 2 * this.options.borderWidth;
+ var borderWidth = (selected ? selectionLineWidth : neutralborderWidth) / this.body.view.scale;
+ ctx.lineWidth = Math.min(this.width, borderWidth);
+
+ ctx.beginPath();
+
+ // setup the line properties.
+ ctx.strokeStyle = selected ? this.options.color.highlight.border : hover ? this.options.color.hover.border : this.options.color.border;
+
+ // set a fillstyle
+ ctx.fillStyle = selected ? this.options.color.highlight.background : hover ? this.options.color.hover.background : this.options.color.background;
+
+ // draw a rectangle to form the border around. This rectangle is filled so the opacity of a picture (in future vis releases?) can be used to tint the image
+ ctx.rect(this.left - 0.5 * ctx.lineWidth,
+ this.top - 0.5 * ctx.lineWidth,
+ this.width + ctx.lineWidth,
+ this.height + ctx.lineWidth);
+ ctx.fill();
+
+ this.performStroke(ctx, values);
+
+ ctx.closePath();
+ }
+
+ this._drawImageAtPosition(ctx, values);
+
+ this._drawImageLabel(ctx, x, y, selected, hover);
+
+ this.updateBoundingBox(x,y);
+ }
+
+ /**
+ *
+ * @param {number} x
+ * @param {number} y
+ */
+ updateBoundingBox(x, y) {
+ this.resize();
+ this._updateBoundingBox(x, y);
+
+ if (this.options.label !== undefined && this.labelModule.size.width > 0) {
+ this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);
+ this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);
+ this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelOffset);
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Image;
diff --git a/lib/network/modules/components/nodes/shapes/Square.js b/lib/network/modules/components/nodes/shapes/Square.js
new file mode 100644
index 0000000000..b61b7e5b8a
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Square.js
@@ -0,0 +1,44 @@
+'use strict';
+
+import ShapeBase from '../util/ShapeBase'
+
+/**
+ * A Square Node/Cluster shape.
+ *
+ * @extends ShapeBase
+ */
+class Square extends ShapeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this._drawShape(ctx, 'square', 2, x, y, selected, hover, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Square;
diff --git a/lib/network/modules/components/nodes/shapes/Star.js b/lib/network/modules/components/nodes/shapes/Star.js
new file mode 100644
index 0000000000..d9bf4fb33b
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Star.js
@@ -0,0 +1,44 @@
+'use strict';
+
+import ShapeBase from '../util/ShapeBase'
+
+/**
+ * A Star Node/Cluster shape.
+ *
+ * @extends ShapeBase
+ */
+class Star extends ShapeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this._drawShape(ctx, 'star', 4, x, y, selected, hover, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Star;
diff --git a/lib/network/modules/components/nodes/shapes/Text.js b/lib/network/modules/components/nodes/shapes/Text.js
new file mode 100644
index 0000000000..824bfcf323
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Text.js
@@ -0,0 +1,72 @@
+'use strict';
+
+import NodeBase from '../util/NodeBase'
+
+/**
+ * A text-based replacement for the default Node shape.
+ *
+ * @extends NodeBase
+ */
+class Text extends NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ this._setMargins(labelModule);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ */
+ resize(ctx, selected, hover) {
+ if (this.needsRefresh(selected, hover)) {
+ this.textSize = this.labelModule.getTextSize(ctx, selected, hover);
+ this.width = this.textSize.width + this.margin.right + this.margin.left;
+ this.height = this.textSize.height + this.margin.top + this.margin.bottom;
+ this.radius = 0.5*this.width;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this.resize(ctx, selected, hover);
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+ this.labelModule.draw(ctx, this.left + this.textSize.width / 2 + this.margin.left,
+ this.top + this.textSize.height / 2 + this.margin.top, selected, hover);
+
+ // disable shadows for other elements.
+ this.disableShadow(ctx, values);
+
+ this.updateBoundingBox(x, y, ctx, selected, hover);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Text;
diff --git a/lib/network/modules/components/nodes/shapes/Triangle.js b/lib/network/modules/components/nodes/shapes/Triangle.js
new file mode 100644
index 0000000000..9c67b0da04
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/Triangle.js
@@ -0,0 +1,44 @@
+'use strict';
+
+import ShapeBase from '../util/ShapeBase'
+
+/**
+ * A Triangle Node/Cluster shape.
+ *
+ * @extends ShapeBase
+ */
+class Triangle extends ShapeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x
+ * @param {number} y
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this._drawShape(ctx, 'triangle', 3, x, y, selected, hover, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default Triangle;
diff --git a/lib/network/modules/components/nodes/shapes/TriangleDown.js b/lib/network/modules/components/nodes/shapes/TriangleDown.js
new file mode 100644
index 0000000000..f87c3d075f
--- /dev/null
+++ b/lib/network/modules/components/nodes/shapes/TriangleDown.js
@@ -0,0 +1,44 @@
+'use strict';
+
+import ShapeBase from '../util/ShapeBase'
+
+/**
+ * A downward facing Triangle Node/Cluster shape.
+ *
+ * @extends ShapeBase
+ */
+class TriangleDown extends ShapeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x
+ * @param {number} y
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ */
+ draw(ctx, x, y, selected, hover, values) {
+ this._drawShape(ctx, 'triangleDown', 3, x, y, selected, hover, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ */
+ distanceToBorder(ctx, angle) {
+ return this._distanceToBorder(ctx,angle);
+ }
+}
+
+export default TriangleDown;
diff --git a/lib/network/modules/components/nodes/util/CircleImageBase.js b/lib/network/modules/components/nodes/util/CircleImageBase.js
new file mode 100644
index 0000000000..b70c419a85
--- /dev/null
+++ b/lib/network/modules/components/nodes/util/CircleImageBase.js
@@ -0,0 +1,192 @@
+import NodeBase from './NodeBase';
+
+/**
+ * NOTE: This is a bad base class
+ *
+ * Child classes are:
+ *
+ * Image - uses *only* image methods
+ * Circle - uses *only* _drawRawCircle
+ * CircleImage - uses all
+ *
+ * TODO: Refactor, move _drawRawCircle to different module, derive Circle from NodeBase
+ * Rename this to ImageBase
+ * Consolidate common code in Image and CircleImage to base class
+ *
+ * @extends NodeBase
+ */
+class CircleImageBase extends NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule);
+ this.labelOffset = 0;
+ this.selected = false;
+ }
+
+ /**
+ *
+ * @param {Object} options
+ * @param {Object} [imageObj]
+ * @param {Object} [imageObjAlt]
+ */
+ setOptions(options, imageObj, imageObjAlt) {
+ this.options = options;
+
+ if (!(imageObj === undefined && imageObjAlt === undefined)) {
+ this.setImages(imageObj, imageObjAlt);
+ }
+ }
+
+
+ /**
+ * Set the images for this node.
+ *
+ * The images can be updated after the initial setting of options;
+ * therefore, this method needs to be reentrant.
+ *
+ * For correct working in error cases, it is necessary to properly set
+ * field 'nodes.brokenImage' in the options.
+ *
+ * @param {Image} imageObj required; main image to show for this node
+ * @param {Image|undefined} imageObjAlt optional; image to show when node is selected
+ */
+ setImages(imageObj, imageObjAlt) {
+ if (imageObjAlt && this.selected) {
+ this.imageObj = imageObjAlt;
+ this.imageObjAlt = imageObj;
+ } else {
+ this.imageObj = imageObj;
+ this.imageObjAlt = imageObjAlt;
+ }
+ }
+
+ /**
+ * Set selection and switch between the base and the selected image.
+ *
+ * Do the switch only if imageObjAlt exists.
+ *
+ * @param {boolean} selected value of new selected state for current node
+ */
+ switchImages(selected) {
+ var selection_changed = ((selected && !this.selected) || (!selected && this.selected));
+ this.selected = selected; // Remember new selection
+
+ if (this.imageObjAlt !== undefined && selection_changed) {
+ let imageTmp = this.imageObj;
+ this.imageObj = this.imageObjAlt;
+ this.imageObjAlt = imageTmp;
+ }
+ }
+
+ /**
+ * Adjust the node dimensions for a loaded image.
+ *
+ * Pre: this.imageObj is valid
+ */
+ _resizeImage() {
+ var width, height;
+
+ if (this.options.shapeProperties.useImageSize === false) {
+ // Use the size property
+ var ratio_width = 1;
+ var ratio_height = 1;
+
+ // Only calculate the proper ratio if both width and height not zero
+ if (this.imageObj.width && this.imageObj.height) {
+ if (this.imageObj.width > this.imageObj.height) {
+ ratio_width = this.imageObj.width / this.imageObj.height;
+ }
+ else {
+ ratio_height = this.imageObj.height / this.imageObj.width;
+ }
+ }
+
+ width = this.options.size * 2 * ratio_width;
+ height = this.options.size * 2 * ratio_height;
+ }
+ else {
+ // Use the image size
+ width = this.imageObj.width;
+ height = this.imageObj.height;
+ }
+
+ this.width = width;
+ this.height = height;
+ this.radius = 0.5 * this.width;
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {ArrowOptions} values
+ * @private
+ */
+ _drawRawCircle(ctx, x, y, values) {
+ this.initContextForDraw(ctx, values);
+ ctx.circle(x, y, values.size);
+ this.performFill(ctx, values);
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ * @private
+ */
+ _drawImageAtPosition(ctx, values) {
+ if (this.imageObj.width != 0) {
+ // draw the image
+ ctx.globalAlpha = 1.0;
+
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+
+ let factor = 1;
+ if (this.options.shapeProperties.interpolation === true) {
+ factor = (this.imageObj.width / this.width) / this.body.view.scale;
+ }
+
+ this.imageObj.drawImageAtPosition(ctx, factor, this.left, this.top, this.width, this.height);
+
+ // disable shadows for other elements.
+ this.disableShadow(ctx, values);
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x width
+ * @param {number} y height
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @private
+ */
+ _drawImageLabel(ctx, x, y, selected, hover) {
+ var yLabel;
+ var offset = 0;
+
+ if (this.height !== undefined) {
+ offset = this.height * 0.5;
+ var labelDimensions = this.labelModule.getTextSize(ctx, selected, hover);
+ if (labelDimensions.lineCount >= 1) {
+ offset += labelDimensions.height / 2;
+ }
+ }
+
+ yLabel = y + offset;
+
+ if (this.options.label) {
+ this.labelOffset = offset;
+ }
+ this.labelModule.draw(ctx, x, yLabel, selected, hover, 'hanging');
+ }
+}
+
+export default CircleImageBase;
diff --git a/lib/network/modules/components/nodes/util/NodeBase.js b/lib/network/modules/components/nodes/util/NodeBase.js
new file mode 100644
index 0000000000..4217c4f359
--- /dev/null
+++ b/lib/network/modules/components/nodes/util/NodeBase.js
@@ -0,0 +1,295 @@
+/**
+ * The Base class for all Nodes.
+ */
+class NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ this.body = body;
+ this.labelModule = labelModule;
+ this.setOptions(options);
+ this.top = undefined;
+ this.left = undefined;
+ this.height = undefined;
+ this.width = undefined;
+ this.radius = undefined;
+ this.margin = undefined;
+ this.refreshNeeded = true;
+ this.boundingBox = {top: 0, left: 0, right: 0, bottom: 0};
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ }
+
+ /**
+ *
+ * @param {Label} labelModule
+ * @private
+ */
+ _setMargins(labelModule) {
+ this.margin = {};
+ if (this.options.margin) {
+ if (typeof this.options.margin == 'object') {
+ this.margin.top = this.options.margin.top;
+ this.margin.right = this.options.margin.right;
+ this.margin.bottom = this.options.margin.bottom;
+ this.margin.left = this.options.margin.left;
+ } else {
+ this.margin.top = this.options.margin;
+ this.margin.right = this.options.margin;
+ this.margin.bottom = this.options.margin;
+ this.margin.left = this.options.margin;
+ }
+ }
+ labelModule.adjustSizes(this.margin)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} angle
+ * @returns {number}
+ * @private
+ */
+ _distanceToBorder(ctx,angle) {
+ var borderWidth = this.options.borderWidth;
+ this.resize(ctx);
+ return Math.min(
+ Math.abs(this.width / 2 / Math.cos(angle)),
+ Math.abs(this.height / 2 / Math.sin(angle))) + borderWidth;
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ enableShadow(ctx, values) {
+ if (values.shadow) {
+ ctx.shadowColor = values.shadowColor;
+ ctx.shadowBlur = values.shadowSize;
+ ctx.shadowOffsetX = values.shadowX;
+ ctx.shadowOffsetY = values.shadowY;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ disableShadow(ctx, values) {
+ if (values.shadow) {
+ ctx.shadowColor = 'rgba(0,0,0,0)';
+ ctx.shadowBlur = 0;
+ ctx.shadowOffsetX = 0;
+ ctx.shadowOffsetY = 0;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ enableBorderDashes(ctx, values) {
+ if (values.borderDashes !== false) {
+ if (ctx.setLineDash !== undefined) {
+ let dashes = values.borderDashes;
+ if (dashes === true) {
+ dashes = [5,15]
+ }
+ ctx.setLineDash(dashes);
+ }
+ else {
+ console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used.");
+ this.options.shapeProperties.borderDashes = false;
+ values.borderDashes = false;
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ disableBorderDashes(ctx, values) {
+ if (values.borderDashes !== false) {
+ if (ctx.setLineDash !== undefined) {
+ ctx.setLineDash([0]);
+ }
+ else {
+ console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used.");
+ this.options.shapeProperties.borderDashes = false;
+ values.borderDashes = false;
+ }
+ }
+ }
+
+ /**
+ * Determine if the shape of a node needs to be recalculated.
+ *
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @returns {boolean}
+ * @protected
+ */
+ needsRefresh(selected, hover) {
+ if (this.refreshNeeded === true) {
+ // This is probably not the best location to reset this member.
+ // However, in the current logic, it is the most convenient one.
+ this.refreshNeeded = false;
+ return true;
+ }
+
+ return (this.width === undefined) || (this.labelModule.differentState(selected, hover));
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ initContextForDraw(ctx, values) {
+ var borderWidth = values.borderWidth / this.body.view.scale;
+
+ ctx.lineWidth = Math.min(this.width, borderWidth);
+ ctx.strokeStyle = values.borderColor;
+ ctx.fillStyle = values.color;
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ performStroke(ctx, values) {
+ var borderWidth = values.borderWidth / this.body.view.scale;
+
+ //draw dashed border if enabled, save and restore is required for firefox not to crash on unix.
+ ctx.save();
+ // if borders are zero width, they will be drawn with width 1 by default. This prevents that
+ if (borderWidth > 0) {
+ this.enableBorderDashes(ctx, values);
+ //draw the border
+ ctx.stroke();
+ //disable dashed border for other elements
+ this.disableBorderDashes(ctx, values);
+ }
+ ctx.restore();
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {ArrowOptions} values
+ */
+ performFill(ctx, values) {
+ // draw shadow if enabled
+ this.enableShadow(ctx, values);
+ // draw the background
+ ctx.fill();
+ // disable shadows for other elements.
+ this.disableShadow(ctx, values);
+
+ this.performStroke(ctx, values);
+ }
+
+
+ /**
+ *
+ * @param {number} margin
+ * @private
+ */
+ _addBoundingBoxMargin(margin) {
+ this.boundingBox.left -= margin;
+ this.boundingBox.top -= margin;
+ this.boundingBox.bottom += margin;
+ this.boundingBox.right += margin;
+ }
+
+
+ /**
+ * Actual implementation of this method call.
+ *
+ * Doing it like this makes it easier to override
+ * in the child classes.
+ *
+ * @param {number} x width
+ * @param {number} y height
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @private
+ */
+ _updateBoundingBox(x, y, ctx, selected, hover) {
+ if (ctx !== undefined) {
+ this.resize(ctx, selected, hover);
+ }
+
+ this.left = x - this.width / 2;
+ this.top = y - this.height/ 2;
+
+ this.boundingBox.left = this.left;
+ this.boundingBox.top = this.top;
+ this.boundingBox.bottom = this.top + this.height;
+ this.boundingBox.right = this.left + this.width;
+ }
+
+
+ /**
+ * Default implementation of this method call.
+ * This acts as a stub which can be overridden.
+ *
+ * @param {number} x width
+ * @param {number} y height
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ */
+ updateBoundingBox(x, y, ctx, selected, hover) {
+ this._updateBoundingBox(x, y, ctx, selected, hover);
+ }
+
+
+ /**
+ * Determine the dimensions to use for nodes with an internal label
+ *
+ * Currently, these are: Circle, Ellipse, Database, Box
+ * The other nodes have external labels, and will not call this method
+ *
+ * If there is no label, decent default values are supplied.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ * @returns {{width:number, height:number}}
+ */
+ getDimensionsFromLabel(ctx, selected, hover) {
+ // NOTE: previously 'textSize' was not put in 'this' for Ellipse
+ // TODO: examine the consequences.
+ this.textSize = this.labelModule.getTextSize(ctx, selected, hover);
+ var width = this.textSize.width;
+ var height = this.textSize.height;
+
+ const DEFAULT_SIZE = 14;
+ if (width === 0) {
+ // This happens when there is no label text set
+ width = DEFAULT_SIZE; // use a decent default
+ height = DEFAULT_SIZE; // if width zero, then height also always zero
+ }
+
+ return {width:width, height:height};
+ }
+}
+
+export default NodeBase;
diff --git a/lib/network/modules/components/nodes/util/ShapeBase.js b/lib/network/modules/components/nodes/util/ShapeBase.js
new file mode 100644
index 0000000000..b72dadb23d
--- /dev/null
+++ b/lib/network/modules/components/nodes/util/ShapeBase.js
@@ -0,0 +1,97 @@
+import NodeBase from '../util/NodeBase'
+
+/**
+ * Base class for constructing Node/Cluster Shapes.
+ *
+ * @extends NodeBase
+ */
+class ShapeBase extends NodeBase {
+ /**
+ * @param {Object} options
+ * @param {Object} body
+ * @param {Label} labelModule
+ */
+ constructor(options, body, labelModule) {
+ super(options, body, labelModule)
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} [selected]
+ * @param {boolean} [hover]
+ * @param {Object} [values={size: this.options.size}]
+ */
+ resize(ctx, selected = this.selected, hover = this.hover, values = { size: this.options.size }) {
+ if (this.needsRefresh(selected, hover)) {
+ this.labelModule.getTextSize(ctx, selected, hover);
+ var size = 2 * values.size;
+ this.width = size;
+ this.height = size;
+ this.radius = 0.5*this.width;
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {string} shape
+ * @param {number} sizeMultiplier - Unused! TODO: Remove next major release
+ * @param {number} x
+ * @param {number} y
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {ArrowOptions} values
+ * @private
+ */
+ _drawShape(ctx, shape, sizeMultiplier, x, y, selected, hover, values) {
+ this.resize(ctx, selected, hover, values);
+ this.left = x - this.width / 2;
+ this.top = y - this.height / 2;
+
+ this.initContextForDraw(ctx, values);
+ ctx[shape](x, y, values.size);
+ this.performFill(ctx, values);
+
+ if (this.options.icon !== undefined) {
+ if (this.options.icon.code !== undefined) {
+ ctx.font = (selected ? "bold " : "")
+ + (this.height / 2) + "px "
+ + (this.options.icon.face || 'FontAwesome');
+ ctx.fillStyle = this.options.icon.color || "black";
+ ctx.textAlign = "center";
+ ctx.textBaseline = "middle";
+ ctx.fillText(this.options.icon.code, x, y);
+ }
+ }
+
+ if (this.options.label !== undefined) {
+ // Need to call following here in order to ensure value for `this.labelModule.size.height`
+ this.labelModule.calculateLabelSize(ctx, selected, hover, x, y, 'hanging')
+ let yLabel = y + 0.5 * this.height + 0.5 * this.labelModule.size.height;
+ this.labelModule.draw(ctx, x, yLabel, selected, hover, 'hanging');
+ }
+
+ this.updateBoundingBox(x,y);
+ }
+
+ /**
+ *
+ * @param {number} x
+ * @param {number} y
+ */
+ updateBoundingBox(x, y) {
+ this.boundingBox.top = y - this.options.size;
+ this.boundingBox.left = x - this.options.size;
+ this.boundingBox.right = x + this.options.size;
+ this.boundingBox.bottom = y + this.options.size;
+
+ if (this.options.label !== undefined && this.labelModule.size.width > 0) {
+ this.boundingBox.left = Math.min(this.boundingBox.left, this.labelModule.size.left);
+ this.boundingBox.right = Math.max(this.boundingBox.right, this.labelModule.size.left + this.labelModule.size.width);
+ this.boundingBox.bottom = Math.max(this.boundingBox.bottom, this.boundingBox.bottom + this.labelModule.size.height);
+ }
+ }
+}
+
+export default ShapeBase;
diff --git a/lib/network/modules/components/physics/BarnesHutSolver.js b/lib/network/modules/components/physics/BarnesHutSolver.js
new file mode 100644
index 0000000000..f1508fcd69
--- /dev/null
+++ b/lib/network/modules/components/physics/BarnesHutSolver.js
@@ -0,0 +1,494 @@
+/**
+ * Barnes Hut Solver
+ */
+class BarnesHutSolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ this.body = body;
+ this.physicsBody = physicsBody;
+ this.barnesHutTree;
+ this.setOptions(options);
+ this.randomSeed = 5;
+
+ // debug: show grid
+ // this.body.emitter.on("afterDrawing", (ctx) => {this._debug(ctx,'#ff0000')})
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ this.thetaInversed = 1 / this.options.theta;
+
+ // if 1 then min distance = 0.5, if 0.5 then min distance = 0.5 + 0.5*node.shape.radius
+ this.overlapAvoidanceFactor = 1 - Math.max(0, Math.min(1, this.options.avoidOverlap));
+ }
+
+ /**
+ *
+ * @returns {number} random integer
+ */
+ seededRandom() {
+ var x = Math.sin(this.randomSeed++) * 10000;
+ return x - Math.floor(x);
+ }
+
+
+ /**
+ * This function calculates the forces the nodes apply on each other based on a gravitational model.
+ * The Barnes Hut method is used to speed up this N-body simulation.
+ *
+ * @private
+ */
+ solve() {
+ if (this.options.gravitationalConstant !== 0 && this.physicsBody.physicsNodeIndices.length > 0) {
+ let node;
+ let nodes = this.body.nodes;
+ let nodeIndices = this.physicsBody.physicsNodeIndices;
+ let nodeCount = nodeIndices.length;
+
+ // create the tree
+ let barnesHutTree = this._formBarnesHutTree(nodes, nodeIndices);
+
+ // for debugging
+ this.barnesHutTree = barnesHutTree;
+
+ // place the nodes one by one recursively
+ for (let i = 0; i < nodeCount; i++) {
+ node = nodes[nodeIndices[i]];
+ if (node.options.mass > 0) {
+ // starting with root is irrelevant, it never passes the BarnesHutSolver condition
+ this._getForceContributions(barnesHutTree.root, node);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * @param {Object} parentBranch
+ * @param {Node} node
+ * @private
+ */
+ _getForceContributions(parentBranch, node) {
+ this._getForceContribution(parentBranch.children.NW, node);
+ this._getForceContribution(parentBranch.children.NE, node);
+ this._getForceContribution(parentBranch.children.SW, node);
+ this._getForceContribution(parentBranch.children.SE, node);
+ }
+
+
+ /**
+ * This function traverses the barnesHutTree. It checks when it can approximate distant nodes with their center of mass.
+ * If a region contains a single node, we check if it is not itself, then we apply the force.
+ *
+ * @param {Object} parentBranch
+ * @param {Node} node
+ * @private
+ */
+ _getForceContribution(parentBranch, node) {
+ // we get no force contribution from an empty region
+ if (parentBranch.childrenCount > 0) {
+ let dx, dy, distance;
+
+ // get the distance from the center of mass to the node.
+ dx = parentBranch.centerOfMass.x - node.x;
+ dy = parentBranch.centerOfMass.y - node.y;
+ distance = Math.sqrt(dx * dx + dy * dy);
+
+ // BarnesHutSolver condition
+ // original condition : s/d < theta = passed === d/s > 1/theta = passed
+ // calcSize = 1/s --> d * 1/s > 1/theta = passed
+ if (distance * parentBranch.calcSize > this.thetaInversed) {
+ this._calculateForces(distance, dx, dy, node, parentBranch);
+ }
+ else {
+ // Did not pass the condition, go into children if available
+ if (parentBranch.childrenCount === 4) {
+ this._getForceContributions(parentBranch, node);
+ }
+ else { // parentBranch must have only one node, if it was empty we wouldnt be here
+ if (parentBranch.children.data.id != node.id) { // if it is not self
+ this._calculateForces(distance, dx, dy, node, parentBranch);
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Calculate the forces based on the distance.
+ *
+ * @param {number} distance
+ * @param {number} dx
+ * @param {number} dy
+ * @param {Node} node
+ * @param {Object} parentBranch
+ * @private
+ */
+ _calculateForces(distance, dx, dy, node, parentBranch) {
+ if (distance === 0) {
+ distance = 0.1;
+ dx = distance;
+ }
+
+ if (this.overlapAvoidanceFactor < 1 && node.shape.radius) {
+ distance = Math.max(0.1 + (this.overlapAvoidanceFactor * node.shape.radius), distance - node.shape.radius);
+ }
+
+ // the dividing by the distance cubed instead of squared allows us to get the fx and fy components without sines and cosines
+ // it is shorthand for gravityforce with distance squared and fx = dx/distance * gravityForce
+ let gravityForce = this.options.gravitationalConstant * parentBranch.mass * node.options.mass / Math.pow(distance,3);
+ let fx = dx * gravityForce;
+ let fy = dy * gravityForce;
+
+ this.physicsBody.forces[node.id].x += fx;
+ this.physicsBody.forces[node.id].y += fy;
+ }
+
+
+ /**
+ * This function constructs the barnesHut tree recursively. It creates the root, splits it and starts placing the nodes.
+ *
+ * @param {Array.} nodes
+ * @param {Array.} nodeIndices
+ * @returns {{root: {centerOfMass: {x: number, y: number}, mass: number, range: {minX: number, maxX: number, minY: number, maxY: number}, size: number, calcSize: number, children: {data: null}, maxWidth: number, level: number, childrenCount: number}}} BarnesHutTree
+ * @private
+ */
+ _formBarnesHutTree(nodes, nodeIndices) {
+ let node;
+ let nodeCount = nodeIndices.length;
+
+ let minX = nodes[nodeIndices[0]].x;
+ let minY = nodes[nodeIndices[0]].y;
+ let maxX = nodes[nodeIndices[0]].x;
+ let maxY = nodes[nodeIndices[0]].y;
+
+ // get the range of the nodes
+ for (let i = 1; i < nodeCount; i++) {
+ let node = nodes[nodeIndices[i]];
+ let x = node.x;
+ let y = node.y;
+ if (node.options.mass > 0) {
+ if (x < minX) {
+ minX = x;
+ }
+ if (x > maxX) {
+ maxX = x;
+ }
+ if (y < minY) {
+ minY = y;
+ }
+ if (y > maxY) {
+ maxY = y;
+ }
+ }
+ }
+ // make the range a square
+ let sizeDiff = Math.abs(maxX - minX) - Math.abs(maxY - minY); // difference between X and Y
+ if (sizeDiff > 0) {
+ minY -= 0.5 * sizeDiff;
+ maxY += 0.5 * sizeDiff;
+ } // xSize > ySize
+ else {
+ minX += 0.5 * sizeDiff;
+ maxX -= 0.5 * sizeDiff;
+ } // xSize < ySize
+
+
+ let minimumTreeSize = 1e-5;
+ let rootSize = Math.max(minimumTreeSize, Math.abs(maxX - minX));
+ let halfRootSize = 0.5 * rootSize;
+ let centerX = 0.5 * (minX + maxX), centerY = 0.5 * (minY + maxY);
+
+ // construct the barnesHutTree
+ let barnesHutTree = {
+ root: {
+ centerOfMass: {x: 0, y: 0},
+ mass: 0,
+ range: {
+ minX: centerX - halfRootSize, maxX: centerX + halfRootSize,
+ minY: centerY - halfRootSize, maxY: centerY + halfRootSize
+ },
+ size: rootSize,
+ calcSize: 1 / rootSize,
+ children: {data: null},
+ maxWidth: 0,
+ level: 0,
+ childrenCount: 4
+ }
+ };
+ this._splitBranch(barnesHutTree.root);
+
+ // place the nodes one by one recursively
+ for (let i = 0; i < nodeCount; i++) {
+ node = nodes[nodeIndices[i]];
+ if (node.options.mass > 0) {
+ this._placeInTree(barnesHutTree.root, node);
+ }
+ }
+
+ // make global
+ return barnesHutTree
+ }
+
+
+ /**
+ * this updates the mass of a branch. this is increased by adding a node.
+ *
+ * @param {Object} parentBranch
+ * @param {Node} node
+ * @private
+ */
+ _updateBranchMass(parentBranch, node) {
+ let centerOfMass = parentBranch.centerOfMass;
+ let totalMass = parentBranch.mass + node.options.mass;
+ let totalMassInv = 1 / totalMass;
+
+ centerOfMass.x = centerOfMass.x * parentBranch.mass + node.x * node.options.mass;
+ centerOfMass.x *= totalMassInv;
+
+ centerOfMass.y = centerOfMass.y * parentBranch.mass + node.y * node.options.mass;
+ centerOfMass.y *= totalMassInv;
+
+ parentBranch.mass = totalMass;
+ let biggestSize = Math.max(Math.max(node.height, node.radius), node.width);
+ parentBranch.maxWidth = (parentBranch.maxWidth < biggestSize) ? biggestSize : parentBranch.maxWidth;
+
+ }
+
+
+ /**
+ * determine in which branch the node will be placed.
+ *
+ * @param {Object} parentBranch
+ * @param {Node} node
+ * @param {boolean} skipMassUpdate
+ * @private
+ */
+ _placeInTree(parentBranch, node, skipMassUpdate) {
+ if (skipMassUpdate != true || skipMassUpdate === undefined) {
+ // update the mass of the branch.
+ this._updateBranchMass(parentBranch, node);
+ }
+
+ let range = parentBranch.children.NW.range;
+ let region;
+ if (range.maxX > node.x) { // in NW or SW
+ if (range.maxY > node.y) {
+ region = "NW";
+ }
+ else {
+ region = "SW";
+ }
+ }
+ else { // in NE or SE
+ if (range.maxY > node.y) {
+ region = "NE";
+ }
+ else {
+ region = "SE";
+ }
+ }
+
+ this._placeInRegion(parentBranch, node, region);
+ }
+
+
+ /**
+ * actually place the node in a region (or branch)
+ *
+ * @param {Object} parentBranch
+ * @param {Node} node
+ * @param {'NW'| 'NE' | 'SW' | 'SE'} region
+ * @private
+ */
+ _placeInRegion(parentBranch, node, region) {
+ let children = parentBranch.children[region];
+
+ switch (children.childrenCount) {
+ case 0: // place node here
+ children.children.data = node;
+ children.childrenCount = 1;
+ this._updateBranchMass(children, node);
+ break;
+ case 1: // convert into children
+ // if there are two nodes exactly overlapping (on init, on opening of cluster etc.)
+ // we move one node a little bit and we do not put it in the tree.
+ if (children.children.data.x === node.x && children.children.data.y === node.y) {
+ node.x += this.seededRandom();
+ node.y += this.seededRandom();
+ }
+ else {
+ this._splitBranch(children);
+ this._placeInTree(children, node);
+ }
+ break;
+ case 4: // place in branch
+ this._placeInTree(children, node);
+ break;
+ }
+ }
+
+
+ /**
+ * this function splits a branch into 4 sub branches. If the branch contained a node, we place it in the subbranch
+ * after the split is complete.
+ *
+ * @param {Object} parentBranch
+ * @private
+ */
+ _splitBranch(parentBranch) {
+ // if the branch is shaded with a node, replace the node in the new subset.
+ let containedNode = null;
+ if (parentBranch.childrenCount === 1) {
+ containedNode = parentBranch.children.data;
+ parentBranch.mass = 0;
+ parentBranch.centerOfMass.x = 0;
+ parentBranch.centerOfMass.y = 0;
+ }
+ parentBranch.childrenCount = 4;
+ parentBranch.children.data = null;
+ this._insertRegion(parentBranch, "NW");
+ this._insertRegion(parentBranch, "NE");
+ this._insertRegion(parentBranch, "SW");
+ this._insertRegion(parentBranch, "SE");
+
+ if (containedNode != null) {
+ this._placeInTree(parentBranch, containedNode);
+ }
+ }
+
+
+ /**
+ * This function subdivides the region into four new segments.
+ * Specifically, this inserts a single new segment.
+ * It fills the children section of the parentBranch
+ *
+ * @param {Object} parentBranch
+ * @param {'NW'| 'NE' | 'SW' | 'SE'} region
+ * @private
+ */
+ _insertRegion(parentBranch, region) {
+ let minX, maxX, minY, maxY;
+ let childSize = 0.5 * parentBranch.size;
+ switch (region) {
+ case "NW":
+ minX = parentBranch.range.minX;
+ maxX = parentBranch.range.minX + childSize;
+ minY = parentBranch.range.minY;
+ maxY = parentBranch.range.minY + childSize;
+ break;
+ case "NE":
+ minX = parentBranch.range.minX + childSize;
+ maxX = parentBranch.range.maxX;
+ minY = parentBranch.range.minY;
+ maxY = parentBranch.range.minY + childSize;
+ break;
+ case "SW":
+ minX = parentBranch.range.minX;
+ maxX = parentBranch.range.minX + childSize;
+ minY = parentBranch.range.minY + childSize;
+ maxY = parentBranch.range.maxY;
+ break;
+ case "SE":
+ minX = parentBranch.range.minX + childSize;
+ maxX = parentBranch.range.maxX;
+ minY = parentBranch.range.minY + childSize;
+ maxY = parentBranch.range.maxY;
+ break;
+ }
+
+
+ parentBranch.children[region] = {
+ centerOfMass: {x: 0, y: 0},
+ mass: 0,
+ range: {minX: minX, maxX: maxX, minY: minY, maxY: maxY},
+ size: 0.5 * parentBranch.size,
+ calcSize: 2 * parentBranch.calcSize,
+ children: {data: null},
+ maxWidth: 0,
+ level: parentBranch.level + 1,
+ childrenCount: 0
+ };
+ }
+
+
+ //--------------------------- DEBUGGING BELOW ---------------------------//
+
+
+ /**
+ * This function is for debugging purposed, it draws the tree.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {string} color
+ * @private
+ */
+ _debug(ctx, color) {
+ if (this.barnesHutTree !== undefined) {
+
+ ctx.lineWidth = 1;
+
+ this._drawBranch(this.barnesHutTree.root, ctx, color);
+ }
+ }
+
+
+ /**
+ * This function is for debugging purposes. It draws the branches recursively.
+ *
+ * @param {Object} branch
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {string} color
+ * @private
+ */
+ _drawBranch(branch, ctx, color) {
+ if (color === undefined) {
+ color = "#FF0000";
+ }
+
+ if (branch.childrenCount === 4) {
+ this._drawBranch(branch.children.NW, ctx);
+ this._drawBranch(branch.children.NE, ctx);
+ this._drawBranch(branch.children.SE, ctx);
+ this._drawBranch(branch.children.SW, ctx);
+ }
+ ctx.strokeStyle = color;
+ ctx.beginPath();
+ ctx.moveTo(branch.range.minX, branch.range.minY);
+ ctx.lineTo(branch.range.maxX, branch.range.minY);
+ ctx.stroke();
+
+ ctx.beginPath();
+ ctx.moveTo(branch.range.maxX, branch.range.minY);
+ ctx.lineTo(branch.range.maxX, branch.range.maxY);
+ ctx.stroke();
+
+ ctx.beginPath();
+ ctx.moveTo(branch.range.maxX, branch.range.maxY);
+ ctx.lineTo(branch.range.minX, branch.range.maxY);
+ ctx.stroke();
+
+ ctx.beginPath();
+ ctx.moveTo(branch.range.minX, branch.range.maxY);
+ ctx.lineTo(branch.range.minX, branch.range.minY);
+ ctx.stroke();
+
+ /*
+ if (branch.mass > 0) {
+ ctx.circle(branch.centerOfMass.x, branch.centerOfMass.y, 3*branch.mass);
+ ctx.stroke();
+ }
+ */
+ }
+}
+
+
+export default BarnesHutSolver;
diff --git a/lib/network/modules/components/physics/CentralGravitySolver.js b/lib/network/modules/components/physics/CentralGravitySolver.js
new file mode 100644
index 0000000000..ec914d0150
--- /dev/null
+++ b/lib/network/modules/components/physics/CentralGravitySolver.js
@@ -0,0 +1,61 @@
+/**
+ * Central Gravity Solver
+ */
+class CentralGravitySolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ this.body = body;
+ this.physicsBody = physicsBody;
+ this.setOptions(options);
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ }
+
+ /**
+ * Calculates forces for each node
+ */
+ solve() {
+ let dx, dy, distance, node;
+ let nodes = this.body.nodes;
+ let nodeIndices = this.physicsBody.physicsNodeIndices;
+ let forces = this.physicsBody.forces;
+
+ for (let i = 0; i < nodeIndices.length; i++) {
+ let nodeId = nodeIndices[i];
+ node = nodes[nodeId];
+ dx = -node.x;
+ dy = -node.y;
+ distance = Math.sqrt(dx * dx + dy * dy);
+
+ this._calculateForces(distance, dx, dy, forces, node);
+ }
+ }
+
+ /**
+ * Calculate the forces based on the distance.
+ * @param {number} distance
+ * @param {number} dx
+ * @param {number} dy
+ * @param {Object} forces
+ * @param {Node} node
+ * @private
+ */
+ _calculateForces(distance, dx, dy, forces, node) {
+ let gravityForce = (distance === 0) ? 0 : (this.options.centralGravity / distance);
+ forces[node.id].x = dx * gravityForce;
+ forces[node.id].y = dy * gravityForce;
+ }
+}
+
+
+export default CentralGravitySolver;
\ No newline at end of file
diff --git a/lib/network/modules/components/physics/FA2BasedCentralGravitySolver.js b/lib/network/modules/components/physics/FA2BasedCentralGravitySolver.js
new file mode 100644
index 0000000000..7c708669a7
--- /dev/null
+++ b/lib/network/modules/components/physics/FA2BasedCentralGravitySolver.js
@@ -0,0 +1,37 @@
+import CentralGravitySolver from "./CentralGravitySolver"
+
+/**
+ * @extends CentralGravitySolver
+ */
+class ForceAtlas2BasedCentralGravitySolver extends CentralGravitySolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ super(body, physicsBody, options);
+ }
+
+
+ /**
+ * Calculate the forces based on the distance.
+ *
+ * @param {number} distance
+ * @param {number} dx
+ * @param {number} dy
+ * @param {Object} forces
+ * @param {Node} node
+ * @private
+ */
+ _calculateForces(distance, dx, dy, forces, node) {
+ if (distance > 0) {
+ let degree = (node.edges.length + 1);
+ let gravityForce = this.options.centralGravity * degree * node.options.mass;
+ forces[node.id].x = dx * gravityForce;
+ forces[node.id].y = dy * gravityForce;
+ }
+ }
+}
+
+export default ForceAtlas2BasedCentralGravitySolver;
\ No newline at end of file
diff --git a/lib/network/modules/components/physics/FA2BasedRepulsionSolver.js b/lib/network/modules/components/physics/FA2BasedRepulsionSolver.js
new file mode 100644
index 0000000000..001ed638f6
--- /dev/null
+++ b/lib/network/modules/components/physics/FA2BasedRepulsionSolver.js
@@ -0,0 +1,48 @@
+import BarnesHutSolver from "./BarnesHutSolver"
+
+/**
+ * @extends BarnesHutSolver
+ */
+class ForceAtlas2BasedRepulsionSolver extends BarnesHutSolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ super(body, physicsBody, options);
+ }
+
+ /**
+ * Calculate the forces based on the distance.
+ *
+ * @param {number} distance
+ * @param {number} dx
+ * @param {number} dy
+ * @param {Node} node
+ * @param {Object} parentBranch
+ * @private
+ */
+ _calculateForces(distance, dx, dy, node, parentBranch) {
+ if (distance === 0) {
+ distance = 0.1 * Math.random();
+ dx = distance;
+ }
+
+ if (this.overlapAvoidanceFactor < 1 && node.shape.radius) {
+ distance = Math.max(0.1 + (this.overlapAvoidanceFactor * node.shape.radius), distance - node.shape.radius);
+ }
+
+ let degree = (node.edges.length + 1);
+ // the dividing by the distance cubed instead of squared allows us to get the fx and fy components without sines and cosines
+ // it is shorthand for gravityforce with distance squared and fx = dx/distance * gravityForce
+ let gravityForce = this.options.gravitationalConstant * parentBranch.mass * node.options.mass * degree / Math.pow(distance,2);
+ let fx = dx * gravityForce;
+ let fy = dy * gravityForce;
+
+ this.physicsBody.forces[node.id].x += fx;
+ this.physicsBody.forces[node.id].y += fy;
+ }
+}
+
+export default ForceAtlas2BasedRepulsionSolver;
diff --git a/lib/network/modules/components/physics/HierarchicalRepulsionSolver.js b/lib/network/modules/components/physics/HierarchicalRepulsionSolver.js
new file mode 100644
index 0000000000..c1e130a715
--- /dev/null
+++ b/lib/network/modules/components/physics/HierarchicalRepulsionSolver.js
@@ -0,0 +1,81 @@
+/**
+ * Hierarchical Repulsion Solver
+ */
+class HierarchicalRepulsionSolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ this.body = body;
+ this.physicsBody = physicsBody;
+ this.setOptions(options);
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ }
+
+ /**
+ * Calculate the forces the nodes apply on each other based on a repulsion field.
+ * This field is linearly approximated.
+ *
+ * @private
+ */
+ solve() {
+ var dx, dy, distance, fx, fy, repulsingForce, node1, node2, i, j;
+
+ var nodes = this.body.nodes;
+ var nodeIndices = this.physicsBody.physicsNodeIndices;
+ var forces = this.physicsBody.forces;
+
+ // repulsing forces between nodes
+ var nodeDistance = this.options.nodeDistance;
+
+ // we loop from i over all but the last entree in the array
+ // j loops from i+1 to the last. This way we do not double count any of the indices, nor i === j
+ for (i = 0; i < nodeIndices.length - 1; i++) {
+ node1 = nodes[nodeIndices[i]];
+ for (j = i + 1; j < nodeIndices.length; j++) {
+ node2 = nodes[nodeIndices[j]];
+
+ // nodes only affect nodes on their level
+ if (node1.level === node2.level) {
+ dx = node2.x - node1.x;
+ dy = node2.y - node1.y;
+ distance = Math.sqrt(dx * dx + dy * dy);
+
+ var steepness = 0.05;
+ if (distance < nodeDistance) {
+ repulsingForce = -Math.pow(steepness * distance, 2) + Math.pow(steepness * nodeDistance, 2);
+ }
+ else {
+ repulsingForce = 0;
+ }
+ // normalize force with
+ if (distance === 0) {
+ distance = 0.01;
+ }
+ else {
+ repulsingForce = repulsingForce / distance;
+ }
+ fx = dx * repulsingForce;
+ fy = dy * repulsingForce;
+
+ forces[node1.id].x -= fx;
+ forces[node1.id].y -= fy;
+ forces[node2.id].x += fx;
+ forces[node2.id].y += fy;
+ }
+ }
+ }
+ }
+}
+
+
+export default HierarchicalRepulsionSolver;
\ No newline at end of file
diff --git a/lib/network/modules/components/physics/HierarchicalSpringSolver.js b/lib/network/modules/components/physics/HierarchicalSpringSolver.js
new file mode 100644
index 0000000000..ad444c0954
--- /dev/null
+++ b/lib/network/modules/components/physics/HierarchicalSpringSolver.js
@@ -0,0 +1,118 @@
+/**
+ * Hierarchical Spring Solver
+ */
+class HierarchicalSpringSolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ this.body = body;
+ this.physicsBody = physicsBody;
+ this.setOptions(options);
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ }
+
+ /**
+ * This function calculates the springforces on the nodes, accounting for the support nodes.
+ *
+ * @private
+ */
+ solve() {
+ var edgeLength, edge;
+ var dx, dy, fx, fy, springForce, distance;
+ var edges = this.body.edges;
+ var factor = 0.5;
+
+ var edgeIndices = this.physicsBody.physicsEdgeIndices;
+ var nodeIndices = this.physicsBody.physicsNodeIndices;
+ var forces = this.physicsBody.forces;
+
+ // initialize the spring force counters
+ for (let i = 0; i < nodeIndices.length; i++) {
+ let nodeId = nodeIndices[i];
+ forces[nodeId].springFx = 0;
+ forces[nodeId].springFy = 0;
+ }
+
+
+ // forces caused by the edges, modelled as springs
+ for (let i = 0; i < edgeIndices.length; i++) {
+ edge = edges[edgeIndices[i]];
+ if (edge.connected === true) {
+ edgeLength = edge.options.length === undefined ? this.options.springLength : edge.options.length;
+
+ dx = (edge.from.x - edge.to.x);
+ dy = (edge.from.y - edge.to.y);
+ distance = Math.sqrt(dx * dx + dy * dy);
+ distance = distance === 0 ? 0.01 : distance;
+
+ // the 1/distance is so the fx and fy can be calculated without sine or cosine.
+ springForce = this.options.springConstant * (edgeLength - distance) / distance;
+
+ fx = dx * springForce;
+ fy = dy * springForce;
+
+ if (edge.to.level != edge.from.level) {
+ if (forces[edge.toId] !== undefined) {
+ forces[edge.toId].springFx -= fx;
+ forces[edge.toId].springFy -= fy;
+ }
+ if (forces[edge.fromId] !== undefined) {
+ forces[edge.fromId].springFx += fx;
+ forces[edge.fromId].springFy += fy;
+ }
+ }
+ else {
+ if (forces[edge.toId] !== undefined) {
+ forces[edge.toId].x -= factor * fx;
+ forces[edge.toId].y -= factor * fy;
+ }
+ if (forces[edge.fromId] !== undefined) {
+ forces[edge.fromId].x += factor * fx;
+ forces[edge.fromId].y += factor * fy;
+ }
+ }
+ }
+ }
+
+ // normalize spring forces
+ springForce = 1;
+ var springFx, springFy;
+ for (let i = 0; i < nodeIndices.length; i++) {
+ let nodeId = nodeIndices[i];
+ springFx = Math.min(springForce,Math.max(-springForce,forces[nodeId].springFx));
+ springFy = Math.min(springForce,Math.max(-springForce,forces[nodeId].springFy));
+
+ forces[nodeId].x += springFx;
+ forces[nodeId].y += springFy;
+ }
+
+ // retain energy balance
+ var totalFx = 0;
+ var totalFy = 0;
+ for (let i = 0; i < nodeIndices.length; i++) {
+ let nodeId = nodeIndices[i];
+ totalFx += forces[nodeId].x;
+ totalFy += forces[nodeId].y;
+ }
+ var correctionFx = totalFx / nodeIndices.length;
+ var correctionFy = totalFy / nodeIndices.length;
+
+ for (let i = 0; i < nodeIndices.length; i++) {
+ let nodeId = nodeIndices[i];
+ forces[nodeId].x -= correctionFx;
+ forces[nodeId].y -= correctionFy;
+ }
+ }
+}
+
+export default HierarchicalSpringSolver;
diff --git a/lib/network/modules/components/physics/RepulsionSolver.js b/lib/network/modules/components/physics/RepulsionSolver.js
new file mode 100644
index 0000000000..3cb9574665
--- /dev/null
+++ b/lib/network/modules/components/physics/RepulsionSolver.js
@@ -0,0 +1,84 @@
+/**
+ * Repulsion Solver
+ */
+class RepulsionSolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ this.body = body;
+ this.physicsBody = physicsBody;
+ this.setOptions(options);
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ }
+
+ /**
+ * Calculate the forces the nodes apply on each other based on a repulsion field.
+ * This field is linearly approximated.
+ *
+ * @private
+ */
+ solve() {
+ var dx, dy, distance, fx, fy, repulsingForce, node1, node2;
+
+ var nodes = this.body.nodes;
+ var nodeIndices = this.physicsBody.physicsNodeIndices;
+ var forces = this.physicsBody.forces;
+
+ // repulsing forces between nodes
+ var nodeDistance = this.options.nodeDistance;
+
+ // approximation constants
+ var a = (-2 / 3) / nodeDistance;
+ var b = 4 / 3;
+
+ // we loop from i over all but the last entree in the array
+ // j loops from i+1 to the last. This way we do not double count any of the indices, nor i === j
+ for (let i = 0; i < nodeIndices.length - 1; i++) {
+ node1 = nodes[nodeIndices[i]];
+ for (let j = i + 1; j < nodeIndices.length; j++) {
+ node2 = nodes[nodeIndices[j]];
+
+ dx = node2.x - node1.x;
+ dy = node2.y - node1.y;
+ distance = Math.sqrt(dx * dx + dy * dy);
+
+ // same condition as BarnesHutSolver, making sure nodes are never 100% overlapping.
+ if (distance === 0) {
+ distance = 0.1*Math.random();
+ dx = distance;
+ }
+
+ if (distance < 2 * nodeDistance) {
+ if (distance < 0.5 * nodeDistance) {
+ repulsingForce = 1.0;
+ }
+ else {
+ repulsingForce = a * distance + b; // linear approx of 1 / (1 + Math.exp((distance / nodeDistance - 1) * steepness))
+ }
+ repulsingForce = repulsingForce / distance;
+
+ fx = dx * repulsingForce;
+ fy = dy * repulsingForce;
+
+ forces[node1.id].x -= fx;
+ forces[node1.id].y -= fy;
+ forces[node2.id].x += fx;
+ forces[node2.id].y += fy;
+ }
+ }
+ }
+ }
+}
+
+
+export default RepulsionSolver;
\ No newline at end of file
diff --git a/lib/network/modules/components/physics/SpringSolver.js b/lib/network/modules/components/physics/SpringSolver.js
new file mode 100644
index 0000000000..eb011e2a38
--- /dev/null
+++ b/lib/network/modules/components/physics/SpringSolver.js
@@ -0,0 +1,94 @@
+/**
+ * Spring Solver
+ */
+class SpringSolver {
+ /**
+ * @param {Object} body
+ * @param {{physicsNodeIndices: Array, physicsEdgeIndices: Array, forces: {}, velocities: {}}} physicsBody
+ * @param {Object} options
+ */
+ constructor(body, physicsBody, options) {
+ this.body = body;
+ this.physicsBody = physicsBody;
+ this.setOptions(options);
+ }
+
+ /**
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ this.options = options;
+ }
+
+ /**
+ * This function calculates the springforces on the nodes, accounting for the support nodes.
+ *
+ * @private
+ */
+ solve() {
+ let edgeLength, edge;
+ let edgeIndices = this.physicsBody.physicsEdgeIndices;
+ let edges = this.body.edges;
+ let node1, node2, node3;
+
+ // forces caused by the edges, modelled as springs
+ for (let i = 0; i < edgeIndices.length; i++) {
+ edge = edges[edgeIndices[i]];
+ if (edge.connected === true && edge.toId !== edge.fromId) {
+ // only calculate forces if nodes are in the same sector
+ if (this.body.nodes[edge.toId] !== undefined && this.body.nodes[edge.fromId] !== undefined) {
+ if (edge.edgeType.via !== undefined) {
+ edgeLength = edge.options.length === undefined ? this.options.springLength : edge.options.length;
+ node1 = edge.to;
+ node2 = edge.edgeType.via;
+ node3 = edge.from;
+
+ this._calculateSpringForce(node1, node2, 0.5 * edgeLength);
+ this._calculateSpringForce(node2, node3, 0.5 * edgeLength);
+ }
+ else {
+ // the * 1.5 is here so the edge looks as large as a smooth edge. It does not initially because the smooth edges use
+ // the support nodes which exert a repulsive force on the to and from nodes, making the edge appear larger.
+ edgeLength = edge.options.length === undefined ? this.options.springLength * 1.5: edge.options.length;
+ this._calculateSpringForce(edge.from, edge.to, edgeLength);
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * This is the code actually performing the calculation for the function above.
+ *
+ * @param {Node} node1
+ * @param {Node} node2
+ * @param {number} edgeLength
+ * @private
+ */
+ _calculateSpringForce(node1, node2, edgeLength) {
+ let dx = (node1.x - node2.x);
+ let dy = (node1.y - node2.y);
+ let distance = Math.max(Math.sqrt(dx * dx + dy * dy),0.01);
+
+ // the 1/distance is so the fx and fy can be calculated without sine or cosine.
+ let springForce = this.options.springConstant * (edgeLength - distance) / distance;
+
+ let fx = dx * springForce;
+ let fy = dy * springForce;
+
+ // handle the case where one node is not part of the physcis
+ if (this.physicsBody.forces[node1.id] !== undefined) {
+ this.physicsBody.forces[node1.id].x += fx;
+ this.physicsBody.forces[node1.id].y += fy;
+ }
+
+ if (this.physicsBody.forces[node2.id] !== undefined) {
+ this.physicsBody.forces[node2.id].x -= fx;
+ this.physicsBody.forces[node2.id].y -= fy;
+ }
+ }
+}
+
+export default SpringSolver;
\ No newline at end of file
diff --git a/lib/network/modules/components/shared/ComponentUtil.js b/lib/network/modules/components/shared/ComponentUtil.js
new file mode 100644
index 0000000000..ccdfe84e6a
--- /dev/null
+++ b/lib/network/modules/components/shared/ComponentUtil.js
@@ -0,0 +1,119 @@
+import util from 'vis-util';
+
+/**
+ * Helper functions for components
+ * @class
+ */
+class ComponentUtil {
+ /**
+ * Determine values to use for (sub)options of 'chosen'.
+ *
+ * This option is either a boolean or an object whose values should be examined further.
+ * The relevant structures are:
+ *
+ * - chosen:
+ * - chosen: { subOption: }
+ *
+ * Where subOption is 'node', 'edge' or 'label'.
+ *
+ * The intention of this method appears to be to set a specific priority to the options;
+ * Since most properties are either bridged or merged into the local options objects, there
+ * is not much point in handling them separately.
+ * TODO: examine if 'most' in previous sentence can be replaced with 'all'. In that case, we
+ * should be able to get rid of this method.
+ *
+ * @param {string} subOption option within object 'chosen' to consider; either 'node', 'edge' or 'label'
+ * @param {Object} pile array of options objects to consider
+ *
+ * @return {boolean|function} value for passed subOption of 'chosen' to use
+ */
+ static choosify(subOption, pile) {
+ // allowed values for subOption
+ let allowed = [ 'node', 'edge', 'label'];
+ let value = true;
+
+ let chosen = util.topMost(pile, 'chosen');
+ if (typeof chosen === 'boolean') {
+ value = chosen;
+ } else if (typeof chosen === 'object') {
+ if (allowed.indexOf(subOption) === -1 ) {
+ throw new Error('choosify: subOption \'' + subOption + '\' should be one of '
+ + "'" + allowed.join("', '") + "'");
+ }
+
+ let chosenEdge = util.topMost(pile, ['chosen', subOption]);
+ if ((typeof chosenEdge === 'boolean') || (typeof chosenEdge === 'function')) {
+ value = chosenEdge;
+ }
+ }
+
+ return value;
+ }
+
+
+ /**
+ * Check if the point falls within the given rectangle.
+ *
+ * @param {rect} rect
+ * @param {point} point
+ * @param {rotationPoint} [rotationPoint] if specified, the rotation that applies to the rectangle.
+ * @returns {boolean} true if point within rectangle, false otherwise
+ * @static
+ */
+ static pointInRect(rect, point, rotationPoint) {
+ if (rect.width <= 0 || rect.height <= 0) {
+ return false; // early out
+ }
+
+ if (rotationPoint !== undefined) {
+ // Rotate the point the same amount as the rectangle
+ var tmp = {
+ x: point.x - rotationPoint.x,
+ y: point.y - rotationPoint.y
+ };
+
+ if (rotationPoint.angle !== 0) {
+ // In order to get the coordinates the same, you need to
+ // rotate in the reverse direction
+ var angle = -rotationPoint.angle;
+
+ var tmp2 = {
+ x: Math.cos(angle)*tmp.x - Math.sin(angle)*tmp.y,
+ y: Math.sin(angle)*tmp.x + Math.cos(angle)*tmp.y
+ };
+ point = tmp2;
+ } else {
+ point = tmp;
+ }
+
+ // Note that if a rotation is specified, the rectangle coordinates
+ // are **not* the full canvas coordinates. They are relative to the
+ // rotationPoint. Hence, the point coordinates need not be translated
+ // back in this case.
+ }
+
+ var right = rect.x + rect.width;
+ var bottom = rect.y + rect.width;
+
+ return (
+ rect.left < point.x &&
+ right > point.x &&
+ rect.top < point.y &&
+ bottom > point.y
+ );
+ }
+
+
+ /**
+ * Check if given value is acceptable as a label text.
+ *
+ * @param {*} text value to check; can be anything at this point
+ * @returns {boolean} true if valid label value, false otherwise
+ */
+ static isValidLabel(text) {
+ // Note that this is quite strict: types that *might* be converted to string are disallowed
+ return (typeof text === 'string' && text !== '');
+ }
+}
+
+export default ComponentUtil;
diff --git a/lib/network/modules/components/shared/Label.js b/lib/network/modules/components/shared/Label.js
new file mode 100644
index 0000000000..d60d0c64c0
--- /dev/null
+++ b/lib/network/modules/components/shared/Label.js
@@ -0,0 +1,774 @@
+import util from 'vis-util';
+import ComponentUtil from './ComponentUtil';
+import LabelSplitter from './LabelSplitter';
+
+
+/**
+ * List of special styles for multi-fonts
+ * @private
+ */
+const multiFontStyle = ['bold', 'ital', 'boldital', 'mono'];
+
+
+/**
+ * A Label to be used for Nodes or Edges.
+ */
+class Label {
+
+ /**
+ * @param {Object} body
+ * @param {Object} options
+ * @param {boolean} [edgelabel=false]
+ */
+ constructor(body, options, edgelabel = false) {
+ this.body = body;
+ this.pointToSelf = false;
+ this.baseSize = undefined;
+ this.fontOptions = {}; // instance variable containing the *instance-local* font options
+ this.setOptions(options);
+ this.size = {top: 0, left: 0, width: 0, height: 0, yLine: 0};
+ this.isEdgeLabel = edgelabel;
+ }
+
+
+ /**
+ * @param {Object} options the options of the parent Node-instance
+ */
+ setOptions(options) {
+ this.elementOptions = options; // Reference to the options of the parent Node-instance
+
+ this.initFontOptions(options.font);
+
+ if (ComponentUtil.isValidLabel(options.label)) {
+ this.labelDirty = true;
+ } else {
+ // Bad label! Change the option value to prevent bad stuff happening
+ options.label = '';
+ }
+
+ if (options.font !== undefined && options.font !== null) { // font options can be deleted at various levels
+ if (typeof options.font === 'string') {
+ this.baseSize = this.fontOptions.size;
+ }
+ else if (typeof options.font === 'object') {
+ let size = options.font.size;
+
+ if (size !== undefined) {
+ this.baseSize = size;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Init the font Options structure.
+ *
+ * Member fontOptions serves as an accumulator for the current font options.
+ * As such, it needs to be completely separated from the node options.
+ *
+ * @param {Object} newFontOptions the new font options to process
+ * @private
+ */
+ initFontOptions(newFontOptions) {
+ // Prepare the multi-font option objects.
+ // These will be filled in propagateFonts(), if required
+ util.forEach(multiFontStyle, (style) => {
+ this.fontOptions[style] = {};
+ });
+
+ // Handle shorthand option, if present
+ if (Label.parseFontString(this.fontOptions, newFontOptions)) {
+ this.fontOptions.vadjust = 0;
+ return;
+ }
+
+ // Copy over the non-multifont options, if specified
+ util.forEach(newFontOptions, (prop, n) => {
+ if (prop !== undefined && prop !== null && typeof prop !== 'object') {
+ this.fontOptions[n] = prop;
+ }
+ });
+ }
+
+
+ /**
+ * If in-variable is a string, parse it as a font specifier.
+ *
+ * Note that following is not done here and have to be done after the call:
+ * - No number conversion (size)
+ * - Not all font options are set (vadjust, mod)
+ *
+ * @param {Object} outOptions out-parameter, object in which to store the parse results (if any)
+ * @param {Object} inOptions font options to parse
+ * @return {boolean} true if font parsed as string, false otherwise
+ * @static
+ */
+ static parseFontString(outOptions, inOptions) {
+ if (!inOptions || typeof inOptions !== 'string') return false;
+
+ let newOptionsArray = inOptions.split(" ");
+
+ outOptions.size = newOptionsArray[0].replace("px",'');
+ outOptions.face = newOptionsArray[1];
+ outOptions.color = newOptionsArray[2];
+
+ return true;
+ }
+
+
+ /**
+ * Set the width and height constraints based on 'nearest' value
+ *
+ * @param {Array} pile array of option objects to consider
+ * @returns {object} the actual constraint values to use
+ * @private
+ */
+ constrain(pile) {
+ // NOTE: constrainWidth and constrainHeight never set!
+ // NOTE: for edge labels, only 'maxWdt' set
+ // Node labels can set all the fields
+ let fontOptions = {
+ constrainWidth: false,
+ maxWdt: -1,
+ minWdt: -1,
+ constrainHeight: false,
+ minHgt: -1,
+ valign: 'middle',
+ }
+
+ let widthConstraint = util.topMost(pile, 'widthConstraint');
+ if (typeof widthConstraint === 'number') {
+ fontOptions.maxWdt = Number(widthConstraint);
+ fontOptions.minWdt = Number(widthConstraint);
+ } else if (typeof widthConstraint === 'object') {
+ let widthConstraintMaximum = util.topMost(pile, ['widthConstraint', 'maximum']);
+ if (typeof widthConstraintMaximum === 'number') {
+ fontOptions.maxWdt = Number(widthConstraintMaximum);
+ }
+ let widthConstraintMinimum = util.topMost(pile, ['widthConstraint', 'minimum'])
+ if (typeof widthConstraintMinimum === 'number') {
+ fontOptions.minWdt = Number(widthConstraintMinimum);
+ }
+ }
+
+
+ let heightConstraint = util.topMost(pile, 'heightConstraint');
+ if (typeof heightConstraint === 'number') {
+ fontOptions.minHgt = Number(heightConstraint);
+ } else if (typeof heightConstraint === 'object') {
+ let heightConstraintMinimum = util.topMost(pile, ['heightConstraint', 'minimum']);
+ if (typeof heightConstraintMinimum === 'number') {
+ fontOptions.minHgt = Number(heightConstraintMinimum);
+ }
+ let heightConstraintValign = util.topMost(pile, ['heightConstraint', 'valign']);
+ if (typeof heightConstraintValign === 'string') {
+ if ((heightConstraintValign === 'top')|| (heightConstraintValign === 'bottom')) {
+ fontOptions.valign = heightConstraintValign;
+ }
+ }
+ }
+
+ return fontOptions;
+ }
+
+
+ /**
+ * Set options and update internal state
+ *
+ * @param {Object} options options to set
+ * @param {Array} pile array of option objects to consider for option 'chosen'
+ */
+ update(options, pile) {
+ this.setOptions(options, true);
+ this.propagateFonts(pile);
+ util.deepExtend(this.fontOptions, this.constrain(pile));
+ this.fontOptions.chooser = ComponentUtil.choosify('label', pile);
+ }
+
+
+ /**
+ * When margins are set in an element, adjust sizes is called to remove them
+ * from the width/height constraints. This must be done prior to label sizing.
+ *
+ * @param {{top: number, right: number, bottom: number, left: number}} margins
+ */
+ adjustSizes(margins) {
+ let widthBias = (margins) ? (margins.right + margins.left) : 0;
+ if (this.fontOptions.constrainWidth) {
+ this.fontOptions.maxWdt -= widthBias;
+ this.fontOptions.minWdt -= widthBias;
+ }
+ let heightBias = (margins) ? (margins.top + margins.bottom) : 0;
+ if (this.fontOptions.constrainHeight) {
+ this.fontOptions.minHgt -= heightBias;
+ }
+ }
+
+
+/////////////////////////////////////////////////////////
+// Methods for handling options piles
+// Eventually, these will be moved to a separate class
+/////////////////////////////////////////////////////////
+
+ /**
+ * Add the font members of the passed list of option objects to the pile.
+ *
+ * @param {Pile} dstPile pile of option objects add to
+ * @param {Pile} srcPile pile of option objects to take font options from
+ * @private
+ */
+ addFontOptionsToPile(dstPile, srcPile) {
+ for (let i = 0; i < srcPile.length; ++i) {
+ this.addFontToPile(dstPile, srcPile[i]);
+ }
+ }
+
+
+ /**
+ * Add given font option object to the list of objects (the 'pile') to consider for determining
+ * multi-font option values.
+ *
+ * @param {Pile} pile pile of option objects to use
+ * @param {object} options instance to add to pile
+ * @private
+ */
+ addFontToPile(pile, options) {
+ if (options === undefined) return;
+ if (options.font === undefined || options.font === null) return;
+
+ let item = options.font;
+ pile.push(item);
+ }
+
+
+ /**
+ * Collect all own-property values from the font pile that aren't multi-font option objectss.
+ *
+ * @param {Pile} pile pile of option objects to use
+ * @returns {object} object with all current own basic font properties
+ * @private
+ */
+ getBasicOptions(pile) {
+ let ret = {};
+
+ // Scans the whole pile to get all options present
+ for (let n = 0; n < pile.length; ++n) {
+ let fontOptions = pile[n];
+
+ // Convert shorthand if necessary
+ let tmpShorthand = {};
+ if (Label.parseFontString(tmpShorthand, fontOptions)) {
+ fontOptions = tmpShorthand;
+ }
+
+ util.forEach(fontOptions, (opt, name) => {
+ if (opt === undefined) return; // multi-font option need not be present
+ if (ret.hasOwnProperty(name)) return; // Keep first value we encounter
+
+ if (multiFontStyle.indexOf(name) !== -1) {
+ // Skip multi-font properties but we do need the structure
+ ret[name] = {};
+ } else {
+ ret[name] = opt;
+ }
+ });
+ }
+
+ return ret;
+ }
+
+
+ /**
+ * Return the value for given option for the given multi-font.
+ *
+ * All available option objects are trawled in the set order to construct the option values.
+ *
+ * ---------------------------------------------------------------------
+ * ## Traversal of pile for multi-fonts
+ *
+ * The determination of multi-font option values is a special case, because any values not
+ * present in the multi-font options should by definition be taken from the main font options,
+ * i.e. from the current 'parent' object of the multi-font option.
+ *
+ * ### Search order for multi-fonts
+ *
+ * 'bold' used as example:
+ *
+ * - search in option group 'bold' in local properties
+ * - search in main font option group in local properties
+ *
+ * ---------------------------------------------------------------------
+ *
+ * @param {Pile} pile pile of option objects to use
+ * @param {MultiFontStyle} multiName sub path for the multi-font
+ * @param {string} option the option to search for, for the given multi-font
+ * @returns {string|number} the value for the given option
+ * @private
+ */
+ getFontOption(pile, multiName, option) {
+ let multiFont;
+
+ // Search multi font in local properties
+ for (let n = 0; n < pile.length; ++n) {
+ let fontOptions = pile[n];
+
+ if (fontOptions.hasOwnProperty(multiName)) {
+ multiFont = fontOptions[multiName];
+ if (multiFont === undefined || multiFont === null) continue;
+
+ // Convert shorthand if necessary
+ // TODO: inefficient to do this conversion every time; find a better way.
+ let tmpShorthand = {};
+ if (Label.parseFontString(tmpShorthand, multiFont)) {
+ multiFont = tmpShorthand;
+ }
+
+ if (multiFont.hasOwnProperty(option)) {
+ return multiFont[option];
+ }
+ }
+ }
+
+ // Option is not mentioned in the multi font options; take it from the parent font options.
+ // These have already been converted with getBasicOptions(), so use the converted values.
+ if (this.fontOptions.hasOwnProperty(option)) {
+ return this.fontOptions[option];
+ }
+
+ // A value **must** be found; you should never get here.
+ throw new Error("Did not find value for multi-font for property: '" + option + "'");
+ }
+
+
+ /**
+ * Return all options values for the given multi-font.
+ *
+ * All available option objects are trawled in the set order to construct the option values.
+ *
+ * @param {Pile} pile pile of option objects to use
+ * @param {MultiFontStyle} multiName sub path for the mod-font
+ * @returns {MultiFontOptions}
+ * @private
+ */
+ getFontOptions(pile, multiName) {
+ let result = {};
+ let optionNames = ['color', 'size', 'face', 'mod', 'vadjust']; // List of allowed options per multi-font
+
+ for (let i = 0; i < optionNames.length; ++i) {
+ let mod = optionNames[i];
+ result[mod] = this.getFontOption(pile, multiName, mod);
+ }
+
+ return result;
+ }
+
+/////////////////////////////////////////////////////////
+// End methods for handling options piles
+/////////////////////////////////////////////////////////
+
+
+ /**
+ * Collapse the font options for the multi-font to single objects, from
+ * the chain of option objects passed (the 'pile').
+ *
+ * @param {Pile} pile sequence of option objects to consider.
+ * First item in list assumed to be the newly set options.
+ */
+ propagateFonts(pile) {
+ let fontPile = []; // sequence of font objects to consider, order important
+
+ // Note that this.elementOptions is not used here.
+ this.addFontOptionsToPile(fontPile, pile);
+ this.fontOptions = this.getBasicOptions(fontPile);
+
+ // We set multifont values even if multi === false, for consistency (things break otherwise)
+ for (let i = 0; i < multiFontStyle.length; ++i) {
+ let mod = multiFontStyle[i];
+ let modOptions = this.fontOptions[mod];
+ let tmpMultiFontOptions = this.getFontOptions(fontPile, mod);
+
+ // Copy over found values
+ util.forEach(tmpMultiFontOptions, (option, n) => {
+ modOptions[n] = option;
+ });
+
+ modOptions.size = Number(modOptions.size);
+ modOptions.vadjust = Number(modOptions.vadjust);
+ }
+ }
+
+
+ /**
+ * Main function. This is called from anything that wants to draw a label.
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x
+ * @param {number} y
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {string} [baseline='middle']
+ */
+ draw(ctx, x, y, selected, hover, baseline = 'middle') {
+ // if no label, return
+ if (this.elementOptions.label === undefined)
+ return;
+
+ // check if we have to render the label
+ let viewFontSize = this.fontOptions.size * this.body.view.scale;
+ if (this.elementOptions.label && viewFontSize < this.elementOptions.scaling.label.drawThreshold - 1)
+ return;
+
+ // This ensures that there will not be HUGE letters on screen
+ // by setting an upper limit on the visible text size (regardless of zoomLevel)
+ if (viewFontSize >= this.elementOptions.scaling.label.maxVisible) {
+ viewFontSize = Number(this.elementOptions.scaling.label.maxVisible) / this.body.view.scale;
+ }
+
+ // update the size cache if required
+ this.calculateLabelSize(ctx, selected, hover, x, y, baseline);
+ this._drawBackground(ctx);
+ this._drawText(ctx, x, this.size.yLine, baseline, viewFontSize);
+ }
+
+
+ /**
+ * Draws the label background
+ * @param {CanvasRenderingContext2D} ctx
+ * @private
+ */
+ _drawBackground(ctx) {
+ if (this.fontOptions.background !== undefined && this.fontOptions.background !== "none") {
+ ctx.fillStyle = this.fontOptions.background;
+ let size = this.getSize();
+ ctx.fillRect(size.left, size.top, size.width, size.height);
+ }
+ }
+
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x
+ * @param {number} y
+ * @param {string} [baseline='middle']
+ * @param {number} viewFontSize
+ * @private
+ */
+ _drawText(ctx, x, y, baseline = 'middle', viewFontSize) {
+ [x, y] = this._setAlignment(ctx, x, y, baseline);
+
+ ctx.textAlign = 'left';
+ x = x - this.size.width / 2; // Shift label 1/2-distance to the left
+ if ((this.fontOptions.valign) && (this.size.height > this.size.labelHeight)) {
+ if (this.fontOptions.valign === 'top') {
+ y -= (this.size.height - this.size.labelHeight) / 2;
+ }
+ if (this.fontOptions.valign === 'bottom') {
+ y += (this.size.height - this.size.labelHeight) / 2;
+ }
+ }
+
+ // draw the text
+ for (let i = 0; i < this.lineCount; i++) {
+ let line = this.lines[i];
+ if (line && line.blocks) {
+ let width = 0;
+ if (this.isEdgeLabel || this.fontOptions.align === 'center') {
+ width += (this.size.width - line.width) / 2
+ } else if (this.fontOptions.align === 'right') {
+ width += (this.size.width - line.width)
+ }
+ for (let j = 0; j < line.blocks.length; j++) {
+ let block = line.blocks[j];
+ ctx.font = block.font;
+ let [fontColor, strokeColor] = this._getColor(block.color, viewFontSize, block.strokeColor);
+ if (block.strokeWidth > 0) {
+ ctx.lineWidth = block.strokeWidth;
+ ctx.strokeStyle = strokeColor;
+ ctx.lineJoin = 'round';
+ }
+ ctx.fillStyle = fontColor;
+
+ if (block.strokeWidth > 0) {
+ ctx.strokeText(block.text, x + width, y + block.vadjust);
+ }
+ ctx.fillText(block.text, x + width, y + block.vadjust);
+ width += block.width;
+ }
+ y += line.height;
+ }
+ }
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {number} x
+ * @param {number} y
+ * @param {string} baseline
+ * @returns {Array.}
+ * @private
+ */
+ _setAlignment(ctx, x, y, baseline) {
+ // check for label alignment (for edges)
+ // TODO: make alignment for nodes
+ if (this.isEdgeLabel && this.fontOptions.align !== 'horizontal' && this.pointToSelf === false) {
+ x = 0;
+ y = 0;
+
+ let lineMargin = 2;
+ if (this.fontOptions.align === 'top') {
+ ctx.textBaseline = 'alphabetic';
+ y -= 2 * lineMargin; // distance from edge, required because we use alphabetic. Alphabetic has less difference between browsers
+ }
+ else if (this.fontOptions.align === 'bottom') {
+ ctx.textBaseline = 'hanging';
+ y += 2 * lineMargin;// distance from edge, required because we use hanging. Hanging has less difference between browsers
+ }
+ else {
+ ctx.textBaseline = 'middle';
+ }
+ }
+ else {
+ ctx.textBaseline = baseline;
+ }
+ return [x,y];
+ }
+
+ /**
+ * fade in when relative scale is between threshold and threshold - 1.
+ * If the relative scale would be smaller than threshold -1 the draw function would have returned before coming here.
+ *
+ * @param {string} color The font color to use
+ * @param {number} viewFontSize
+ * @param {string} initialStrokeColor
+ * @returns {Array.} An array containing the font color and stroke color
+ * @private
+ */
+ _getColor(color, viewFontSize, initialStrokeColor) {
+ let fontColor = color || '#000000';
+ let strokeColor = initialStrokeColor || '#ffffff';
+ if (viewFontSize <= this.elementOptions.scaling.label.drawThreshold) {
+ let opacity = Math.max(0, Math.min(1, 1 - (this.elementOptions.scaling.label.drawThreshold - viewFontSize)));
+ fontColor = util.overrideOpacity(fontColor, opacity);
+ strokeColor = util.overrideOpacity(strokeColor, opacity);
+ }
+ return [fontColor, strokeColor];
+ }
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @returns {{width: number, height: number}}
+ */
+ getTextSize(ctx, selected = false, hover = false) {
+ this._processLabel(ctx, selected, hover);
+ return {
+ width: this.size.width,
+ height: this.size.height,
+ lineCount: this.lineCount
+ };
+ }
+
+
+ /**
+ * Get the current dimensions of the label
+ *
+ * @return {rect}
+ */
+ getSize() {
+ let lineMargin = 2;
+ let x = this.size.left; // default values which might be overridden below
+ let y = this.size.top - 0.5*lineMargin; // idem
+
+ if (this.isEdgeLabel) {
+ const x2 = -this.size.width * 0.5;
+
+ switch (this.fontOptions.align) {
+ case 'middle':
+ x = x2;
+ y = -this.size.height * 0.5
+ break;
+ case 'top':
+ x = x2;
+ y = -(this.size.height + lineMargin);
+ break;
+ case 'bottom':
+ x = x2;
+ y = lineMargin;
+ break;
+ }
+ }
+
+ var ret = {
+ left : x,
+ top : y,
+ width : this.size.width,
+ height: this.size.height,
+ };
+
+ return ret;
+ }
+
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {number} [x=0]
+ * @param {number} [y=0]
+ * @param {'middle'|'hanging'} [baseline='middle']
+ */
+ calculateLabelSize(ctx, selected, hover, x = 0, y = 0, baseline = 'middle') {
+ this._processLabel(ctx, selected, hover);
+ this.size.left = x - this.size.width * 0.5;
+ this.size.top = y - this.size.height * 0.5;
+ this.size.yLine = y + (1 - this.lineCount) * 0.5 * this.fontOptions.size;
+ if (baseline === "hanging") {
+ this.size.top += 0.5 * this.fontOptions.size;
+ this.size.top += 4; // distance from node, required because we use hanging. Hanging has less difference between browsers
+ this.size.yLine += 4; // distance from node
+ }
+ }
+
+
+ /**
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {string} mod
+ * @returns {{color, size, face, mod, vadjust, strokeWidth: *, strokeColor: (*|string|allOptions.edges.font.strokeColor|{string}|allOptions.nodes.font.strokeColor|Array)}}
+ */
+ getFormattingValues(ctx, selected, hover, mod) {
+ let getValue = function(fontOptions, mod, option) {
+ if (mod === "normal") {
+ if (option === 'mod' ) return "";
+ return fontOptions[option];
+ }
+
+ if (fontOptions[mod][option] !== undefined) { // Grumbl leaving out test on undefined equals false for ""
+ return fontOptions[mod][option];
+ } else {
+ // Take from parent font option
+ return fontOptions[option];
+ }
+ };
+
+ let values = {
+ color : getValue(this.fontOptions, mod, 'color' ),
+ size : getValue(this.fontOptions, mod, 'size' ),
+ face : getValue(this.fontOptions, mod, 'face' ),
+ mod : getValue(this.fontOptions, mod, 'mod' ),
+ vadjust: getValue(this.fontOptions, mod, 'vadjust'),
+ strokeWidth: this.fontOptions.strokeWidth,
+ strokeColor: this.fontOptions.strokeColor
+ };
+ if (selected || hover) {
+ if (mod === "normal" && (this.fontOptions.chooser === true) && (this.elementOptions.labelHighlightBold)) {
+ values.mod = 'bold';
+ } else {
+ if (typeof this.fontOptions.chooser === 'function') {
+ this.fontOptions.chooser(values, this.elementOptions.id, selected, hover);
+ }
+ }
+ }
+
+ let fontString = "";
+ if (values.mod !== undefined && values.mod !== "") { // safeguard for undefined - this happened
+ fontString += values.mod + " ";
+ }
+ fontString += values.size + "px " + values.face;
+
+ ctx.font = fontString.replace(/"/g, "");
+ values.font = ctx.font;
+ values.height = values.size;
+ return values;
+ }
+
+
+ /**
+ *
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @returns {boolean}
+ */
+ differentState(selected, hover) {
+ return ((selected !== this.selectedState) || (hover !== this.hoverState));
+ }
+
+
+ /**
+ * This explodes the passed text into lines and determines the width, height and number of lines.
+ *
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @param {string} inText the text to explode
+ * @returns {{width, height, lines}|*}
+ * @private
+ */
+ _processLabelText(ctx, selected, hover, inText) {
+ let splitter = new LabelSplitter(ctx, this, selected, hover);
+ return splitter.process(inText);
+ }
+
+
+ /**
+ * This explodes the label string into lines and sets the width, height and number of lines.
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {boolean} selected
+ * @param {boolean} hover
+ * @private
+ */
+ _processLabel(ctx, selected, hover) {
+
+ if(this.labelDirty === false && !this.differentState(selected,hover))
+ return;
+
+ let state = this._processLabelText(ctx, selected, hover, this.elementOptions.label);
+
+ if ((this.fontOptions.minWdt > 0) && (state.width < this.fontOptions.minWdt)) {
+ state.width = this.fontOptions.minWdt;
+ }
+
+ this.size.labelHeight =state.height;
+ if ((this.fontOptions.minHgt > 0) && (state.height < this.fontOptions.minHgt)) {
+ state.height = this.fontOptions.minHgt;
+ }
+
+ this.lines = state.lines;
+ this.lineCount = state.lines.length;
+ this.size.width = state.width;
+ this.size.height = state.height;
+ this.selectedState = selected;
+ this.hoverState = hover;
+
+ this.labelDirty = false;
+ }
+
+
+ /**
+ * Check if this label is visible
+ *
+ * @return {boolean} true if this label will be show, false otherwise
+ */
+ visible() {
+ if ((this.size.width === 0 || this.size.height === 0)
+ || this.elementOptions.label === undefined) {
+ return false; // nothing to display
+ }
+
+ let viewFontSize = this.fontOptions.size * this.body.view.scale;
+ if (viewFontSize < this.elementOptions.scaling.label.drawThreshold - 1) {
+ return false; // Too small or too far away to show
+ }
+
+ return true;
+ }
+}
+
+export default Label;
diff --git a/lib/network/modules/components/shared/LabelAccumulator.js b/lib/network/modules/components/shared/LabelAccumulator.js
new file mode 100644
index 0000000000..5a05769a44
--- /dev/null
+++ b/lib/network/modules/components/shared/LabelAccumulator.js
@@ -0,0 +1,238 @@
+/**
+ * Callback to determine text dimensions, using the parent label settings.
+ * @callback MeasureText
+ * @param {text} text
+ * @param {text} mod
+ * @return {Object} { width, values} width in pixels and font attributes
+ */
+
+
+/**
+ * Helper class for Label which collects results of splitting labels into lines and blocks.
+ *
+ * @private
+ */
+class LabelAccumulator {
+
+ /**
+ * @param {MeasureText} measureText
+ */
+ constructor(measureText) {
+ this.measureText = measureText;
+ this.current = 0;
+ this.width = 0;
+ this.height = 0;
+ this.lines = [];
+ }
+
+
+ /**
+ * Append given text to the given line.
+ *
+ * @param {number} l index of line to add to
+ * @param {string} text string to append to line
+ * @param {'bold'|'ital'|'boldital'|'mono'|'normal'} [mod='normal']
+ * @private
+ */
+ _add(l, text, mod = 'normal') {
+
+ if (this.lines[l] === undefined) {
+ this.lines[l] = {
+ width : 0,
+ height: 0,
+ blocks: []
+ };
+ }
+
+ // We still need to set a block for undefined and empty texts, hence return at this point
+ // This is necessary because we don't know at this point if we're at the
+ // start of an empty line or not.
+ // To compensate, empty blocks are removed in `finalize()`.
+ //
+ // Empty strings should still have a height
+ let tmpText = text;
+ if (text === undefined || text === "") tmpText = " ";
+
+ // Determine width and get the font properties
+ let result = this.measureText(tmpText, mod);
+ let block = Object.assign({}, result.values);
+ block.text = text;
+ block.width = result.width;
+ block.mod = mod;
+
+ if (text === undefined || text === "") {
+ block.width = 0;
+ }
+
+ this.lines[l].blocks.push(block);
+
+ // Update the line width. We need this for determining if a string goes over max width
+ this.lines[l].width += block.width;
+ }
+
+
+ /**
+ * Returns the width in pixels of the current line.
+ *
+ * @returns {number}
+ */
+ curWidth() {
+ let line = this.lines[this.current];
+ if (line === undefined) return 0;
+
+ return line.width;
+ }
+
+
+ /**
+ * Add text in block to current line
+ *
+ * @param {string} text
+ * @param {'bold'|'ital'|'boldital'|'mono'|'normal'} [mod='normal']
+ */
+ append(text, mod = 'normal') {
+ this._add(this.current, text, mod);
+ }
+
+
+ /**
+ * Add text in block to current line and start a new line
+ *
+ * @param {string} text
+ * @param {'bold'|'ital'|'boldital'|'mono'|'normal'} [mod='normal']
+ */
+ newLine(text, mod = 'normal') {
+ this._add(this.current, text, mod);
+ this.current++;
+ }
+
+
+ /**
+ * Determine and set the heights of all the lines currently contained in this instance
+ *
+ * Note that width has already been set.
+ *
+ * @private
+ */
+ determineLineHeights() {
+ for (let k = 0; k < this.lines.length; k++) {
+ let line = this.lines[k];
+
+ // Looking for max height of blocks in line
+ let height = 0;
+
+ if (line.blocks !== undefined) { // Can happen if text contains e.g. '\n '
+ for (let l = 0; l < line.blocks.length; l++) {
+ let block = line.blocks[l];
+
+ if (height < block.height) {
+ height = block.height;
+ }
+ }
+ }
+
+ line.height = height;
+ }
+ }
+
+
+ /**
+ * Determine the full size of the label text, as determined by current lines and blocks
+ *
+ * @private
+ */
+ determineLabelSize() {
+ let width = 0;
+ let height = 0;
+ for (let k = 0; k < this.lines.length; k++) {
+ let line = this.lines[k];
+
+ if (line.width > width) {
+ width = line.width;
+ }
+ height += line.height;
+ }
+
+ this.width = width;
+ this.height = height;
+ }
+
+
+ /**
+ * Remove all empty blocks and empty lines we don't need
+ *
+ * This must be done after the width/height determination,
+ * so that these are set properly for processing here.
+ *
+ * @returns {Array} Lines with empty blocks (and some empty lines) removed
+ * @private
+ */
+ removeEmptyBlocks() {
+ let tmpLines = [];
+ for (let k = 0; k < this.lines.length; k++) {
+ let line = this.lines[k];
+
+ // Note: an empty line in between text has width zero but is still relevant to layout.
+ // So we can't use width for testing empty line here
+ if (line.blocks.length === 0) continue;
+
+ // Discard final empty line always
+ if(k === this.lines.length - 1) {
+ if (line.width === 0) continue;
+ }
+
+ let tmpLine = {};
+ Object.assign(tmpLine, line);
+ tmpLine.blocks = [];
+
+ let firstEmptyBlock;
+ let tmpBlocks = []
+ for (let l = 0; l < line.blocks.length; l++) {
+ let block = line.blocks[l];
+ if (block.width !== 0) {
+ tmpBlocks.push(block);
+ } else {
+ if (firstEmptyBlock === undefined) {
+ firstEmptyBlock = block;
+ }
+ }
+ }
+
+ // Ensure that there is *some* text present
+ if (tmpBlocks.length === 0 && firstEmptyBlock !== undefined) {
+ tmpBlocks.push(firstEmptyBlock);
+ }
+
+ tmpLine.blocks = tmpBlocks;
+
+ tmpLines.push(tmpLine);
+ }
+
+ return tmpLines;
+ }
+
+
+ /**
+ * Set the sizes for all lines and the whole thing.
+ *
+ * @returns {{width: (number|*), height: (number|*), lines: Array}}
+ */
+ finalize() {
+ //console.log(JSON.stringify(this.lines, null, 2));
+
+ this.determineLineHeights();
+ this.determineLabelSize();
+ let tmpLines = this.removeEmptyBlocks();
+
+
+ // Return a simple hash object for further processing.
+ return {
+ width : this.width,
+ height: this.height,
+ lines : tmpLines
+ }
+ }
+}
+
+
+export default LabelAccumulator;
diff --git a/lib/network/modules/components/shared/LabelSplitter.js b/lib/network/modules/components/shared/LabelSplitter.js
new file mode 100644
index 0000000000..bc3d5dc60a
--- /dev/null
+++ b/lib/network/modules/components/shared/LabelSplitter.js
@@ -0,0 +1,661 @@
+import LabelAccumulator from './LabelAccumulator';
+import ComponentUtil from './ComponentUtil';
+
+// Hash of prepared regexp's for tags
+var tagPattern = {
+ // HTML
+ '': //,
+ '': //,
+ '': //,
+ '
': /<\/b>/,
+ '': /<\/i>/,
+ '': /<\/code>/,
+ // Markdown
+ '*': /\*/, // bold
+ '_': /\_/, // ital
+ '`': /`/, // mono
+ 'afterBold': /[^\*]/,
+ 'afterItal': /[^_]/,
+ 'afterMono': /[^`]/,
+};
+
+
+/**
+ * Internal helper class for parsing the markup tags for HTML and Markdown.
+ *
+ * NOTE: Sequences of tabs and spaces are reduced to single space.
+ * Scan usage of `this.spacing` within method
+ */
+class MarkupAccumulator {
+
+ /**
+ * Create an instance
+ *
+ * @param {string} text text to parse for markup
+ */
+ constructor(text) {
+ this.text = text;
+ this.bold = false;
+ this.ital = false;
+ this.mono = false;
+ this.spacing = false;
+ this.position = 0;
+ this.buffer = "";
+ this.modStack = [];
+
+ this.blocks = [];
+ }
+
+
+ /**
+ * Return the mod label currently on the top of the stack
+ *
+ * @returns {string} label of topmost mod
+ * @private
+ */
+ mod() {
+ return (this.modStack.length === 0) ? 'normal' : this.modStack[0];
+ }
+
+
+ /**
+ * Return the mod label currently active
+ *
+ * @returns {string} label of active mod
+ * @private
+ */
+ modName() {
+ if (this.modStack.length === 0)
+ return 'normal';
+ else if (this.modStack[0] === 'mono')
+ return 'mono';
+ else {
+ if (this.bold && this.ital) {
+ return 'boldital';
+ } else if (this.bold) {
+ return 'bold';
+ } else if (this.ital) {
+ return 'ital';
+ }
+ }
+ }
+
+
+ /**
+ * @private
+ */
+ emitBlock() {
+ if (this.spacing) {
+ this.add(" ");
+ this.spacing = false;
+ }
+ if (this.buffer.length > 0) {
+ this.blocks.push({ text: this.buffer, mod: this.modName() });
+ this.buffer = "";
+ }
+ }
+
+
+ /**
+ * Output text to buffer
+ *
+ * @param {string} text text to add
+ * @private
+ */
+ add(text) {
+ if (text === " ") {
+ this.spacing = true;
+ }
+ if (this.spacing) {
+ this.buffer += " ";
+ this.spacing = false;
+ }
+ if (text != " ") {
+ this.buffer += text;
+ }
+ }
+
+
+ /**
+ * Handle parsing of whitespace
+ *
+ * @param {string} ch the character to check
+ * @returns {boolean} true if the character was processed as whitespace, false otherwise
+ */
+ parseWS(ch) {
+ if (/[ \t]/.test(ch)) {
+ if (!this.mono) {
+ this.spacing = true;
+ } else {
+ this.add(ch);
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * @param {string} tagName label for block type to set
+ * @private
+ */
+ setTag(tagName) {
+ this.emitBlock();
+ this[tagName] = true;
+ this.modStack.unshift(tagName);
+ }
+
+
+ /**
+ * @param {string} tagName label for block type to unset
+ * @private
+ */
+ unsetTag(tagName) {
+ this.emitBlock();
+ this[tagName] = false;
+ this.modStack.shift();
+ }
+
+
+ /**
+ * @param {string} tagName label for block type we are currently processing
+ * @param {string|RegExp} tag string to match in text
+ * @returns {boolean} true if the tag was processed, false otherwise
+ */
+ parseStartTag(tagName, tag) {
+ // Note: if 'mono' passed as tagName, there is a double check here. This is OK
+ if (!this.mono && !this[tagName] && this.match(tag)) {
+ this.setTag(tagName);
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * @param {string|RegExp} tag
+ * @param {number} [advance=true] if set, advance current position in text
+ * @returns {boolean} true if match at given position, false otherwise
+ * @private
+ */
+ match(tag, advance = true) {
+ let [regExp, length] = this.prepareRegExp(tag);
+ let matched = regExp.test(this.text.substr(this.position, length));
+
+ if (matched && advance) {
+ this.position += length - 1;
+ }
+
+ return matched;
+ }
+
+
+ /**
+ * @param {string} tagName label for block type we are currently processing
+ * @param {string|RegExp} tag string to match in text
+ * @param {RegExp} [nextTag] regular expression to match for characters *following* the current tag
+ * @returns {boolean} true if the tag was processed, false otherwise
+ */
+ parseEndTag(tagName, tag, nextTag) {
+ let checkTag = (this.mod() === tagName);
+ if (tagName === 'mono') { // special handling for 'mono'
+ checkTag = checkTag && this.mono;
+ } else {
+ checkTag = checkTag && !this.mono;
+ }
+
+ if (checkTag && this.match(tag)) {
+ if (nextTag !== undefined) {
+ // Purpose of the following match is to prevent a direct unset/set of a given tag
+ // E.g. '*bold **still bold*' => '*bold still bold*'
+ if ((this.position === this.text.length-1) || this.match(nextTag, false)) {
+ this.unsetTag(tagName);
+ }
+ } else {
+ this.unsetTag(tagName);
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * @param {string|RegExp} tag string to match in text
+ * @param {value} value string to replace tag with, if found at current position
+ * @returns {boolean} true if the tag was processed, false otherwise
+ */
+ replace(tag, value) {
+ if (this.match(tag)) {
+ this.add(value);
+ this.position += length - 1;
+ return true;
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Create a regular expression for the tag if it isn't already one.
+ *
+ * The return value is an array `[RegExp, number]`, with exactly two value, where:
+ * - RegExp is the regular expression to use
+ * - number is the lenth of the input string to match
+ *
+ * @param {string|RegExp} tag string to match in text
+ * @returns {Array} regular expression to use and length of input string to match
+ * @private
+ */
+ prepareRegExp(tag) {
+ let length;
+ let regExp;
+ if (tag instanceof RegExp) {
+ regExp = tag;
+ length = 1; // ASSUMPTION: regexp only tests one character
+ } else {
+ // use prepared regexp if present
+ var prepared = tagPattern[tag];
+ if (prepared !== undefined) {
+ regExp = prepared;
+ } else {
+ regExp = new RegExp(tag);
+ }
+
+ length = tag.length;
+ }
+
+ return [regExp, length];
+ }
+}
+
+
+/**
+ * Helper class for Label which explodes the label text into lines and blocks within lines
+ *
+ * @private
+ */
+class LabelSplitter {
+
+ /**
+ * @param {CanvasRenderingContext2D} ctx Canvas rendering context
+ * @param {Label} parent reference to the Label instance using current instance
+ * @param {boolean} selected
+ * @param {boolean} hover
+ */
+ constructor(ctx, parent, selected, hover) {
+ this.ctx = ctx;
+ this.parent = parent;
+
+
+ /**
+ * Callback to determine text width; passed to LabelAccumulator instance
+ *
+ * @param {String} text string to determine width of
+ * @param {String} mod font type to use for this text
+ * @return {Object} { width, values} width in pixels and font attributes
+ */
+ let textWidth = (text, mod) => {
+ if (text === undefined) return 0;
+
+ // TODO: This can be done more efficiently with caching
+ let values = this.parent.getFormattingValues(ctx, selected, hover, mod);
+
+ let width = 0;
+ if (text !== '') {
+ // NOTE: The following may actually be *incorrect* for the mod fonts!
+ // This returns the size with a regular font, bold etc. may
+ // have different sizes.
+ let measure = this.ctx.measureText(text);
+ width = measure.width;
+ }
+
+ return {width, values: values};
+ };
+
+
+ this.lines = new LabelAccumulator(textWidth);
+ }
+
+
+ /**
+ * Split passed text of a label into lines and blocks.
+ *
+ * # NOTE
+ *
+ * The handling of spacing is option dependent:
+ *
+ * - if `font.multi : false`, all spaces are retained
+ * - if `font.multi : true`, every sequence of spaces is compressed to a single space
+ *
+ * This might not be the best way to do it, but this is as it has been working till now.
+ * In order not to break existing functionality, for the time being this behaviour will
+ * be retained in any code changes.
+ *
+ * @param {string} text text to split
+ * @returns {Array}
+ */
+ process(text) {
+ if (!ComponentUtil.isValidLabel(text)) {
+ return this.lines.finalize();
+ }
+
+ var font = this.parent.fontOptions;
+
+ // Normalize the end-of-line's to a single representation - order important
+ text = text.replace(/\r\n/g, '\n'); // Dos EOL's
+ text = text.replace(/\r/g, '\n'); // Mac EOL's
+
+ // Note that at this point, there can be no \r's in the text.
+ // This is used later on splitStringIntoLines() to split multifont texts.
+
+ let nlLines = String(text).split('\n');
+ let lineCount = nlLines.length;
+
+ if (font.multi) {
+ // Multi-font case: styling tags active
+ for (let i = 0; i < lineCount; i++) {
+ let blocks = this.splitBlocks(nlLines[i], font.multi);
+ // Post: Sequences of tabs and spaces are reduced to single space
+
+ if (blocks === undefined) continue;
+
+ if (blocks.length === 0) {
+ this.lines.newLine("");
+ continue;
+ }
+
+ if (font.maxWdt > 0) {
+ // widthConstraint.maximum defined
+ //console.log('Running widthConstraint multi, max: ' + this.fontOptions.maxWdt);
+ for (let j = 0; j < blocks.length; j++) {
+ let mod = blocks[j].mod;
+ let text = blocks[j].text;
+ this.splitStringIntoLines(text, mod, true);
+ }
+ } else {
+ // widthConstraint.maximum NOT defined
+ for (let j = 0; j < blocks.length; j++) {
+ let mod = blocks[j].mod;
+ let text = blocks[j].text;
+ this.lines.append(text, mod);
+ }
+ }
+
+ this.lines.newLine();
+ }
+ } else {
+ // Single-font case
+ if (font.maxWdt > 0) {
+ // widthConstraint.maximum defined
+ // console.log('Running widthConstraint normal, max: ' + this.fontOptions.maxWdt);
+ for (let i = 0; i < lineCount; i++) {
+ this.splitStringIntoLines(nlLines[i]);
+ }
+ } else {
+ // widthConstraint.maximum NOT defined
+ for (let i = 0; i < lineCount; i++) {
+ this.lines.newLine(nlLines[i]);
+ }
+ }
+ }
+
+ return this.lines.finalize();
+ }
+
+
+ /**
+ * normalize the markup system
+ *
+ * @param {boolean|'md'|'markdown'|'html'} markupSystem
+ * @returns {string}
+ */
+ decodeMarkupSystem(markupSystem) {
+ let system = 'none';
+ if (markupSystem === 'markdown' || markupSystem === 'md') {
+ system = 'markdown';
+ } else if (markupSystem === true || markupSystem === 'html') {
+ system = 'html'
+ }
+ return system;
+ }
+
+
+ /**
+ *
+ * @param {string} text
+ * @returns {Array}
+ */
+ splitHtmlBlocks(text) {
+ let s = new MarkupAccumulator(text);
+
+ let parseEntities = (ch) => {
+ if (/&/.test(ch)) {
+ let parsed = s.replace(s.text, '<', '<')
+ || s.replace(s.text, '&', '&');
+
+ if (!parsed) {
+ s.add("&");
+ }
+
+ return true;
+ }
+
+ return false;
+ };
+
+ while (s.position < s.text.length) {
+ let ch = s.text.charAt(s.position);
+
+ let parsed = s.parseWS(ch)
+ || (/')
+ || s.parseStartTag('ital', '')
+ || s.parseStartTag('mono', '')
+ || s.parseEndTag('bold', '
')
+ || s.parseEndTag('ital', '')
+ || s.parseEndTag('mono', '')))
+ || parseEntities(ch);
+
+ if (!parsed) {
+ s.add(ch);
+ }
+ s.position++
+ }
+ s.emitBlock();
+ return s.blocks;
+ }
+
+
+ /**
+ *
+ * @param {string} text
+ * @returns {Array}
+ */
+ splitMarkdownBlocks(text) {
+ let s = new MarkupAccumulator(text);
+ let beginable = true;
+
+ let parseOverride = (ch) => {
+ if (/\\/.test(ch)) {
+ if (s.position < this.text.length + 1) {
+ s.position++;
+ ch = this.text.charAt(s.position);
+ if (/ \t/.test(ch)) {
+ s.spacing = true;
+ } else {
+ s.add(ch);
+ beginable = false;
+ }
+ }
+
+ return true
+ }
+
+ return false;
+ }
+
+ while (s.position < s.text.length) {
+ let ch = s.text.charAt(s.position);
+
+ let parsed = s.parseWS(ch)
+ || parseOverride(ch)
+ || ((beginable || s.spacing) && (
+ s.parseStartTag('bold', '*')
+ || s.parseStartTag('ital', '_')
+ || s.parseStartTag('mono', '`')))
+ || s.parseEndTag('bold', '*', 'afterBold')
+ || s.parseEndTag('ital', '_', 'afterItal')
+ || s.parseEndTag('mono', '`', 'afterMono');
+
+ if (!parsed) {
+ s.add(ch);
+ beginable = false;
+ }
+ s.position++
+ }
+ s.emitBlock();
+ return s.blocks;
+ }
+
+
+ /**
+ * Explodes a piece of text into single-font blocks using a given markup
+ *
+ * @param {string} text
+ * @param {boolean|'md'|'markdown'|'html'} markupSystem
+ * @returns {Array.<{text: string, mod: string}>}
+ * @private
+ */
+ splitBlocks(text, markupSystem) {
+ let system = this.decodeMarkupSystem(markupSystem);
+ if (system === 'none') {
+ return [{
+ text: text,
+ mod: 'normal'
+ }]
+ } else if (system === 'markdown') {
+ return this.splitMarkdownBlocks(text);
+ } else if (system === 'html') {
+ return this.splitHtmlBlocks(text);
+ }
+ }
+
+
+ /**
+ * @param {string} text
+ * @returns {boolean} true if text length over the current max with
+ * @private
+ */
+ overMaxWidth(text) {
+ let width = this.ctx.measureText(text).width;
+ return (this.lines.curWidth() + width > this.parent.fontOptions.maxWdt);
+ }
+
+
+ /**
+ * Determine the longest part of the sentence which still fits in the
+ * current max width.
+ *
+ * @param {Array} words Array of strings signifying a text lines
+ * @return {number} index of first item in string making string go over max
+ * @private
+ */
+ getLongestFit(words) {
+ let text = '';
+ let w = 0;
+
+ while (w < words.length) {
+ let pre = (text === '') ? '' : ' ';
+ let newText = text + pre + words[w];
+
+ if (this.overMaxWidth(newText)) break;
+ text = newText;
+ w++;
+ }
+
+ return w;
+ }
+
+
+ /**
+ * Determine the longest part of the string which still fits in the
+ * current max width.
+ *
+ * @param {Array} words Array of strings signifying a text lines
+ * @return {number} index of first item in string making string go over max
+ */
+ getLongestFitWord(words) {
+ let w = 0;
+
+ while (w < words.length) {
+ if (this.overMaxWidth(words.slice(0,w))) break;
+ w++;
+ }
+
+ return w;
+ }
+
+
+ /**
+ * Split the passed text into lines, according to width constraint (if any).
+ *
+ * The method assumes that the input string is a single line, i.e. without lines break.
+ *
+ * This method retains spaces, if still present (case `font.multi: false`).
+ * A space which falls on an internal line break, will be replaced by a newline.
+ * There is no special handling of tabs; these go along with the flow.
+ *
+ * @param {string} str
+ * @param {string} [mod='normal']
+ * @param {boolean} [appendLast=false]
+ * @private
+ */
+ splitStringIntoLines(str, mod = 'normal', appendLast = false) {
+ // Still-present spaces are relevant, retain them
+ str = str.replace(/^( +)/g, '$1\r');
+ str = str.replace(/([^\r][^ ]*)( +)/g, '$1\r$2\r');
+ let words = str.split('\r');
+
+ while (words.length > 0) {
+ let w = this.getLongestFit(words);
+
+ if (w === 0) {
+ // Special case: the first word is already larger than the max width.
+ let word = words[0];
+
+ // Break the word to the largest part that fits the line
+ let x = this.getLongestFitWord(word);
+ this.lines.newLine(word.slice(0, x), mod);
+
+ // Adjust the word, so that the rest will be done next iteration
+ words[0] = word.slice(x);
+ } else {
+ // skip any space that is replaced by a newline
+ let newW = w;
+ if (words[w - 1] === ' ') {
+ w--;
+ } else if (words[newW] === ' ') {
+ newW++;
+ }
+
+ let text = words.slice(0, w).join("");
+
+ if (w == words.length && appendLast) {
+ this.lines.append(text, mod);
+ } else {
+ this.lines.newLine(text, mod);
+ }
+
+ // Adjust the word, so that the rest will be done next iteration
+ words = words.slice(newW);
+ }
+ }
+ }
+}
+
+export default LabelSplitter;
diff --git a/lib/network/options.js b/lib/network/options.js
new file mode 100644
index 0000000000..ff614a5df2
--- /dev/null
+++ b/lib/network/options.js
@@ -0,0 +1,625 @@
+/**
+ * This object contains all possible options. It will check if the types are correct, if required if the option is one
+ * of the allowed values.
+ *
+ * __any__ means that the name of the property does not matter.
+ * __type__ is a required field for all objects and contains the allowed types of all objects
+ */
+let string = 'string';
+let bool = 'boolean';
+let number = 'number';
+let array = 'array';
+let object = 'object'; // should only be in a __type__ property
+let dom = 'dom';
+let any = 'any';
+
+// List of endpoints
+let endPoints = ['arrow', 'circle', 'bar'];
+
+let allOptions = {
+ configure: {
+ enabled: { boolean: bool },
+ filter: { boolean: bool, string, array, 'function': 'function' },
+ container: { dom },
+ showButton: { boolean: bool },
+ __type__: { object, boolean: bool, string, array, 'function': 'function' }
+ },
+ edges: {
+ arrows: {
+ to: { enabled: { boolean: bool }, scaleFactor: { number }, type: { string: endPoints }, __type__: { object, boolean: bool } },
+ middle: { enabled: { boolean: bool }, scaleFactor: { number }, type: { string: endPoints }, __type__: { object, boolean: bool } },
+ from: { enabled: { boolean: bool }, scaleFactor: { number }, type: { string: endPoints }, __type__: { object, boolean: bool } },
+ __type__: { string: ['from', 'to', 'middle'], object }
+ },
+ arrowStrikethrough: { boolean: bool },
+ background: {
+ enabled: { boolean: bool },
+ color: { string },
+ size: { number },
+ dashes: { boolean: bool, array },
+ __type__: { object, boolean: bool }
+ },
+ chosen: {
+ label: { boolean: bool, 'function': 'function' },
+ edge: { boolean: bool, 'function': 'function' },
+ __type__: { object, boolean: bool }
+ },
+ color: {
+ color: { string },
+ highlight: { string },
+ hover: { string },
+ inherit: { string: ['from', 'to', 'both'], boolean: bool },
+ opacity: { number },
+ __type__: { object, string }
+ },
+ dashes: { boolean: bool, array },
+ font: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ background: { string },
+ strokeWidth: { number }, // px
+ strokeColor: { string },
+ align: { string: ['horizontal', 'top', 'middle', 'bottom'] },
+ vadjust: { number },
+ multi: { boolean: bool, string },
+ bold: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ boldital: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ ital: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ mono: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ __type__: { object, string }
+ },
+ hidden: { boolean: bool },
+ hoverWidth: { 'function': 'function', number },
+ label: { string, 'undefined': 'undefined' },
+ labelHighlightBold: { boolean: bool },
+ length: { number, 'undefined': 'undefined' },
+ physics: { boolean: bool },
+ scaling: {
+ min: { number },
+ max: { number },
+ label: {
+ enabled: { boolean: bool },
+ min: { number },
+ max: { number },
+ maxVisible: { number },
+ drawThreshold: { number },
+ __type__: { object, boolean: bool }
+ },
+ customScalingFunction: { 'function': 'function' },
+ __type__: { object }
+ },
+ selectionWidth: { 'function': 'function', number },
+ selfReferenceSize: { number },
+ shadow: {
+ enabled: { boolean: bool },
+ color: { string },
+ size: { number },
+ x: { number },
+ y: { number },
+ __type__: { object, boolean: bool }
+ },
+ smooth: {
+ enabled: { boolean: bool },
+ type: { string: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'] },
+ roundness: { number },
+ forceDirection: { string: ['horizontal', 'vertical', 'none'], boolean: bool },
+ __type__: { object, boolean: bool }
+ },
+ title: { string, 'undefined': 'undefined' },
+ width: { number },
+ widthConstraint: {
+ maximum: { number },
+ __type__: { object, boolean: bool, number }
+ },
+ value: { number, 'undefined': 'undefined' },
+ __type__: { object }
+ },
+ groups: {
+ useDefaultGroups: { boolean: bool },
+ __any__: 'get from nodes, will be overwritten below',
+ __type__: { object }
+ },
+ interaction: {
+ dragNodes: { boolean: bool },
+ dragView: { boolean: bool },
+ hideEdgesOnDrag: { boolean: bool },
+ hideNodesOnDrag: { boolean: bool },
+ hover: { boolean: bool },
+ keyboard: {
+ enabled: { boolean: bool },
+ speed: { x: { number }, y: { number }, zoom: { number }, __type__: { object } },
+ bindToWindow: { boolean: bool },
+ __type__: { object, boolean: bool }
+ },
+ multiselect: { boolean: bool },
+ navigationButtons: { boolean: bool },
+ selectable: { boolean: bool },
+ selectConnectedEdges: { boolean: bool },
+ hoverConnectedEdges: { boolean: bool },
+ tooltipDelay: { number },
+ zoomView: { boolean: bool },
+ zoomSpeed: { number },
+ __type__: { object }
+ },
+ layout: {
+ randomSeed: { 'undefined': 'undefined', number },
+ improvedLayout: { boolean: bool },
+ hierarchical: {
+ enabled: { boolean: bool },
+ levelSeparation: { number },
+ nodeSpacing: { number },
+ treeSpacing: { number },
+ blockShifting: { boolean: bool },
+ edgeMinimization: { boolean: bool },
+ parentCentralization: { boolean: bool },
+ direction: { string: ['UD', 'DU', 'LR', 'RL'] }, // UD, DU, LR, RL
+ sortMethod: { string: ['hubsize', 'directed'] }, // hubsize, directed
+ __type__: { object, boolean: bool }
+ },
+ __type__: { object }
+ },
+ manipulation: {
+ enabled: { boolean: bool },
+ initiallyActive: { boolean: bool },
+ addNode: { boolean: bool, 'function': 'function' },
+ addEdge: { boolean: bool, 'function': 'function' },
+ editNode: { 'function': 'function' },
+ editEdge: {
+ editWithoutDrag: { 'function' : 'function' },
+ __type__: {object, boolean: bool, 'function': 'function' }
+ },
+ deleteNode: { boolean: bool, 'function': 'function' },
+ deleteEdge: { boolean: bool, 'function': 'function' },
+ controlNodeStyle: 'get from nodes, will be overwritten below',
+ __type__: { object, boolean: bool }
+ },
+ nodes: {
+ borderWidth: { number },
+ borderWidthSelected: { number, 'undefined': 'undefined' },
+ brokenImage: { string, 'undefined': 'undefined' },
+ chosen: {
+ label: { boolean: bool, 'function': 'function' },
+ node: { boolean: bool, 'function': 'function' },
+ __type__: { object, boolean: bool }
+ },
+ color: {
+ border: { string },
+ background: { string },
+ highlight: {
+ border: { string },
+ background: { string },
+ __type__: { object, string }
+ },
+ hover: {
+ border: { string },
+ background: { string },
+ __type__: { object, string }
+ },
+ __type__: { object, string }
+ },
+ fixed: {
+ x: { boolean: bool },
+ y: { boolean: bool },
+ __type__: { object, boolean: bool }
+ },
+ font: {
+ align: { string },
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ background: { string },
+ strokeWidth: { number }, // px
+ strokeColor: { string },
+ vadjust: { number },
+ multi: { boolean: bool, string },
+ bold: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ boldital: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ ital: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ mono: {
+ color: { string },
+ size: { number }, // px
+ face: { string },
+ mod: { string },
+ vadjust: { number },
+ __type__: { object, string }
+ },
+ __type__: { object, string }
+ },
+ group: { string, number, 'undefined': 'undefined' },
+ heightConstraint: {
+ minimum: { number },
+ valign: { string },
+ __type__: { object, boolean: bool, number }
+ },
+ hidden: { boolean: bool },
+ icon: {
+ face: { string },
+ code: { string }, //'\uf007',
+ size: { number }, //50,
+ color: { string },
+ __type__: { object }
+ },
+ id: { string, number },
+ image: {
+ selected: { string, 'undefined': 'undefined' }, // --> URL
+ unselected: { string, 'undefined': 'undefined' }, // --> URL
+ __type__: { object, string }
+ },
+ label: { string, 'undefined': 'undefined' },
+ labelHighlightBold: { boolean: bool },
+ level: { number, 'undefined': 'undefined' },
+ margin: {
+ top: { number },
+ right: { number },
+ bottom: { number },
+ left: { number },
+ __type__: { object, number }
+ },
+ mass: { number },
+ physics: { boolean: bool },
+ scaling: {
+ min: { number },
+ max: { number },
+ label: {
+ enabled: { boolean: bool },
+ min: { number },
+ max: { number },
+ maxVisible: { number },
+ drawThreshold: { number },
+ __type__: { object, boolean: bool }
+ },
+ customScalingFunction: { 'function': 'function' },
+ __type__: { object }
+ },
+ shadow: {
+ enabled: { boolean: bool },
+ color: { string },
+ size: { number },
+ x: { number },
+ y: { number },
+ __type__: { object, boolean: bool }
+ },
+ shape: { string: ['ellipse', 'circle', 'database', 'box', 'text', 'image', 'circularImage', 'diamond', 'dot', 'star', 'triangle', 'triangleDown', 'square', 'icon', 'hexagon'] },
+ shapeProperties: {
+ borderDashes: { boolean: bool, array },
+ borderRadius: { number },
+ interpolation: { boolean: bool },
+ useImageSize: { boolean: bool },
+ useBorderWithImage: { boolean: bool },
+ __type__: { object }
+ },
+ size: { number },
+ title: { string, dom, 'undefined': 'undefined' },
+ value: { number, 'undefined': 'undefined' },
+ widthConstraint: {
+ minimum: { number },
+ maximum: { number },
+ __type__: { object, boolean: bool, number }
+ },
+ x: { number },
+ y: { number },
+ __type__: { object }
+ },
+ physics: {
+ enabled: { boolean: bool },
+ barnesHut: {
+ gravitationalConstant: { number },
+ centralGravity: { number },
+ springLength: { number },
+ springConstant: { number },
+ damping: { number },
+ avoidOverlap: { number },
+ __type__: { object }
+ },
+ forceAtlas2Based: {
+ gravitationalConstant: { number },
+ centralGravity: { number },
+ springLength: { number },
+ springConstant: { number },
+ damping: { number },
+ avoidOverlap: { number },
+ __type__: { object }
+ },
+ repulsion: {
+ centralGravity: { number },
+ springLength: { number },
+ springConstant: { number },
+ nodeDistance: { number },
+ damping: { number },
+ __type__: { object }
+ },
+ hierarchicalRepulsion: {
+ centralGravity: { number },
+ springLength: { number },
+ springConstant: { number },
+ nodeDistance: { number },
+ damping: { number },
+ __type__: { object }
+ },
+ maxVelocity: { number },
+ minVelocity: { number }, // px/s
+ solver: { string: ['barnesHut', 'repulsion', 'hierarchicalRepulsion', 'forceAtlas2Based'] },
+ stabilization: {
+ enabled: { boolean: bool },
+ iterations: { number }, // maximum number of iteration to stabilize
+ updateInterval: { number },
+ onlyDynamicEdges: { boolean: bool },
+ fit: { boolean: bool },
+ __type__: { object, boolean: bool }
+ },
+ timestep: { number },
+ adaptiveTimestep: { boolean: bool },
+ __type__: { object, boolean: bool }
+ },
+
+ //globals :
+ autoResize: { boolean: bool },
+ clickToUse: { boolean: bool },
+ locale: { string },
+ locales: {
+ __any__: { any },
+ __type__: { object }
+ },
+ height: { string },
+ width: { string },
+ __type__: { object }
+};
+
+allOptions.groups.__any__ = allOptions.nodes;
+allOptions.manipulation.controlNodeStyle = allOptions.nodes;
+
+
+let configureOptions = {
+ nodes: {
+ borderWidth: [1, 0, 10, 1],
+ borderWidthSelected: [2, 0, 10, 1],
+ color: {
+ border: ['color', '#2B7CE9'],
+ background: ['color', '#97C2FC'],
+ highlight: {
+ border: ['color', '#2B7CE9'],
+ background: ['color', '#D2E5FF']
+ },
+ hover: {
+ border: ['color', '#2B7CE9'],
+ background: ['color', '#D2E5FF']
+ }
+ },
+ fixed: {
+ x: false,
+ y: false
+ },
+ font: {
+ color: ['color', '#343434'],
+ size: [14, 0, 100, 1], // px
+ face: ['arial', 'verdana', 'tahoma'],
+ background: ['color', 'none'],
+ strokeWidth: [0, 0, 50, 1], // px
+ strokeColor: ['color', '#ffffff']
+ },
+ //group: 'string',
+ hidden: false,
+ labelHighlightBold: true,
+ //icon: {
+ // face: 'string', //'FontAwesome',
+ // code: 'string', //'\uf007',
+ // size: [50, 0, 200, 1], //50,
+ // color: ['color','#2B7CE9'] //'#aa00ff'
+ //},
+ //image: 'string', // --> URL
+ physics: true,
+ scaling: {
+ min: [10, 0, 200, 1],
+ max: [30, 0, 200, 1],
+ label: {
+ enabled: false,
+ min: [14, 0, 200, 1],
+ max: [30, 0, 200, 1],
+ maxVisible: [30, 0, 200, 1],
+ drawThreshold: [5, 0, 20, 1]
+ }
+ },
+ shadow: {
+ enabled: false,
+ color: 'rgba(0,0,0,0.5)',
+ size: [10, 0, 20, 1],
+ x: [5, -30, 30, 1],
+ y: [5, -30, 30, 1]
+ },
+ shape: ['ellipse', 'box', 'circle', 'database', 'diamond', 'dot', 'square', 'star', 'text', 'triangle', 'triangleDown','hexagon'],
+ shapeProperties: {
+ borderDashes: false,
+ borderRadius: [6, 0, 20, 1],
+ interpolation: true,
+ useImageSize: false
+ },
+ size: [25, 0, 200, 1]
+ },
+ edges: {
+ arrows: {
+ to: { enabled: false, scaleFactor: [1, 0, 3, 0.05], type: 'arrow' },
+ middle: { enabled: false, scaleFactor: [1, 0, 3, 0.05], type: 'arrow' },
+ from: { enabled: false, scaleFactor: [1, 0, 3, 0.05], type: 'arrow' }
+ },
+ arrowStrikethrough: true,
+ color: {
+ color: ['color', '#848484'],
+ highlight: ['color', '#848484'],
+ hover: ['color', '#848484'],
+ inherit: ['from', 'to', 'both', true, false],
+ opacity: [1, 0, 1, 0.05]
+ },
+ dashes: false,
+ font: {
+ color: ['color', '#343434'],
+ size: [14, 0, 100, 1], // px
+ face: ['arial', 'verdana', 'tahoma'],
+ background: ['color', 'none'],
+ strokeWidth: [2, 0, 50, 1], // px
+ strokeColor: ['color', '#ffffff'],
+ align: ['horizontal', 'top', 'middle', 'bottom']
+ },
+ hidden: false,
+ hoverWidth: [1.5, 0, 5, 0.1],
+ labelHighlightBold: true,
+ physics: true,
+ scaling: {
+ min: [1, 0, 100, 1],
+ max: [15, 0, 100, 1],
+ label: {
+ enabled: true,
+ min: [14, 0, 200, 1],
+ max: [30, 0, 200, 1],
+ maxVisible: [30, 0, 200, 1],
+ drawThreshold: [5, 0, 20, 1]
+ }
+ },
+ selectionWidth: [1.5, 0, 5, 0.1],
+ selfReferenceSize: [20, 0, 200, 1],
+ shadow: {
+ enabled: false,
+ color: 'rgba(0,0,0,0.5)',
+ size: [10, 0, 20, 1],
+ x: [5, -30, 30, 1],
+ y: [5, -30, 30, 1]
+ },
+ smooth: {
+ enabled: true,
+ type: ['dynamic', 'continuous', 'discrete', 'diagonalCross', 'straightCross', 'horizontal', 'vertical', 'curvedCW', 'curvedCCW', 'cubicBezier'],
+ forceDirection: ['horizontal', 'vertical', 'none'],
+ roundness: [0.5, 0, 1, 0.05]
+ },
+ width: [1, 0, 30, 1]
+ },
+ layout: {
+ //randomSeed: [0, 0, 500, 1],
+ //improvedLayout: true,
+ hierarchical: {
+ enabled: false,
+ levelSeparation: [150, 20, 500, 5],
+ nodeSpacing: [100, 20, 500, 5],
+ treeSpacing: [200, 20, 500, 5],
+ blockShifting: true,
+ edgeMinimization: true,
+ parentCentralization: true,
+ direction: ['UD', 'DU', 'LR', 'RL'], // UD, DU, LR, RL
+ sortMethod: ['hubsize', 'directed'] // hubsize, directed
+ }
+ },
+ interaction: {
+ dragNodes: true,
+ dragView: true,
+ hideEdgesOnDrag: false,
+ hideNodesOnDrag: false,
+ hover: false,
+ keyboard: {
+ enabled: false,
+ speed: { x: [10, 0, 40, 1], y: [10, 0, 40, 1], zoom: [0.02, 0, 0.1, 0.005] },
+ bindToWindow: true
+ },
+ multiselect: false,
+ navigationButtons: false,
+ selectable: true,
+ selectConnectedEdges: true,
+ hoverConnectedEdges: true,
+ tooltipDelay: [300, 0, 1000, 25],
+ zoomView: true,
+ zoomSpeed: 1
+ },
+ manipulation: {
+ enabled: false,
+ initiallyActive: false
+ },
+ physics: {
+ enabled: true,
+ barnesHut: {
+ //theta: [0.5, 0.1, 1, 0.05],
+ gravitationalConstant: [-2000, -30000, 0, 50],
+ centralGravity: [0.3, 0, 10, 0.05],
+ springLength: [95, 0, 500, 5],
+ springConstant: [0.04, 0, 1.2, 0.005],
+ damping: [0.09, 0, 1, 0.01],
+ avoidOverlap: [0, 0, 1, 0.01]
+ },
+ forceAtlas2Based: {
+ //theta: [0.5, 0.1, 1, 0.05],
+ gravitationalConstant: [-50, -500, 0, 1],
+ centralGravity: [0.01, 0, 1, 0.005],
+ springLength: [95, 0, 500, 5],
+ springConstant: [0.08, 0, 1.2, 0.005],
+ damping: [0.4, 0, 1, 0.01],
+ avoidOverlap: [0, 0, 1, 0.01]
+ },
+ repulsion: {
+ centralGravity: [0.2, 0, 10, 0.05],
+ springLength: [200, 0, 500, 5],
+ springConstant: [0.05, 0, 1.2, 0.005],
+ nodeDistance: [100, 0, 500, 5],
+ damping: [0.09, 0, 1, 0.01]
+ },
+ hierarchicalRepulsion: {
+ centralGravity: [0.2, 0, 10, 0.05],
+ springLength: [100, 0, 500, 5],
+ springConstant: [0.01, 0, 1.2, 0.005],
+ nodeDistance: [120, 0, 500, 5],
+ damping: [0.09, 0, 1, 0.01]
+ },
+ maxVelocity: [50, 0, 150, 1],
+ minVelocity: [0.1, 0.01, 0.5, 0.01],
+ solver: ['barnesHut', 'forceAtlas2Based', 'repulsion', 'hierarchicalRepulsion'],
+ timestep: [0.5, 0.01, 1, 0.01],
+ //adaptiveTimestep: true
+ }
+};
+
+export {allOptions, configureOptions};
diff --git a/lib/network/shapes.js b/lib/network/shapes.js
new file mode 100644
index 0000000000..cbb5a8da92
--- /dev/null
+++ b/lib/network/shapes.js
@@ -0,0 +1,291 @@
+/**
+ * Canvas shapes used by Network
+ */
+if (typeof CanvasRenderingContext2D !== 'undefined') {
+
+ /**
+ * Draw a circle shape
+ *
+ * @param {number} x
+ * @param {number} y
+ * @param {number} r
+ */
+ CanvasRenderingContext2D.prototype.circle = function (x, y, r) {
+ this.beginPath();
+ this.arc(x, y, r, 0, 2 * Math.PI, false);
+ this.closePath();
+ };
+
+ /**
+ * Draw a square shape
+ * @param {number} x horizontal center
+ * @param {number} y vertical center
+ * @param {number} r size, width and height of the square
+ */
+ CanvasRenderingContext2D.prototype.square = function (x, y, r) {
+ this.beginPath();
+ this.rect(x - r, y - r, r * 2, r * 2);
+ this.closePath();
+ };
+
+ /**
+ * Draw a triangle shape
+ * @param {number} x horizontal center
+ * @param {number} y vertical center
+ * @param {number} r radius, half the length of the sides of the triangle
+ */
+ CanvasRenderingContext2D.prototype.triangle = function (x, y, r) {
+ // http://en.wikipedia.org/wiki/Equilateral_triangle
+ this.beginPath();
+
+ // the change in radius and the offset is here to center the shape
+ r *= 1.15;
+ y += 0.275 * r;
+
+ var s = r * 2;
+ var s2 = s / 2;
+ var ir = Math.sqrt(3) / 6 * s; // radius of inner circle
+ var h = Math.sqrt(s * s - s2 * s2); // height
+
+
+ this.moveTo(x, y - (h - ir));
+ this.lineTo(x + s2, y + ir);
+ this.lineTo(x - s2, y + ir);
+ this.lineTo(x, y - (h - ir));
+ this.closePath();
+
+
+ };
+
+ /**
+ * Draw a triangle shape in downward orientation
+ * @param {number} x horizontal center
+ * @param {number} y vertical center
+ * @param {number} r radius
+ */
+ CanvasRenderingContext2D.prototype.triangleDown = function (x, y, r) {
+ // http://en.wikipedia.org/wiki/Equilateral_triangle
+ this.beginPath();
+
+ // the change in radius and the offset is here to center the shape
+ r *= 1.15;
+ y -= 0.275 * r;
+
+ var s = r * 2;
+ var s2 = s / 2;
+ var ir = Math.sqrt(3) / 6 * s; // radius of inner circle
+ var h = Math.sqrt(s * s - s2 * s2); // height
+
+ this.moveTo(x, y + (h - ir));
+ this.lineTo(x + s2, y - ir);
+ this.lineTo(x - s2, y - ir);
+ this.lineTo(x, y + (h - ir));
+ this.closePath();
+ };
+
+ /**
+ * Draw a star shape, a star with 5 points
+ * @param {number} x horizontal center
+ * @param {number} y vertical center
+ * @param {number} r radius, half the length of the sides of the triangle
+ */
+ CanvasRenderingContext2D.prototype.star = function (x, y, r) {
+ // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/
+ this.beginPath();
+
+ // the change in radius and the offset is here to center the shape
+ r *= 0.82;
+ y += 0.1 * r;
+
+ for (var n = 0; n < 10; n++) {
+ var radius = (n % 2 === 0) ? r * 1.3 : r * 0.5;
+ this.lineTo(
+ x + radius * Math.sin(n * 2 * Math.PI / 10),
+ y - radius * Math.cos(n * 2 * Math.PI / 10)
+ );
+ }
+
+ this.closePath();
+ };
+
+ /**
+ * Draw a Diamond shape
+ * @param {number} x horizontal center
+ * @param {number} y vertical center
+ * @param {number} r radius, half the length of the sides of the triangle
+ */
+ CanvasRenderingContext2D.prototype.diamond = function (x, y, r) {
+ // http://www.html5canvastutorials.com/labs/html5-canvas-star-spinner/
+ this.beginPath();
+
+ this.lineTo(x, y + r);
+ this.lineTo(x + r, y);
+ this.lineTo(x, y - r);
+ this.lineTo(x - r, y);
+
+
+ this.closePath();
+ };
+
+ /**
+ * http://stackoverflow.com/questions/1255512/how-to-draw-a-rounded-rectangle-on-html-canvas
+ *
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ * @param {number} r
+ */
+ CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
+ var r2d = Math.PI / 180;
+ if (w - ( 2 * r ) < 0) {
+ r = ( w / 2 );
+ } //ensure that the radius isn't too large for x
+ if (h - ( 2 * r ) < 0) {
+ r = ( h / 2 );
+ } //ensure that the radius isn't too large for y
+ this.beginPath();
+ this.moveTo(x + r, y);
+ this.lineTo(x + w - r, y);
+ this.arc(x + w - r, y + r, r, r2d * 270, r2d * 360, false);
+ this.lineTo(x + w, y + h - r);
+ this.arc(x + w - r, y + h - r, r, 0, r2d * 90, false);
+ this.lineTo(x + r, y + h);
+ this.arc(x + r, y + h - r, r, r2d * 90, r2d * 180, false);
+ this.lineTo(x, y + r);
+ this.arc(x + r, y + r, r, r2d * 180, r2d * 270, false);
+ this.closePath();
+ };
+
+ /**
+ * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas
+ *
+ * Postfix '_vis' added to discern it from standard method ellipse().
+ *
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ */
+ CanvasRenderingContext2D.prototype.ellipse_vis = function (x, y, w, h) {
+ var kappa = .5522848,
+ ox = (w / 2) * kappa, // control point offset horizontal
+ oy = (h / 2) * kappa, // control point offset vertical
+ xe = x + w, // x-end
+ ye = y + h, // y-end
+ xm = x + w / 2, // x-middle
+ ym = y + h / 2; // y-middle
+
+ this.beginPath();
+ this.moveTo(x, ym);
+ this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);
+ this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);
+ this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
+ this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);
+ this.closePath();
+ };
+
+
+ /**
+ * http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas
+ *
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ */
+ CanvasRenderingContext2D.prototype.database = function (x, y, w, h) {
+ var f = 1 / 3;
+ var wEllipse = w;
+ var hEllipse = h * f;
+
+ var kappa = .5522848,
+ ox = (wEllipse / 2) * kappa, // control point offset horizontal
+ oy = (hEllipse / 2) * kappa, // control point offset vertical
+ xe = x + wEllipse, // x-end
+ ye = y + hEllipse, // y-end
+ xm = x + wEllipse / 2, // x-middle
+ ym = y + hEllipse / 2, // y-middle
+ ymb = y + (h - hEllipse / 2), // y-midlle, bottom ellipse
+ yeb = y + h; // y-end, bottom ellipse
+
+ this.beginPath();
+ this.moveTo(xe, ym);
+
+ this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
+ this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);
+
+ this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);
+ this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);
+
+ this.lineTo(xe, ymb);
+
+ this.bezierCurveTo(xe, ymb + oy, xm + ox, yeb, xm, yeb);
+ this.bezierCurveTo(xm - ox, yeb, x, ymb + oy, x, ymb);
+
+ this.lineTo(x, ym);
+ };
+
+
+ /**
+ * Sets up the dashedLine functionality for drawing
+ * Original code came from http://stackoverflow.com/questions/4576724/dotted-stroke-in-canvas
+ * @author David Jordan
+ * @date 2012-08-08
+ *
+ * @param {number} x
+ * @param {number} y
+ * @param {number} x2
+ * @param {number} y2
+ * @param {string} pattern
+ */
+ CanvasRenderingContext2D.prototype.dashedLine = function (x, y, x2, y2, pattern) {
+ this.beginPath();
+ this.moveTo(x, y);
+
+ var patternLength = pattern.length;
+ var dx = (x2 - x);
+ var dy = (y2 - y);
+ var slope = dy / dx;
+ var distRemaining = Math.sqrt(dx * dx + dy * dy);
+ var patternIndex = 0;
+ var draw = true;
+ var xStep = 0;
+ var dashLength = pattern[0];
+
+ while (distRemaining >= 0.1) {
+ dashLength = pattern[patternIndex++ % patternLength];
+ if (dashLength > distRemaining) {
+ dashLength = distRemaining;
+ }
+
+ xStep = Math.sqrt(dashLength * dashLength / (1 + slope * slope));
+ xStep = dx < 0 ? -xStep : xStep;
+ x += xStep;
+ y += slope * xStep;
+
+ if (draw === true) {this.lineTo(x,y);}
+ else {this.moveTo(x,y);}
+
+ distRemaining -= dashLength;
+ draw = !draw;
+ }
+ };
+
+ /**
+ * Draw a Hexagon shape with 6 sides
+ * @param {Number} x horizontal center
+ * @param {Number} y vertical center
+ * @param {Number} r radius
+ */
+ CanvasRenderingContext2D.prototype.hexagon = function (x, y, r) {
+ this.beginPath();
+ var sides = 6;
+ var a = (Math.PI*2)/sides;
+ this.moveTo(x+r,y);
+ for (var i = 1; i < sides; i++) {
+ this.lineTo(x+r*Math.cos(a*i),y+r*Math.sin(a*i));
+ }
+ this.closePath();
+ };
+}
diff --git a/lib/network/typedefs.js b/lib/network/typedefs.js
new file mode 100644
index 0000000000..ed6a3712d9
--- /dev/null
+++ b/lib/network/typedefs.js
@@ -0,0 +1,97 @@
+// NOTE: When a typedef is isolated in a separate comment block, an actual description is generated for it,
+// using the rest of the commenting in the code block. Usage of typedef in other comments then
+// link to there. TIL.
+//
+// Also noteworthy, all typedef's set up in this manner are collected in a single, global page 'global.html'.
+// In other words, it doesn't matter *where* the typedef's are defined in the code.
+//
+//
+// TODO: add descriptive commenting to given typedef's
+
+/**
+ * @typedef {{type:string, point:Point, angle:number, length:number}} ArrowData
+ *
+ * Object containing instantiation data for a given endpoint.
+ */
+
+/**
+ * @typedef {{x:number, y:number}} Point
+ *
+ * A point in view-coordinates.
+ */
+
+/**
+ * @typedef {{toArrow: boolean, toArrowScale: (allOptions.edges.arrows.to.scaleFactor|{number}|allOptions.edges.arrows.middle.scaleFactor|allOptions.edges.arrows.from.scaleFactor|Array|number), toArrowType: *, middleArrow: boolean, middleArrowScale: (number|allOptions.edges.arrows.middle.scaleFactor|{number}|Array), middleArrowType: (allOptions.edges.arrows.middle.type|{string}|string|*), fromArrow: boolean, fromArrowScale: (allOptions.edges.arrows.to.scaleFactor|{number}|allOptions.edges.arrows.middle.scaleFactor|allOptions.edges.arrows.from.scaleFactor|Array|number), fromArrowType: *, arrowStrikethrough: (*|boolean|allOptions.edges.arrowStrikethrough|{boolean}), color: undefined, inheritsColor: (string|string|string|allOptions.edges.color.inherit|{string, boolean}|Array|*), opacity: *, hidden: *, length: *, shadow: *, shadowColor: *, shadowSize: *, shadowX: *, shadowY: *, dashes: (*|boolean|Array|allOptions.edges.dashes|{boolean, array}), width: *}} ArrowOptions
+ */
+
+/**
+ * @typedef {string|number} Id
+ */
+
+/**
+ * @typedef {Id} NodeId
+ */
+
+/**
+ * @typedef {Id} EdgeId
+ */
+
+/**
+ * @typedef {Id} LabelId
+ */
+
+/**
+ * @typedef {{x: number, y: number}} point
+ */
+
+/**
+ * @typedef {{left: number, top: number, width: number, height: number}} rect
+ */
+
+/**
+ * @typedef {{x: number, y:number, angle: number}} rotationPoint
+ *
+ * point to rotate around and the angle in radians to rotate. angle == 0 means no rotation
+ */
+
+/**
+ * @typedef {{nodeId:NodeId}} nodeClickItem
+ */
+
+/**
+ * @typedef {{nodeId:NodeId, labelId:LabelId}} nodeLabelClickItem
+ */
+
+/**
+ * @typedef {{edgeId:EdgeId}} edgeClickItem
+ */
+
+/**
+ * @typedef {{edgeId:EdgeId, labelId:LabelId}} edgeLabelClickItem
+ */
+
+/**
+ * @typedef {'bold'|'ital'|'boldital'|'mono'|'normal'} MultiFontStyle
+ *
+ * The allowed specifiers of multi-fonts.
+ */
+
+/**
+ * @typedef {{color:string, size:number, face:string, mod:string, vadjust:number}} MultiFontOptions
+ *
+ * The full set of options of a given multi-font.
+ */
+
+/**
+ * @typedef {Array.} Pile
+ *
+ * Sequence of option objects, the order is significant.
+ * The sequence is used to determine the value of a given option.
+ *
+ * Usage principles:
+ *
+ * - All search is done in the sequence of the pile.
+ * - As soon as a value is found, the searching stops.
+ * - prototypes are totally ignored. The idea is to add option objects used as prototypes
+ * to the pile, in the correct order.
+ */
diff --git a/lib/shared/Activator.js b/lib/shared/Activator.js
new file mode 100644
index 0000000000..32017ab4c4
--- /dev/null
+++ b/lib/shared/Activator.js
@@ -0,0 +1,160 @@
+var keycharm = require('keycharm');
+var Emitter = require('emitter-component');
+var Hammer = require('../module/hammer');
+var util = require('vis-util');
+
+/**
+ * Turn an element into an clickToUse element.
+ * When not active, the element has a transparent overlay. When the overlay is
+ * clicked, the mode is changed to active.
+ * When active, the element is displayed with a blue border around it, and
+ * the interactive contents of the element can be used. When clicked outside
+ * the element, the elements mode is changed to inactive.
+ * @param {Element} container
+ * @constructor Activator
+ */
+function Activator(container) {
+ this.active = false;
+
+ this.dom = {
+ container: container
+ };
+
+ this.dom.overlay = document.createElement('div');
+ this.dom.overlay.className = 'vis-overlay';
+
+ this.dom.container.appendChild(this.dom.overlay);
+
+ this.hammer = Hammer(this.dom.overlay);
+ this.hammer.on('tap', this._onTapOverlay.bind(this));
+
+ // block all touch events (except tap)
+ var me = this;
+ var events = [
+ 'tap', 'doubletap', 'press',
+ 'pinch',
+ 'pan', 'panstart', 'panmove', 'panend'
+ ];
+ events.forEach(function (event) {
+ me.hammer.on(event, function (event) {
+ event.stopPropagation();
+ });
+ });
+
+ // attach a click event to the window, in order to deactivate when clicking outside the timeline
+ if (document && document.body) {
+ this.onClick = function (event) {
+ if (!_hasParent(event.target, container)) {
+ me.deactivate();
+ }
+ };
+ document.body.addEventListener('click', this.onClick);
+ }
+
+ if (this.keycharm !== undefined) {
+ this.keycharm.destroy();
+ }
+ this.keycharm = keycharm();
+
+ // keycharm listener only bounded when active)
+ this.escListener = this.deactivate.bind(this);
+}
+
+// turn into an event emitter
+Emitter(Activator.prototype);
+
+// The currently active activator
+Activator.current = null;
+
+/**
+ * Destroy the activator. Cleans up all created DOM and event listeners
+ */
+Activator.prototype.destroy = function () {
+ this.deactivate();
+
+ // remove dom
+ this.dom.overlay.parentNode.removeChild(this.dom.overlay);
+
+ // remove global event listener
+ if (this.onClick) {
+ document.body.removeEventListener('click', this.onClick);
+ }
+ // remove keycharm
+ if (this.keycharm !== undefined) {
+ this.keycharm.destroy();
+ }
+ this.keycharm = null;
+ // cleanup hammer instances
+ this.hammer.destroy();
+ this.hammer = null;
+ // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory)
+};
+
+/**
+ * Activate the element
+ * Overlay is hidden, element is decorated with a blue shadow border
+ */
+Activator.prototype.activate = function () {
+ // we allow only one active activator at a time
+ if (Activator.current) {
+ Activator.current.deactivate();
+ }
+ Activator.current = this;
+
+ this.active = true;
+ this.dom.overlay.style.display = 'none';
+ util.addClassName(this.dom.container, 'vis-active');
+
+ this.emit('change');
+ this.emit('activate');
+
+ // ugly hack: bind ESC after emitting the events, as the Network rebinds all
+ // keyboard events on a 'change' event
+ this.keycharm.bind('esc', this.escListener);
+};
+
+/**
+ * Deactivate the element
+ * Overlay is displayed on top of the element
+ */
+Activator.prototype.deactivate = function () {
+ this.active = false;
+ this.dom.overlay.style.display = '';
+ util.removeClassName(this.dom.container, 'vis-active');
+ this.keycharm.unbind('esc', this.escListener);
+
+ this.emit('change');
+ this.emit('deactivate');
+};
+
+/**
+ * Handle a tap event: activate the container
+ * @param {Event} event The event
+ * @private
+ */
+Activator.prototype._onTapOverlay = function (event) {
+ // activate the container
+ this.activate();
+ event.stopPropagation();
+};
+
+/**
+ * Test whether the element has the requested parent element somewhere in
+ * its chain of parent nodes.
+ * @param {HTMLElement} element
+ * @param {HTMLElement} parent
+ * @returns {boolean} Returns true when the parent is found somewhere in the
+ * chain of parent nodes.
+ * @private
+ */
+function _hasParent(element, parent) {
+ while (element) {
+ if (element === parent) {
+ return true
+ }
+ element = element.parentNode;
+ }
+ return false;
+}
+
+module.exports = Activator;
diff --git a/lib/shared/ColorPicker.js b/lib/shared/ColorPicker.js
new file mode 100644
index 0000000000..02b1265206
--- /dev/null
+++ b/lib/shared/ColorPicker.js
@@ -0,0 +1,571 @@
+import Hammer from '../module/hammer';
+import hammerUtil from '../hammerUtil';
+import util from 'vis-util';
+
+
+var htmlColors = {black: '#000000', navy: '#000080', darkblue: '#00008B', mediumblue: '#0000CD', blue: '#0000FF', darkgreen: '#006400', green: '#008000', teal: '#008080', darkcyan: '#008B8B', deepskyblue: '#00BFFF', darkturquoise: '#00CED1', mediumspringgreen: '#00FA9A', lime: '#00FF00', springgreen: '#00FF7F', aqua: '#00FFFF', cyan: '#00FFFF', midnightblue: '#191970', dodgerblue: '#1E90FF', lightseagreen: '#20B2AA', forestgreen: '#228B22', seagreen: '#2E8B57', darkslategray: '#2F4F4F', limegreen: '#32CD32', mediumseagreen: '#3CB371', turquoise: '#40E0D0', royalblue: '#4169E1', steelblue: '#4682B4', darkslateblue: '#483D8B', mediumturquoise: '#48D1CC', indigo: '#4B0082', darkolivegreen: '#556B2F', cadetblue: '#5F9EA0', cornflowerblue: '#6495ED', mediumaquamarine: '#66CDAA', dimgray: '#696969', slateblue: '#6A5ACD', olivedrab: '#6B8E23', slategray: '#708090', lightslategray: '#778899', mediumslateblue: '#7B68EE', lawngreen: '#7CFC00', chartreuse: '#7FFF00', aquamarine: '#7FFFD4', maroon: '#800000', purple: '#800080', olive: '#808000', gray: '#808080', skyblue: '#87CEEB', lightskyblue: '#87CEFA', blueviolet: '#8A2BE2', darkred: '#8B0000', darkmagenta: '#8B008B', saddlebrown: '#8B4513', darkseagreen: '#8FBC8F', lightgreen: '#90EE90', mediumpurple: '#9370D8', darkviolet: '#9400D3', palegreen: '#98FB98', darkorchid: '#9932CC', yellowgreen: '#9ACD32', sienna: '#A0522D', brown: '#A52A2A', darkgray: '#A9A9A9', lightblue: '#ADD8E6', greenyellow: '#ADFF2F', paleturquoise: '#AFEEEE', lightsteelblue: '#B0C4DE', powderblue: '#B0E0E6', firebrick: '#B22222', darkgoldenrod: '#B8860B', mediumorchid: '#BA55D3', rosybrown: '#BC8F8F', darkkhaki: '#BDB76B', silver: '#C0C0C0', mediumvioletred: '#C71585', indianred: '#CD5C5C', peru: '#CD853F', chocolate: '#D2691E', tan: '#D2B48C', lightgrey: '#D3D3D3', palevioletred: '#D87093', thistle: '#D8BFD8', orchid: '#DA70D6', goldenrod: '#DAA520', crimson: '#DC143C', gainsboro: '#DCDCDC', plum: '#DDA0DD', burlywood: '#DEB887', lightcyan: '#E0FFFF', lavender: '#E6E6FA', darksalmon: '#E9967A', violet: '#EE82EE', palegoldenrod: '#EEE8AA', lightcoral: '#F08080', khaki: '#F0E68C', aliceblue: '#F0F8FF', honeydew: '#F0FFF0', azure: '#F0FFFF', sandybrown: '#F4A460', wheat: '#F5DEB3', beige: '#F5F5DC', whitesmoke: '#F5F5F5', mintcream: '#F5FFFA', ghostwhite: '#F8F8FF', salmon: '#FA8072', antiquewhite: '#FAEBD7', linen: '#FAF0E6', lightgoldenrodyellow: '#FAFAD2', oldlace: '#FDF5E6', red: '#FF0000', fuchsia: '#FF00FF', magenta: '#FF00FF', deeppink: '#FF1493', orangered: '#FF4500', tomato: '#FF6347', hotpink: '#FF69B4', coral: '#FF7F50', darkorange: '#FF8C00', lightsalmon: '#FFA07A', orange: '#FFA500', lightpink: '#FFB6C1', pink: '#FFC0CB', gold: '#FFD700', peachpuff: '#FFDAB9', navajowhite: '#FFDEAD', moccasin: '#FFE4B5', bisque: '#FFE4C4', mistyrose: '#FFE4E1', blanchedalmond: '#FFEBCD', papayawhip: '#FFEFD5', lavenderblush: '#FFF0F5', seashell: '#FFF5EE', cornsilk: '#FFF8DC', lemonchiffon: '#FFFACD', floralwhite: '#FFFAF0', snow: '#FFFAFA', yellow: '#FFFF00', lightyellow: '#FFFFE0', ivory: '#FFFFF0', white: '#FFFFFF'};
+
+/**
+ * @param {number} [pixelRatio=1]
+ */
+class ColorPicker {
+ /**
+ * @param {number} [pixelRatio=1]
+ */
+ constructor(pixelRatio = 1) {
+ this.pixelRatio = pixelRatio;
+ this.generated = false;
+ this.centerCoordinates = {x:289/2, y:289/2};
+ this.r = 289 * 0.49;
+ this.color = {r:255,g:255,b:255,a:1.0};
+ this.hueCircle = undefined;
+ this.initialColor = {r:255,g:255,b:255,a:1.0};
+ this.previousColor= undefined;
+ this.applied = false;
+
+ // bound by
+ this.updateCallback = () => {};
+ this.closeCallback = () => {};
+
+ // create all DOM elements
+ this._create();
+ }
+
+
+ /**
+ * this inserts the colorPicker into a div from the DOM
+ * @param {Element} container
+ */
+ insertTo(container) {
+ if (this.hammer !== undefined) {
+ this.hammer.destroy();
+ this.hammer = undefined;
+ }
+ this.container = container;
+ this.container.appendChild(this.frame);
+ this._bindHammer();
+
+ this._setSize();
+ }
+
+ /**
+ * the callback is executed on apply and save. Bind it to the application
+ * @param {function} callback
+ */
+ setUpdateCallback(callback) {
+ if (typeof callback === 'function') {
+ this.updateCallback = callback;
+ }
+ else {
+ throw new Error("Function attempted to set as colorPicker update callback is not a function.");
+ }
+ }
+
+ /**
+ * the callback is executed on apply and save. Bind it to the application
+ * @param {function} callback
+ */
+ setCloseCallback(callback) {
+ if (typeof callback === 'function') {
+ this.closeCallback = callback;
+ }
+ else {
+ throw new Error("Function attempted to set as colorPicker closing callback is not a function.");
+ }
+ }
+
+ /**
+ *
+ * @param {string} color
+ * @returns {String}
+ * @private
+ */
+ _isColorString(color) {
+ if (typeof color === 'string') {
+ return htmlColors[color];
+ }
+ }
+
+
+ /**
+ * Set the color of the colorPicker
+ * Supported formats:
+ * 'red' --> HTML color string
+ * '#ffffff' --> hex string
+ * 'rgb(255,255,255)' --> rgb string
+ * 'rgba(255,255,255,1.0)' --> rgba string
+ * {r:255,g:255,b:255} --> rgb object
+ * {r:255,g:255,b:255,a:1.0} --> rgba object
+ * @param {string|Object} color
+ * @param {boolean} [setInitial=true]
+ */
+ setColor(color, setInitial = true) {
+ if (color === 'none') {
+ return;
+ }
+
+ let rgba;
+
+ // if a html color shorthand is used, convert to hex
+ var htmlColor = this._isColorString(color);
+ if (htmlColor !== undefined) {
+ color = htmlColor;
+ }
+
+ // check format
+ if (util.isString(color) === true) {
+ if (util.isValidRGB(color) === true) {
+ let rgbaArray = color.substr(4).substr(0, color.length - 5).split(',');
+ rgba = {r:rgbaArray[0], g:rgbaArray[1], b:rgbaArray[2], a:1.0};
+ }
+ else if (util.isValidRGBA(color) === true) {
+ let rgbaArray = color.substr(5).substr(0, color.length - 6).split(',');
+ rgba = {r:rgbaArray[0], g:rgbaArray[1], b:rgbaArray[2], a:rgbaArray[3]};
+ }
+ else if (util.isValidHex(color) === true) {
+ let rgbObj = util.hexToRGB(color);
+ rgba = {r:rgbObj.r, g:rgbObj.g, b:rgbObj.b, a:1.0};
+ }
+ }
+ else {
+ if (color instanceof Object) {
+ if (color.r !== undefined && color.g !== undefined && color.b !== undefined) {
+ let alpha = color.a !== undefined ? color.a : '1.0';
+ rgba = {r:color.r, g:color.g, b:color.b, a:alpha};
+ }
+ }
+ }
+
+ // set color
+ if (rgba === undefined) {
+ throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: " + JSON.stringify(color));
+ }
+ else {
+ this._setColor(rgba, setInitial);
+ }
+ }
+
+
+ /**
+ * this shows the color picker.
+ * The hue circle is constructed once and stored.
+ */
+ show() {
+ if (this.closeCallback !== undefined) {
+ this.closeCallback();
+ this.closeCallback = undefined;
+ }
+
+ this.applied = false;
+ this.frame.style.display = 'block';
+ this._generateHueCircle();
+ }
+
+ // ------------------------------------------ PRIVATE ----------------------------- //
+
+ /**
+ * Hide the picker. Is called by the cancel button.
+ * Optional boolean to store the previous color for easy access later on.
+ * @param {boolean} [storePrevious=true]
+ * @private
+ */
+ _hide(storePrevious = true) {
+ // store the previous color for next time;
+ if (storePrevious === true) {
+ this.previousColor = util.extend({}, this.color);
+ }
+
+ if (this.applied === true) {
+ this.updateCallback(this.initialColor);
+ }
+
+ this.frame.style.display = 'none';
+
+ // call the closing callback, restoring the onclick method.
+ // this is in a setTimeout because it will trigger the show again before the click is done.
+ setTimeout(() => {
+ if (this.closeCallback !== undefined) {
+ this.closeCallback();
+ this.closeCallback = undefined;
+ }
+ },0);
+ }
+
+
+ /**
+ * bound to the save button. Saves and hides.
+ * @private
+ */
+ _save() {
+ this.updateCallback(this.color);
+ this.applied = false;
+ this._hide();
+ }
+
+
+ /**
+ * Bound to apply button. Saves but does not close. Is undone by the cancel button.
+ * @private
+ */
+ _apply() {
+ this.applied = true;
+ this.updateCallback(this.color);
+ this._updatePicker(this.color);
+ }
+
+
+ /**
+ * load the color from the previous session.
+ * @private
+ */
+ _loadLast() {
+ if (this.previousColor !== undefined) {
+ this.setColor(this.previousColor, false);
+ }
+ else {
+ alert("There is no last color to load...");
+ }
+ }
+
+
+ /**
+ * set the color, place the picker
+ * @param {Object} rgba
+ * @param {boolean} [setInitial=true]
+ * @private
+ */
+ _setColor(rgba, setInitial = true) {
+ // store the initial color
+ if (setInitial === true) {
+ this.initialColor = util.extend({}, rgba);
+ }
+
+ this.color = rgba;
+ let hsv = util.RGBToHSV(rgba.r, rgba.g, rgba.b);
+
+ let angleConvert = 2 * Math.PI;
+ let radius = this.r * hsv.s;
+ let x = this.centerCoordinates.x + radius * Math.sin(angleConvert * hsv.h);
+ let y = this.centerCoordinates.y + radius * Math.cos(angleConvert * hsv.h);
+
+ this.colorPickerSelector.style.left = x - 0.5 * this.colorPickerSelector.clientWidth + 'px';
+ this.colorPickerSelector.style.top = y - 0.5 * this.colorPickerSelector.clientHeight + 'px';
+
+ this._updatePicker(rgba);
+ }
+
+
+ /**
+ * bound to opacity control
+ * @param {number} value
+ * @private
+ */
+ _setOpacity(value) {
+ this.color.a = value / 100;
+ this._updatePicker(this.color);
+ }
+
+
+ /**
+ * bound to brightness control
+ * @param {number} value
+ * @private
+ */
+ _setBrightness(value) {
+ let hsv = util.RGBToHSV(this.color.r, this.color.g, this.color.b);
+ hsv.v = value / 100;
+ let rgba = util.HSVToRGB(hsv.h, hsv.s, hsv.v);
+ rgba['a'] = this.color.a;
+ this.color = rgba;
+ this._updatePicker();
+ }
+
+
+ /**
+ * update the color picker. A black circle overlays the hue circle to mimic the brightness decreasing.
+ * @param {Object} rgba
+ * @private
+ */
+ _updatePicker(rgba = this.color) {
+ let hsv = util.RGBToHSV(rgba.r, rgba.g, rgba.b);
+ let ctx = this.colorPickerCanvas.getContext('2d');
+ if (this.pixelRation === undefined) {
+ this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||
+ ctx.mozBackingStorePixelRatio ||
+ ctx.msBackingStorePixelRatio ||
+ ctx.oBackingStorePixelRatio ||
+ ctx.backingStorePixelRatio || 1);
+ }
+ ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);
+
+ // clear the canvas
+ let w = this.colorPickerCanvas.clientWidth;
+ let h = this.colorPickerCanvas.clientHeight;
+ ctx.clearRect(0, 0, w, h);
+
+ ctx.putImageData(this.hueCircle, 0,0);
+ ctx.fillStyle = 'rgba(0,0,0,' + (1- hsv.v) + ')';
+ ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r);
+ ctx.fill();
+
+ this.brightnessRange.value = 100 * hsv.v;
+ this.opacityRange.value = 100 * rgba.a;
+
+ this.initialColorDiv.style.backgroundColor = 'rgba(' + this.initialColor.r + ',' + this.initialColor.g + ',' + this.initialColor.b + ',' + this.initialColor.a + ')';
+ this.newColorDiv.style.backgroundColor = 'rgba(' + this.color.r + ',' + this.color.g + ',' + this.color.b + ',' + this.color.a + ')';
+ }
+
+
+ /**
+ * used by create to set the size of the canvas.
+ * @private
+ */
+ _setSize() {
+ this.colorPickerCanvas.style.width = '100%';
+ this.colorPickerCanvas.style.height = '100%';
+
+ this.colorPickerCanvas.width = 289 * this.pixelRatio;
+ this.colorPickerCanvas.height = 289 * this.pixelRatio;
+ }
+
+
+ /**
+ * create all dom elements
+ * TODO: cleanup, lots of similar dom elements
+ * @private
+ */
+ _create() {
+ this.frame = document.createElement('div');
+ this.frame.className = 'vis-color-picker';
+
+ this.colorPickerDiv = document.createElement('div');
+ this.colorPickerSelector = document.createElement('div');
+ this.colorPickerSelector.className = 'vis-selector';
+ this.colorPickerDiv.appendChild(this.colorPickerSelector);
+
+ this.colorPickerCanvas = document.createElement('canvas');
+ this.colorPickerDiv.appendChild(this.colorPickerCanvas);
+
+ if (!this.colorPickerCanvas.getContext) {
+ let noCanvas = document.createElement( 'DIV' );
+ noCanvas.style.color = 'red';
+ noCanvas.style.fontWeight = 'bold' ;
+ noCanvas.style.padding = '10px';
+ noCanvas.innerHTML = 'Error: your browser does not support HTML canvas';
+ this.colorPickerCanvas.appendChild(noCanvas);
+ }
+ else {
+ let ctx = this.colorPickerCanvas.getContext("2d");
+ this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||
+ ctx.mozBackingStorePixelRatio ||
+ ctx.msBackingStorePixelRatio ||
+ ctx.oBackingStorePixelRatio ||
+ ctx.backingStorePixelRatio || 1);
+ this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);
+ }
+
+ this.colorPickerDiv.className = 'vis-color';
+
+ this.opacityDiv = document.createElement('div');
+ this.opacityDiv.className = 'vis-opacity';
+
+ this.brightnessDiv = document.createElement('div');
+ this.brightnessDiv.className = 'vis-brightness';
+
+ this.arrowDiv = document.createElement('div');
+ this.arrowDiv.className = 'vis-arrow';
+
+ this.opacityRange = document.createElement('input');
+ try {
+ this.opacityRange.type = 'range'; // Not supported on IE9
+ this.opacityRange.min = '0';
+ this.opacityRange.max = '100';
+ }
+ // TODO: Add some error handling and remove this lint exception
+ catch (err) {} // eslint-disable-line no-empty
+ this.opacityRange.value = '100';
+ this.opacityRange.className = 'vis-range';
+
+ this.brightnessRange = document.createElement('input');
+ try {
+ this.brightnessRange.type = 'range'; // Not supported on IE9
+ this.brightnessRange.min = '0';
+ this.brightnessRange.max = '100';
+ }
+ // TODO: Add some error handling and remove this lint exception
+ catch (err) {} // eslint-disable-line no-empty
+ this.brightnessRange.value = '100';
+ this.brightnessRange.className = 'vis-range';
+
+ this.opacityDiv.appendChild(this.opacityRange);
+ this.brightnessDiv.appendChild(this.brightnessRange);
+
+ var me = this;
+ this.opacityRange.onchange = function () {me._setOpacity(this.value);};
+ this.opacityRange.oninput = function () {me._setOpacity(this.value);};
+ this.brightnessRange.onchange = function () {me._setBrightness(this.value);};
+ this.brightnessRange.oninput = function () {me._setBrightness(this.value);};
+
+ this.brightnessLabel = document.createElement("div");
+ this.brightnessLabel.className = "vis-label vis-brightness";
+ this.brightnessLabel.innerHTML = 'brightness:';
+
+ this.opacityLabel = document.createElement("div");
+ this.opacityLabel.className = "vis-label vis-opacity";
+ this.opacityLabel.innerHTML = 'opacity:';
+
+ this.newColorDiv = document.createElement("div");
+ this.newColorDiv.className = "vis-new-color";
+ this.newColorDiv.innerHTML = 'new';
+
+ this.initialColorDiv = document.createElement("div");
+ this.initialColorDiv.className = "vis-initial-color";
+ this.initialColorDiv.innerHTML = 'initial';
+
+ this.cancelButton = document.createElement("div");
+ this.cancelButton.className = "vis-button vis-cancel";
+ this.cancelButton.innerHTML = 'cancel';
+ this.cancelButton.onclick = this._hide.bind(this, false);
+
+ this.applyButton = document.createElement("div");
+ this.applyButton.className = "vis-button vis-apply";
+ this.applyButton.innerHTML = 'apply';
+ this.applyButton.onclick = this._apply.bind(this);
+
+ this.saveButton = document.createElement("div");
+ this.saveButton.className = "vis-button vis-save";
+ this.saveButton.innerHTML = 'save';
+ this.saveButton.onclick = this._save.bind(this);
+
+ this.loadButton = document.createElement("div");
+ this.loadButton.className = "vis-button vis-load";
+ this.loadButton.innerHTML = 'load last';
+ this.loadButton.onclick = this._loadLast.bind(this);
+
+ this.frame.appendChild(this.colorPickerDiv);
+ this.frame.appendChild(this.arrowDiv);
+ this.frame.appendChild(this.brightnessLabel);
+ this.frame.appendChild(this.brightnessDiv);
+ this.frame.appendChild(this.opacityLabel);
+ this.frame.appendChild(this.opacityDiv);
+ this.frame.appendChild(this.newColorDiv);
+ this.frame.appendChild(this.initialColorDiv);
+
+ this.frame.appendChild(this.cancelButton);
+ this.frame.appendChild(this.applyButton);
+ this.frame.appendChild(this.saveButton);
+ this.frame.appendChild(this.loadButton);
+ }
+
+
+ /**
+ * bind hammer to the color picker
+ * @private
+ */
+ _bindHammer() {
+ this.drag = {};
+ this.pinch = {};
+ this.hammer = new Hammer(this.colorPickerCanvas);
+ this.hammer.get('pinch').set({enable: true});
+
+ hammerUtil.onTouch(this.hammer, (event) => {this._moveSelector(event)});
+ this.hammer.on('tap', (event) => {this._moveSelector(event)});
+ this.hammer.on('panstart', (event) => {this._moveSelector(event)});
+ this.hammer.on('panmove', (event) => {this._moveSelector(event)});
+ this.hammer.on('panend', (event) => {this._moveSelector(event)});
+ }
+
+
+ /**
+ * generate the hue circle. This is relatively heavy (200ms) and is done only once on the first time it is shown.
+ * @private
+ */
+ _generateHueCircle() {
+ if (this.generated === false) {
+ let ctx = this.colorPickerCanvas.getContext('2d');
+ if (this.pixelRation === undefined) {
+ this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio ||
+ ctx.mozBackingStorePixelRatio ||
+ ctx.msBackingStorePixelRatio ||
+ ctx.oBackingStorePixelRatio ||
+ ctx.backingStorePixelRatio || 1);
+ }
+ ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0);
+
+ // clear the canvas
+ let w = this.colorPickerCanvas.clientWidth;
+ let h = this.colorPickerCanvas.clientHeight;
+ ctx.clearRect(0, 0, w, h);
+
+
+ // draw hue circle
+ let x, y, hue, sat;
+ this.centerCoordinates = {x: w * 0.5, y: h * 0.5};
+ this.r = 0.49 * w;
+ let angleConvert = (2 * Math.PI) / 360;
+ let hfac = 1 / 360;
+ let sfac = 1 / this.r;
+ let rgb;
+ for (hue = 0; hue < 360; hue++) {
+ for (sat = 0; sat < this.r; sat++) {
+ x = this.centerCoordinates.x + sat * Math.sin(angleConvert * hue);
+ y = this.centerCoordinates.y + sat * Math.cos(angleConvert * hue);
+ rgb = util.HSVToRGB(hue * hfac, sat * sfac, 1);
+ ctx.fillStyle = 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';
+ ctx.fillRect(x - 0.5, y - 0.5, 2, 2);
+ }
+ }
+ ctx.strokeStyle = 'rgba(0,0,0,1)';
+ ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r);
+ ctx.stroke();
+
+ this.hueCircle = ctx.getImageData(0,0,w,h);
+ }
+ this.generated = true;
+ }
+
+
+ /**
+ * move the selector. This is called by hammer functions.
+ *
+ * @param {Event} event The event
+ * @private
+ */
+ _moveSelector(event) {
+ let rect = this.colorPickerDiv.getBoundingClientRect();
+ let left = event.center.x - rect.left;
+ let top = event.center.y - rect.top;
+
+ let centerY = 0.5 * this.colorPickerDiv.clientHeight;
+ let centerX = 0.5 * this.colorPickerDiv.clientWidth;
+
+ let x = left - centerX;
+ let y = top - centerY;
+
+ let angle = Math.atan2(x,y);
+ let radius = 0.98 * Math.min(Math.sqrt(x * x + y * y), centerX);
+
+ let newTop = Math.cos(angle) * radius + centerY;
+ let newLeft = Math.sin(angle) * radius + centerX;
+
+ this.colorPickerSelector.style.top = newTop - 0.5 * this.colorPickerSelector.clientHeight + 'px';
+ this.colorPickerSelector.style.left = newLeft - 0.5 * this.colorPickerSelector.clientWidth + 'px';
+
+ // set color
+ let h = angle / (2 * Math.PI);
+ h = h < 0 ? h + 1 : h;
+ let s = radius / this.r;
+ let hsv = util.RGBToHSV(this.color.r, this.color.g, this.color.b);
+ hsv.h = h;
+ hsv.s = s;
+ let rgba = util.HSVToRGB(hsv.h, hsv.s, hsv.v);
+ rgba['a'] = this.color.a;
+ this.color = rgba;
+
+ // update previews
+ this.initialColorDiv.style.backgroundColor = 'rgba(' + this.initialColor.r + ',' + this.initialColor.g + ',' + this.initialColor.b + ',' + this.initialColor.a + ')';
+ this.newColorDiv.style.backgroundColor = 'rgba(' + this.color.r + ',' + this.color.g + ',' + this.color.b + ',' + this.color.a + ')';
+ }
+}
+
+export default ColorPicker;
\ No newline at end of file
diff --git a/lib/shared/Configurator.js b/lib/shared/Configurator.js
new file mode 100644
index 0000000000..a008c365b0
--- /dev/null
+++ b/lib/shared/Configurator.js
@@ -0,0 +1,745 @@
+import util from 'vis-util';
+
+import ColorPicker from './ColorPicker';
+
+/**
+ * The way this works is for all properties of this.possible options, you can supply the property name in any form to list the options.
+ * Boolean options are recognised as Boolean
+ * Number options should be written as array: [default value, min value, max value, stepsize]
+ * Colors should be written as array: ['color', '#ffffff']
+ * Strings with should be written as array: [option1, option2, option3, ..]
+ *
+ * The options are matched with their counterparts in each of the modules and the values used in the configuration are
+ */
+class Configurator {
+ /**
+ * @param {Object} parentModule | the location where parentModule.setOptions() can be called
+ * @param {Object} defaultContainer | the default container of the module
+ * @param {Object} configureOptions | the fully configured and predefined options set found in allOptions.js
+ * @param {number} pixelRatio | canvas pixel ratio
+ */
+ constructor(parentModule, defaultContainer, configureOptions, pixelRatio = 1) {
+ this.parent = parentModule;
+ this.changedOptions = [];
+ this.container = defaultContainer;
+ this.allowCreation = false;
+
+ this.options = {};
+ this.initialized = false;
+ this.popupCounter = 0;
+ this.defaultOptions = {
+ enabled: false,
+ filter: true,
+ container: undefined,
+ showButton: true
+ };
+ util.extend(this.options, this.defaultOptions);
+
+ this.configureOptions = configureOptions;
+ this.moduleOptions = {};
+ this.domElements = [];
+ this.popupDiv = {};
+ this.popupLimit = 5;
+ this.popupHistory = {};
+ this.colorPicker = new ColorPicker(pixelRatio);
+ this.wrapper = undefined;
+ }
+
+
+ /**
+ * refresh all options.
+ * Because all modules parse their options by themselves, we just use their options. We copy them here.
+ *
+ * @param {Object} options
+ */
+ setOptions(options) {
+ if (options !== undefined) {
+ // reset the popup history because the indices may have been changed.
+ this.popupHistory = {};
+ this._removePopup();
+
+ let enabled = true;
+ if (typeof options === 'string') {
+ this.options.filter = options;
+ }
+ else if (options instanceof Array) {
+ this.options.filter = options.join();
+ }
+ else if (typeof options === 'object') {
+ if (options == null) {
+ throw new TypeError('options cannot be null');
+ }
+ if (options.container !== undefined) {
+ this.options.container = options.container;
+ }
+ if (options.filter !== undefined) {
+ this.options.filter = options.filter;
+ }
+ if (options.showButton !== undefined) {
+ this.options.showButton = options.showButton;
+ }
+ if (options.enabled !== undefined) {
+ enabled = options.enabled;
+ }
+ }
+ else if (typeof options === 'boolean') {
+ this.options.filter = true;
+ enabled = options;
+ }
+ else if (typeof options === 'function') {
+ this.options.filter = options;
+ enabled = true;
+ }
+ if (this.options.filter === false) {
+ enabled = false;
+ }
+
+ this.options.enabled = enabled;
+ }
+ this._clean();
+ }
+
+ /**
+ *
+ * @param {Object} moduleOptions
+ */
+ setModuleOptions(moduleOptions) {
+ this.moduleOptions = moduleOptions;
+ if (this.options.enabled === true) {
+ this._clean();
+ if (this.options.container !== undefined) {
+ this.container = this.options.container;
+ }
+ this._create();
+ }
+ }
+
+ /**
+ * Create all DOM elements
+ * @private
+ */
+ _create() {
+ this._clean();
+ this.changedOptions = [];
+
+ let filter = this.options.filter;
+ let counter = 0;
+ let show = false;
+ for (let option in this.configureOptions) {
+ if (this.configureOptions.hasOwnProperty(option)) {
+ this.allowCreation = false;
+ show = false;
+ if (typeof filter === 'function') {
+ show = filter(option,[]);
+ show = show || this._handleObject(this.configureOptions[option], [option], true);
+ }
+ else if (filter === true || filter.indexOf(option) !== -1) {
+ show = true;
+ }
+
+ if (show !== false) {
+ this.allowCreation = true;
+
+ // linebreak between categories
+ if (counter > 0) {
+ this._makeItem([]);
+ }
+ // a header for the category
+ this._makeHeader(option);
+
+ // get the sub options
+ this._handleObject(this.configureOptions[option], [option]);
+ }
+ counter++;
+ }
+ }
+ this._makeButton();
+ this._push();
+ //~ this.colorPicker.insertTo(this.container);
+ }
+
+
+ /**
+ * draw all DOM elements on the screen
+ * @private
+ */
+ _push() {
+ this.wrapper = document.createElement('div');
+ this.wrapper.className = 'vis-configuration-wrapper';
+ this.container.appendChild(this.wrapper);
+ for (var i = 0; i < this.domElements.length; i++) {
+ this.wrapper.appendChild(this.domElements[i]);
+ }
+
+ this._showPopupIfNeeded()
+ }
+
+
+ /**
+ * delete all DOM elements
+ * @private
+ */
+ _clean() {
+ for (var i = 0; i < this.domElements.length; i++) {
+ this.wrapper.removeChild(this.domElements[i]);
+ }
+
+ if (this.wrapper !== undefined) {
+ this.container.removeChild(this.wrapper);
+ this.wrapper = undefined;
+ }
+ this.domElements = [];
+
+ this._removePopup();
+ }
+
+
+ /**
+ * get the value from the actualOptions if it exists
+ * @param {array} path | where to look for the actual option
+ * @returns {*}
+ * @private
+ */
+ _getValue(path) {
+ let base = this.moduleOptions;
+ for (let i = 0; i < path.length; i++) {
+ if (base[path[i]] !== undefined) {
+ base = base[path[i]];
+ }
+ else {
+ base = undefined;
+ break;
+ }
+ }
+ return base;
+ }
+
+
+ /**
+ * all option elements are wrapped in an item
+ * @param {Array} path | where to look for the actual option
+ * @param {Array.} domElements
+ * @returns {number}
+ * @private
+ */
+ _makeItem(path, ...domElements) {
+ if (this.allowCreation === true) {
+ let item = document.createElement('div');
+ item.className = 'vis-configuration vis-config-item vis-config-s' + path.length;
+ domElements.forEach((element) => {
+ item.appendChild(element);
+ });
+ this.domElements.push(item);
+ return this.domElements.length;
+ }
+ return 0;
+ }
+
+
+ /**
+ * header for major subjects
+ * @param {string} name
+ * @private
+ */
+ _makeHeader(name) {
+ let div = document.createElement('div');
+ div.className = 'vis-configuration vis-config-header';
+ div.innerHTML = name;
+ this._makeItem([],div);
+ }
+
+
+ /**
+ * make a label, if it is an object label, it gets different styling.
+ * @param {string} name
+ * @param {array} path | where to look for the actual option
+ * @param {string} objectLabel
+ * @returns {HTMLElement}
+ * @private
+ */
+ _makeLabel(name, path, objectLabel = false) {
+ let div = document.createElement('div');
+ div.className = 'vis-configuration vis-config-label vis-config-s' + path.length;
+ if (objectLabel === true) {
+ div.innerHTML = '' + name + ': ';
+ }
+ else {
+ div.innerHTML = name + ':';
+ }
+ return div;
+ }
+
+
+ /**
+ * make a dropdown list for multiple possible string optoins
+ * @param {Array.} arr
+ * @param {number} value
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _makeDropdown(arr, value, path) {
+ let select = document.createElement('select');
+ select.className = 'vis-configuration vis-config-select';
+ let selectedValue = 0;
+ if (value !== undefined) {
+ if (arr.indexOf(value) !== -1) {
+ selectedValue = arr.indexOf(value);
+ }
+ }
+
+ for (let i = 0; i < arr.length; i++) {
+ let option = document.createElement('option');
+ option.value = arr[i];
+ if (i === selectedValue) {
+ option.selected = 'selected';
+ }
+ option.innerHTML = arr[i];
+ select.appendChild(option);
+ }
+
+ let me = this;
+ select.onchange = function () {me._update(this.value, path);};
+
+ let label = this._makeLabel(path[path.length-1], path);
+ this._makeItem(path, label, select);
+ }
+
+
+ /**
+ * make a range object for numeric options
+ * @param {Array.} arr
+ * @param {number} value
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _makeRange(arr, value, path) {
+ let defaultValue = arr[0];
+ let min = arr[1];
+ let max = arr[2];
+ let step = arr[3];
+ let range = document.createElement('input');
+ range.className = 'vis-configuration vis-config-range';
+ try {
+ range.type = 'range'; // not supported on IE9
+ range.min = min;
+ range.max = max;
+ }
+ // TODO: Add some error handling and remove this lint exception
+ catch (err) {} // eslint-disable-line no-empty
+ range.step = step;
+
+ // set up the popup settings in case they are needed.
+ let popupString = '';
+ let popupValue = 0;
+
+ if (value !== undefined) {
+ let factor = 1.20;
+ if (value < 0 && value * factor < min) {
+ range.min = Math.ceil(value * factor);
+ popupValue = range.min;
+ popupString = 'range increased';
+ }
+ else if (value / factor < min) {
+ range.min = Math.ceil(value / factor);
+ popupValue = range.min;
+ popupString = 'range increased';
+ }
+ if (value * factor > max && max !== 1) {
+ range.max = Math.ceil(value * factor);
+ popupValue = range.max;
+ popupString = 'range increased';
+ }
+ range.value = value;
+ }
+ else {
+ range.value = defaultValue;
+ }
+
+ let input = document.createElement('input');
+ input.className = 'vis-configuration vis-config-rangeinput';
+ input.value = range.value;
+
+ var me = this;
+ range.onchange = function () {input.value = this.value; me._update(Number(this.value), path);};
+ range.oninput = function () {input.value = this.value; };
+
+ let label = this._makeLabel(path[path.length-1], path);
+ let itemIndex = this._makeItem(path, label, range, input);
+
+ // if a popup is needed AND it has not been shown for this value, show it.
+ if (popupString !== '' && this.popupHistory[itemIndex] !== popupValue) {
+ this.popupHistory[itemIndex] = popupValue;
+ this._setupPopup(popupString, itemIndex);
+ }
+ }
+
+ /**
+ * make a button object
+ * @private
+ */
+ _makeButton() {
+ if (this.options.showButton === true) {
+ let generateButton = document.createElement('div');
+ generateButton.className = 'vis-configuration vis-config-button';
+ generateButton.innerHTML = 'generate options';
+ generateButton.onclick = () => {this._printOptions();};
+ generateButton.onmouseover = () => {generateButton.className = 'vis-configuration vis-config-button hover';};
+ generateButton.onmouseout = () => {generateButton.className = 'vis-configuration vis-config-button';};
+
+ this.optionsContainer = document.createElement('div');
+ this.optionsContainer.className = 'vis-configuration vis-config-option-container';
+
+ this.domElements.push(this.optionsContainer);
+ this.domElements.push(generateButton);
+ }
+ }
+
+
+ /**
+ * prepare the popup
+ * @param {string} string
+ * @param {number} index
+ * @private
+ */
+ _setupPopup(string, index) {
+ if (this.initialized === true && this.allowCreation === true && this.popupCounter < this.popupLimit) {
+ let div = document.createElement("div");
+ div.id = "vis-configuration-popup";
+ div.className = "vis-configuration-popup";
+ div.innerHTML = string;
+ div.onclick = () => {this._removePopup()};
+ this.popupCounter += 1;
+ this.popupDiv = {html:div, index:index};
+ }
+ }
+
+
+ /**
+ * remove the popup from the dom
+ * @private
+ */
+ _removePopup() {
+ if (this.popupDiv.html !== undefined) {
+ this.popupDiv.html.parentNode.removeChild(this.popupDiv.html);
+ clearTimeout(this.popupDiv.hideTimeout);
+ clearTimeout(this.popupDiv.deleteTimeout);
+ this.popupDiv = {};
+ }
+ }
+
+
+ /**
+ * Show the popup if it is needed.
+ * @private
+ */
+ _showPopupIfNeeded() {
+ if (this.popupDiv.html !== undefined) {
+ let correspondingElement = this.domElements[this.popupDiv.index];
+ let rect = correspondingElement.getBoundingClientRect();
+ this.popupDiv.html.style.left = rect.left + "px";
+ this.popupDiv.html.style.top = rect.top - 30 + "px"; // 30 is the height;
+ document.body.appendChild(this.popupDiv.html)
+ this.popupDiv.hideTimeout = setTimeout(() => {
+ this.popupDiv.html.style.opacity = 0;
+ },1500);
+ this.popupDiv.deleteTimeout = setTimeout(() => {
+ this._removePopup();
+ },1800)
+ }
+ }
+
+ /**
+ * make a checkbox for boolean options.
+ * @param {number} defaultValue
+ * @param {number} value
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _makeCheckbox(defaultValue, value, path) {
+ var checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.className = 'vis-configuration vis-config-checkbox';
+ checkbox.checked = defaultValue;
+ if (value !== undefined) {
+ checkbox.checked = value;
+ if (value !== defaultValue) {
+ if (typeof defaultValue === 'object') {
+ if (value !== defaultValue.enabled) {
+ this.changedOptions.push({path:path, value:value});
+ }
+ }
+ else {
+ this.changedOptions.push({path:path, value:value});
+ }
+ }
+ }
+
+ let me = this;
+ checkbox.onchange = function() {me._update(this.checked, path)};
+
+ let label = this._makeLabel(path[path.length-1], path);
+ this._makeItem(path, label, checkbox);
+ }
+
+ /**
+ * make a text input field for string options.
+ * @param {number} defaultValue
+ * @param {number} value
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _makeTextInput(defaultValue, value, path) {
+ var checkbox = document.createElement('input');
+ checkbox.type = 'text';
+ checkbox.className = 'vis-configuration vis-config-text';
+ checkbox.value = value;
+ if (value !== defaultValue) {
+ this.changedOptions.push({path:path, value:value});
+ }
+
+ let me = this;
+ checkbox.onchange = function() {me._update(this.value, path)};
+
+ let label = this._makeLabel(path[path.length-1], path);
+ this._makeItem(path, label, checkbox);
+ }
+
+
+ /**
+ * make a color field with a color picker for color fields
+ * @param {Array.} arr
+ * @param {number} value
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _makeColorField(arr, value, path) {
+ let defaultColor = arr[1];
+ let div = document.createElement('div');
+ value = value === undefined ? defaultColor : value;
+
+ if (value !== 'none') {
+ div.className = 'vis-configuration vis-config-colorBlock';
+ div.style.backgroundColor = value;
+ }
+ else {
+ div.className = 'vis-configuration vis-config-colorBlock none';
+ }
+
+ value = value === undefined ? defaultColor : value;
+ div.onclick = () => {
+ this._showColorPicker(value,div,path);
+ };
+
+ let label = this._makeLabel(path[path.length-1], path);
+ this._makeItem(path,label, div);
+ }
+
+
+ /**
+ * used by the color buttons to call the color picker.
+ * @param {number} value
+ * @param {HTMLElement} div
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _showColorPicker(value, div, path) {
+ // clear the callback from this div
+ div.onclick = function() {};
+
+ this.colorPicker.insertTo(div);
+ this.colorPicker.show();
+
+ this.colorPicker.setColor(value);
+ this.colorPicker.setUpdateCallback((color) => {
+ let colorString = 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',' + color.a + ')';
+ div.style.backgroundColor = colorString;
+ this._update(colorString,path);
+ });
+
+ // on close of the colorpicker, restore the callback.
+ this.colorPicker.setCloseCallback(() => {
+ div.onclick = () => {
+ this._showColorPicker(value,div,path);
+ };
+ });
+ }
+
+
+ /**
+ * parse an object and draw the correct items
+ * @param {Object} obj
+ * @param {array} [path=[]] | where to look for the actual option
+ * @param {boolean} [checkOnly=false]
+ * @returns {boolean}
+ * @private
+ */
+ _handleObject(obj, path = [], checkOnly = false) {
+ let show = false;
+ let filter = this.options.filter;
+ let visibleInSet = false;
+ for (let subObj in obj) {
+ if (obj.hasOwnProperty(subObj)) {
+ show = true;
+ let item = obj[subObj];
+ let newPath = util.copyAndExtendArray(path, subObj);
+ if (typeof filter === 'function') {
+ show = filter(subObj,path);
+
+ // if needed we must go deeper into the object.
+ if (show === false) {
+ if (!(item instanceof Array) && typeof item !== 'string' && typeof item !== 'boolean' && item instanceof Object) {
+ this.allowCreation = false;
+ show = this._handleObject(item, newPath, true);
+ this.allowCreation = checkOnly === false;
+ }
+ }
+ }
+
+ if (show !== false) {
+ visibleInSet = true;
+ let value = this._getValue(newPath);
+
+ if (item instanceof Array) {
+ this._handleArray(item, value, newPath);
+ }
+ else if (typeof item === 'string') {
+ this._makeTextInput(item, value, newPath);
+ }
+ else if (typeof item === 'boolean') {
+ this._makeCheckbox(item, value, newPath);
+ }
+ else if (item instanceof Object) {
+ // collapse the physics options that are not enabled
+ let draw = true;
+ if (path.indexOf('physics') !== -1) {
+ if (this.moduleOptions.physics.solver !== subObj) {
+ draw = false;
+ }
+ }
+
+ if (draw === true) {
+ // initially collapse options with an disabled enabled option.
+ if (item.enabled !== undefined) {
+ let enabledPath = util.copyAndExtendArray(newPath, 'enabled');
+ let enabledValue = this._getValue(enabledPath);
+ if (enabledValue === true) {
+ let label = this._makeLabel(subObj, newPath, true);
+ this._makeItem(newPath, label);
+ visibleInSet = this._handleObject(item, newPath) || visibleInSet;
+ }
+ else {
+ this._makeCheckbox(item, enabledValue, newPath);
+ }
+ }
+ else {
+ let label = this._makeLabel(subObj, newPath, true);
+ this._makeItem(newPath, label);
+ visibleInSet = this._handleObject(item, newPath) || visibleInSet;
+ }
+ }
+ }
+ else {
+ console.error('dont know how to handle', item, subObj, newPath);
+ }
+ }
+ }
+ }
+ return visibleInSet;
+ }
+
+
+ /**
+ * handle the array type of option
+ * @param {Array.} arr
+ * @param {number} value
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _handleArray(arr, value, path) {
+ if (typeof arr[0] === 'string' && arr[0] === 'color') {
+ this._makeColorField(arr, value, path);
+ if (arr[1] !== value) {this.changedOptions.push({path:path, value:value});}
+ }
+ else if (typeof arr[0] === 'string') {
+ this._makeDropdown(arr, value, path);
+ if (arr[0] !== value) {this.changedOptions.push({path:path, value:value});}
+ }
+ else if (typeof arr[0] === 'number') {
+ this._makeRange(arr, value, path);
+ if (arr[0] !== value) {this.changedOptions.push({path:path, value:Number(value)});}
+ }
+ }
+
+
+
+ /**
+ * called to update the network with the new settings.
+ * @param {number} value
+ * @param {array} path | where to look for the actual option
+ * @private
+ */
+ _update(value, path) {
+ let options = this._constructOptions(value,path);
+
+ if (this.parent.body && this.parent.body.emitter && this.parent.body.emitter.emit) {
+ this.parent.body.emitter.emit("configChange", options);
+ }
+ this.initialized = true;
+ this.parent.setOptions(options);
+ }
+
+
+ /**
+ *
+ * @param {string|Boolean} value
+ * @param {Array.} path
+ * @param {{}} optionsObj
+ * @returns {{}}
+ * @private
+ */
+ _constructOptions(value, path, optionsObj = {}) {
+ let pointer = optionsObj;
+
+ // when dropdown boxes can be string or boolean, we typecast it into correct types
+ value = value === 'true' ? true : value;
+ value = value === 'false' ? false : value;
+
+ for (let i = 0; i < path.length; i++) {
+ if (path[i] !== 'global') {
+ if (pointer[path[i]] === undefined) {
+ pointer[path[i]] = {};
+ }
+ if (i !== path.length - 1) {
+ pointer = pointer[path[i]];
+ }
+ else {
+ pointer[path[i]] = value;
+ }
+ }
+ }
+ return optionsObj;
+ }
+
+ /**
+ * @private
+ */
+ _printOptions() {
+ let options = this.getOptions();
+ this.optionsContainer.innerHTML = 'var options = ' + JSON.stringify(options, null, 2) + ' ';
+ }
+
+ /**
+ *
+ * @returns {{}} options
+ */
+ getOptions() {
+ let options = {};
+ for (var i = 0; i < this.changedOptions.length; i++) {
+ this._constructOptions(this.changedOptions[i].value, this.changedOptions[i].path, options)
+ }
+ return options;
+ }
+}
+
+
+export default Configurator;
\ No newline at end of file
diff --git a/lib/shared/Popup.js b/lib/shared/Popup.js
new file mode 100644
index 0000000000..c8a9828cdc
--- /dev/null
+++ b/lib/shared/Popup.js
@@ -0,0 +1,132 @@
+/**
+ * Popup is a class to create a popup window with some text
+ */
+class Popup {
+ /**
+ * @param {Element} container The container object.
+ * @param {string} overflowMethod How the popup should act to overflowing ('flip' or 'cap')
+ */
+ constructor(container, overflowMethod) {
+ this.container = container;
+ this.overflowMethod = overflowMethod || 'cap';
+
+ this.x = 0;
+ this.y = 0;
+ this.padding = 5;
+ this.hidden = false;
+
+ // create the frame
+ this.frame = document.createElement('div');
+ this.frame.className = 'vis-tooltip';
+ this.container.appendChild(this.frame);
+ }
+
+ /**
+ * @param {number} x Horizontal position of the popup window
+ * @param {number} y Vertical position of the popup window
+ */
+ setPosition(x, y) {
+ this.x = parseInt(x);
+ this.y = parseInt(y);
+ }
+
+ /**
+ * Set the content for the popup window. This can be HTML code or text.
+ * @param {string | Element} content
+ */
+ setText(content) {
+ if (content instanceof Element) {
+ this.frame.innerHTML = '';
+ this.frame.appendChild(content);
+ }
+ else {
+ this.frame.innerHTML = content; // string containing text or HTML
+ }
+ }
+
+ /**
+ * Show the popup window
+ * @param {boolean} [doShow] Show or hide the window
+ */
+ show(doShow) {
+ if (doShow === undefined) {
+ doShow = true;
+ }
+
+ if (doShow === true) {
+ var height = this.frame.clientHeight;
+ var width = this.frame.clientWidth;
+ var maxHeight = this.frame.parentNode.clientHeight;
+ var maxWidth = this.frame.parentNode.clientWidth;
+
+ var left = 0, top = 0;
+
+ if (this.overflowMethod == 'flip') {
+ var isLeft = false, isTop = true; // Where around the position it's located
+
+ if (this.y - height < this.padding) {
+ isTop = false;
+ }
+
+ if (this.x + width > maxWidth - this.padding) {
+ isLeft = true;
+ }
+
+ if (isLeft) {
+ left = this.x - width;
+ } else {
+ left = this.x;
+ }
+
+ if (isTop) {
+ top = this.y - height;
+ } else {
+ top = this.y;
+ }
+ } else {
+ top = (this.y - height);
+ if (top + height + this.padding > maxHeight) {
+ top = maxHeight - height - this.padding;
+ }
+ if (top < this.padding) {
+ top = this.padding;
+ }
+
+ left = this.x;
+ if (left + width + this.padding > maxWidth) {
+ left = maxWidth - width - this.padding;
+ }
+ if (left < this.padding) {
+ left = this.padding;
+ }
+ }
+
+ this.frame.style.left = left + "px";
+ this.frame.style.top = top + "px";
+ this.frame.style.visibility = "visible";
+ this.hidden = false;
+ }
+ else {
+ this.hide();
+ }
+ }
+
+ /**
+ * Hide the popup window
+ */
+ hide() {
+ this.hidden = true;
+ this.frame.style.left = "0";
+ this.frame.style.top = "0";
+ this.frame.style.visibility = "hidden";
+ }
+
+ /**
+ * Remove the popup window
+ */
+ destroy() {
+ this.frame.parentNode.removeChild(this.frame); // Remove element from DOM
+ }
+}
+
+export default Popup;
diff --git a/lib/shared/Validator.js b/lib/shared/Validator.js
new file mode 100644
index 0000000000..130019c1b3
--- /dev/null
+++ b/lib/shared/Validator.js
@@ -0,0 +1,357 @@
+import util from 'vis-util';
+
+let errorFound = false;
+let allOptions;
+let printStyle = 'background: #FFeeee; color: #dd0000';
+/**
+ * Used to validate options.
+ */
+class Validator {
+ /**
+ * @ignore
+ */
+ constructor() {
+ }
+
+ /**
+ * Main function to be called
+ * @param {Object} options
+ * @param {Object} referenceOptions
+ * @param {Object} subObject
+ * @returns {boolean}
+ * @static
+ */
+ static validate(options, referenceOptions, subObject) {
+ errorFound = false;
+ allOptions = referenceOptions;
+ let usedOptions = referenceOptions;
+ if (subObject !== undefined) {
+ usedOptions = referenceOptions[subObject];
+ }
+ Validator.parse(options, usedOptions, []);
+ return errorFound;
+ }
+
+
+ /**
+ * Will traverse an object recursively and check every value
+ * @param {Object} options
+ * @param {Object} referenceOptions
+ * @param {array} path | where to look for the actual option
+ * @static
+ */
+ static parse(options, referenceOptions, path) {
+ for (let option in options) {
+ if (options.hasOwnProperty(option)) {
+ Validator.check(option, options, referenceOptions, path);
+ }
+ }
+ }
+
+
+ /**
+ * Check every value. If the value is an object, call the parse function on that object.
+ * @param {string} option
+ * @param {Object} options
+ * @param {Object} referenceOptions
+ * @param {array} path | where to look for the actual option
+ * @static
+ */
+ static check(option, options, referenceOptions, path) {
+ if (referenceOptions[option] === undefined && referenceOptions.__any__ === undefined) {
+ Validator.getSuggestion(option, referenceOptions, path);
+ return;
+ }
+
+ let referenceOption = option;
+ let is_object = true;
+
+ if (referenceOptions[option] === undefined && referenceOptions.__any__ !== undefined) {
+ // NOTE: This only triggers if the __any__ is in the top level of the options object.
+ // THAT'S A REALLY BAD PLACE TO ALLOW IT!!!!
+ // TODO: Examine if needed, remove if possible
+
+ // __any__ is a wildcard. Any value is accepted and will be further analysed by reference.
+ referenceOption = '__any__';
+
+ // if the any-subgroup is not a predefined object in the configurator,
+ // we do not look deeper into the object.
+ is_object = (Validator.getType(options[option]) === 'object');
+ }
+ else {
+ // Since all options in the reference are objects, we can check whether
+ // they are supposed to be the object to look for the __type__ field.
+ // if this is an object, we check if the correct type has been supplied to account for shorthand options.
+ }
+
+ let refOptionObj = referenceOptions[referenceOption];
+ if (is_object && refOptionObj.__type__ !== undefined) {
+ refOptionObj = refOptionObj.__type__;
+ }
+
+ Validator.checkFields(option, options, referenceOptions, referenceOption, refOptionObj, path);
+ }
+
+ /**
+ *
+ * @param {string} option | the option property
+ * @param {Object} options | The supplied options object
+ * @param {Object} referenceOptions | The reference options containing all options and their allowed formats
+ * @param {string} referenceOption | Usually this is the same as option, except when handling an __any__ tag.
+ * @param {string} refOptionObj | This is the type object from the reference options
+ * @param {Array} path | where in the object is the option
+ * @static
+ */
+ static checkFields(option, options, referenceOptions, referenceOption, refOptionObj, path) {
+ let log = function(message) {
+ console.log('%c' + message + Validator.printLocation(path, option), printStyle);
+ };
+
+ let optionType = Validator.getType(options[option]);
+ let refOptionType = refOptionObj[optionType];
+
+ if (refOptionType !== undefined) {
+ // if the type is correct, we check if it is supposed to be one of a few select values
+ if (Validator.getType(refOptionType) === 'array' && refOptionType.indexOf(options[option]) === -1) {
+ log('Invalid option detected in "' + option + '".' +
+ ' Allowed values are:' + Validator.print(refOptionType) +
+ ' not "' + options[option] + '". ');
+ errorFound = true;
+ }
+ else if (optionType === 'object' && referenceOption !== "__any__") {
+ path = util.copyAndExtendArray(path, option);
+ Validator.parse(options[option], referenceOptions[referenceOption], path);
+ }
+ }
+ else if (refOptionObj['any'] === undefined) {
+ // type of the field is incorrect and the field cannot be any
+ log('Invalid type received for "' + option +
+ '". Expected: ' + Validator.print(Object.keys(refOptionObj)) +
+ '. Received [' + optionType + '] "' + options[option] + '"');
+ errorFound = true;
+ }
+ }
+
+ /**
+ *
+ * @param {Object|boolean|number|string|Array.|Date|Node|Moment|undefined|null} object
+ * @returns {string}
+ * @static
+ */
+ static getType(object) {
+ var type = typeof object;
+
+ if (type === 'object') {
+ if (object === null) {
+ return 'null';
+ }
+ if (object instanceof Boolean) {
+ return 'boolean';
+ }
+ if (object instanceof Number) {
+ return 'number';
+ }
+ if (object instanceof String) {
+ return 'string';
+ }
+ if (Array.isArray(object)) {
+ return 'array';
+ }
+ if (object instanceof Date) {
+ return 'date';
+ }
+ if (object.nodeType !== undefined) {
+ return 'dom';
+ }
+ if (object._isAMomentObject === true) {
+ return 'moment';
+ }
+ return 'object';
+ }
+ else if (type === 'number') {
+ return 'number';
+ }
+ else if (type === 'boolean') {
+ return 'boolean';
+ }
+ else if (type === 'string') {
+ return 'string';
+ }
+ else if (type === undefined) {
+ return 'undefined';
+ }
+ return type;
+ }
+
+ /**
+ * @param {string} option
+ * @param {Object} options
+ * @param {Array.} path
+ * @static
+ */
+ static getSuggestion(option, options, path) {
+ let localSearch = Validator.findInOptions(option,options,path,false);
+ let globalSearch = Validator.findInOptions(option,allOptions,[],true);
+
+ let localSearchThreshold = 8;
+ let globalSearchThreshold = 4;
+
+ let msg;
+ if (localSearch.indexMatch !== undefined) {
+ msg = ' in ' + Validator.printLocation(localSearch.path, option,'') +
+ 'Perhaps it was incomplete? Did you mean: "' + localSearch.indexMatch + '"?\n\n';
+ }
+ else if (globalSearch.distance <= globalSearchThreshold && localSearch.distance > globalSearch.distance) {
+ msg = ' in ' + Validator.printLocation(localSearch.path, option,'') +
+ 'Perhaps it was misplaced? Matching option found at: ' +
+ Validator.printLocation(globalSearch.path, globalSearch.closestMatch,'');
+ }
+ else if (localSearch.distance <= localSearchThreshold) {
+ msg = '. Did you mean "' + localSearch.closestMatch + '"?' +
+ Validator.printLocation(localSearch.path, option);
+ }
+ else {
+ msg = '. Did you mean one of these: ' + Validator.print(Object.keys(options)) +
+ Validator.printLocation(path, option);
+ }
+
+ console.log('%cUnknown option detected: "' + option + '"' + msg, printStyle);
+ errorFound = true;
+ }
+
+ /**
+ * traverse the options in search for a match.
+ * @param {string} option
+ * @param {Object} options
+ * @param {Array} path | where to look for the actual option
+ * @param {boolean} [recursive=false]
+ * @returns {{closestMatch: string, path: Array, distance: number}}
+ * @static
+ */
+ static findInOptions(option, options, path, recursive = false) {
+ let min = 1e9;
+ let closestMatch = '';
+ let closestMatchPath = [];
+ let lowerCaseOption = option.toLowerCase();
+ let indexMatch = undefined;
+ for (let op in options) { // eslint-disable-line guard-for-in
+ let distance;
+ if (options[op].__type__ !== undefined && recursive === true) {
+ let result = Validator.findInOptions(option, options[op], util.copyAndExtendArray(path,op));
+ if (min > result.distance) {
+ closestMatch = result.closestMatch;
+ closestMatchPath = result.path;
+ min = result.distance;
+ indexMatch = result.indexMatch;
+ }
+ }
+ else {
+ if (op.toLowerCase().indexOf(lowerCaseOption) !== -1) {
+ indexMatch = op;
+ }
+ distance = Validator.levenshteinDistance(option, op);
+ if (min > distance) {
+ closestMatch = op;
+ closestMatchPath = util.copyArray(path);
+ min = distance;
+ }
+ }
+ }
+ return {closestMatch:closestMatch, path:closestMatchPath, distance:min, indexMatch: indexMatch};
+ }
+
+ /**
+ * @param {Array.} path
+ * @param {Object} option
+ * @param {string} prefix
+ * @returns {String}
+ * @static
+ */
+ static printLocation(path, option, prefix = 'Problem value found at: \n') {
+ let str = '\n\n' + prefix + 'options = {\n';
+ for (let i = 0; i < path.length; i++) {
+ for (let j = 0; j < i + 1; j++) {
+ str += ' ';
+ }
+ str += path[i] + ': {\n'
+ }
+ for (let j = 0; j < path.length + 1; j++) {
+ str += ' ';
+ }
+ str += option + '\n';
+ for (let i = 0; i < path.length + 1; i++) {
+ for (let j = 0; j < path.length - i; j++) {
+ str += ' ';
+ }
+ str += '}\n'
+ }
+ return str + '\n\n';
+ }
+
+ /**
+ * @param {Object} options
+ * @returns {String}
+ * @static
+ */
+ static print(options) {
+ return JSON.stringify(options).replace(/(\")|(\[)|(\])|(,"__type__")/g, "").replace(/(\,)/g, ', ')
+ }
+
+
+ /**
+ * Compute the edit distance between the two given strings
+ * http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript
+ *
+ * Copyright (c) 2011 Andrei Mackenzie
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * @param {string} a
+ * @param {string} b
+ * @returns {Array.>}}
+ * @static
+ */
+ static levenshteinDistance(a, b) {
+ if (a.length === 0) return b.length;
+ if (b.length === 0) return a.length;
+
+ var matrix = [];
+
+ // increment along the first column of each row
+ var i;
+ for (i = 0; i <= b.length; i++) {
+ matrix[i] = [i];
+ }
+
+ // increment each column in the first row
+ var j;
+ for (j = 0; j <= a.length; j++) {
+ matrix[0][j] = j;
+ }
+
+ // Fill in the rest of the matrix
+ for (i = 1; i <= b.length; i++) {
+ for (j = 1; j <= a.length; j++) {
+ if (b.charAt(i - 1) == a.charAt(j - 1)) {
+ matrix[i][j] = matrix[i - 1][j - 1];
+ } else {
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
+ Math.min(matrix[i][j - 1] + 1, // insertion
+ matrix[i - 1][j] + 1)); // deletion
+ }
+ }
+ }
+
+ return matrix[b.length][a.length];
+ }
+}
+
+
+export {
+ Validator,
+ printStyle
+};
diff --git a/lib/shared/activator.css b/lib/shared/activator.css
new file mode 100644
index 0000000000..b23acb4325
--- /dev/null
+++ b/lib/shared/activator.css
@@ -0,0 +1,14 @@
+.vis .overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+
+ /* Must be displayed above for example selected Timeline items */
+ z-index: 10;
+}
+
+.vis-active {
+ box-shadow: 0 0 10px #86d5f8;
+}
diff --git a/lib/shared/bootstrap.css b/lib/shared/bootstrap.css
new file mode 100644
index 0000000000..3603c7665c
--- /dev/null
+++ b/lib/shared/bootstrap.css
@@ -0,0 +1,6 @@
+/* override some bootstrap styles screwing up the timelines css */
+
+.vis [class*="span"] {
+ min-height: 0;
+ width: auto;
+}
diff --git a/lib/shared/configuration.css b/lib/shared/configuration.css
new file mode 100644
index 0000000000..1913c98851
--- /dev/null
+++ b/lib/shared/configuration.css
@@ -0,0 +1,288 @@
+div.vis-configuration {
+ position:relative;
+ display:block;
+ float:left;
+ font-size:12px;
+}
+
+div.vis-configuration-wrapper {
+ display:block;
+ width:700px;
+}
+
+div.vis-configuration-wrapper::after {
+ clear: both;
+ content: "";
+ display: block;
+}
+
+div.vis-configuration.vis-config-option-container{
+ display:block;
+ width:495px;
+ background-color: #ffffff;
+ border:2px solid #f7f8fa;
+ border-radius:4px;
+ margin-top:20px;
+ left:10px;
+ padding-left:5px;
+}
+
+div.vis-configuration.vis-config-button{
+ display:block;
+ width:495px;
+ height:25px;
+ vertical-align: middle;
+ line-height:25px;
+ background-color: #f7f8fa;
+ border:2px solid #ceced0;
+ border-radius:4px;
+ margin-top:20px;
+ left:10px;
+ padding-left:5px;
+ cursor: pointer;
+ margin-bottom:30px;
+}
+
+div.vis-configuration.vis-config-button.hover{
+ background-color: #4588e6;
+ border:2px solid #214373;
+ color:#ffffff;
+}
+
+div.vis-configuration.vis-config-item{
+ display:block;
+ float:left;
+ width:495px;
+ height:25px;
+ vertical-align: middle;
+ line-height:25px;
+}
+
+
+div.vis-configuration.vis-config-item.vis-config-s2{
+ left:10px;
+ background-color: #f7f8fa;
+ padding-left:5px;
+ border-radius:3px;
+}
+div.vis-configuration.vis-config-item.vis-config-s3{
+ left:20px;
+ background-color: #e4e9f0;
+ padding-left:5px;
+ border-radius:3px;
+}
+div.vis-configuration.vis-config-item.vis-config-s4{
+ left:30px;
+ background-color: #cfd8e6;
+ padding-left:5px;
+ border-radius:3px;
+}
+
+div.vis-configuration.vis-config-header{
+ font-size:18px;
+ font-weight: bold;
+}
+
+div.vis-configuration.vis-config-label{
+ width:120px;
+ height:25px;
+ line-height: 25px;
+}
+
+div.vis-configuration.vis-config-label.vis-config-s3{
+ width:110px;
+}
+div.vis-configuration.vis-config-label.vis-config-s4{
+ width:100px;
+}
+
+div.vis-configuration.vis-config-colorBlock{
+ top:1px;
+ width:30px;
+ height:19px;
+ border:1px solid #444444;
+ border-radius:2px;
+ padding:0px;
+ margin:0px;
+ cursor:pointer;
+}
+
+input.vis-configuration.vis-config-checkbox {
+ left:-5px;
+}
+
+
+input.vis-configuration.vis-config-rangeinput{
+ position:relative;
+ top:-5px;
+ width:60px;
+ /*height:13px;*/
+ padding:1px;
+ margin:0;
+ pointer-events:none;
+}
+
+input.vis-configuration.vis-config-range{
+ /*removes default webkit styles*/
+ -webkit-appearance: none;
+
+ /*fix for FF unable to apply focus style bug */
+ border: 0px solid white;
+ background-color:rgba(0,0,0,0);
+
+ /*required for proper track sizing in FF*/
+ width: 300px;
+ height:20px;
+}
+input.vis-configuration.vis-config-range::-webkit-slider-runnable-track {
+ width: 300px;
+ height: 5px;
+ background: #dedede; /* Old browsers */
+ background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */
+ background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */
+
+ border: 1px solid #999999;
+ box-shadow: #aaaaaa 0px 0px 3px 0px;
+ border-radius: 3px;
+}
+input.vis-configuration.vis-config-range::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ border: 1px solid #14334b;
+ height: 17px;
+ width: 17px;
+ border-radius: 50%;
+ background: #3876c2; /* Old browsers */
+ background: -moz-linear-gradient(top, #3876c2 0%, #385380 100%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3876c2), color-stop(100%,#385380)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #3876c2 0%,#385380 100%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(top, #3876c2 0%,#385380 100%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #3876c2 0%,#385380 100%); /* IE10+ */
+ background: linear-gradient(to bottom, #3876c2 0%,#385380 100%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3876c2', endColorstr='#385380',GradientType=0 ); /* IE6-9 */
+ box-shadow: #111927 0px 0px 1px 0px;
+ margin-top: -7px;
+}
+input.vis-configuration.vis-config-range:focus {
+ outline: none;
+}
+input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track {
+ background: #9d9d9d; /* Old browsers */
+ background: -moz-linear-gradient(top, #9d9d9d 0%, #c8c8c8 99%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9d9d9d), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* IE10+ */
+ background: linear-gradient(to bottom, #9d9d9d 0%,#c8c8c8 99%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */
+}
+
+input.vis-configuration.vis-config-range::-moz-range-track {
+ width: 300px;
+ height: 10px;
+ background: #dedede; /* Old browsers */
+ background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */
+ background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */
+ background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */
+ background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */
+
+ border: 1px solid #999999;
+ box-shadow: #aaaaaa 0px 0px 3px 0px;
+ border-radius: 3px;
+}
+input.vis-configuration.vis-config-range::-moz-range-thumb {
+ border: none;
+ height: 16px;
+ width: 16px;
+
+ border-radius: 50%;
+ background: #385380;
+}
+
+/*hide the outline behind the border*/
+input.vis-configuration.vis-config-range:-moz-focusring{
+ outline: 1px solid white;
+ outline-offset: -1px;
+}
+
+input.vis-configuration.vis-config-range::-ms-track {
+ width: 300px;
+ height: 5px;
+
+ /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
+ background: transparent;
+
+ /*leave room for the larger thumb to overflow with a transparent border */
+ border-color: transparent;
+ border-width: 6px 0;
+
+ /*remove default tick marks*/
+ color: transparent;
+}
+input.vis-configuration.vis-config-range::-ms-fill-lower {
+ background: #777;
+ border-radius: 10px;
+}
+input.vis-configuration.vis-config-range::-ms-fill-upper {
+ background: #ddd;
+ border-radius: 10px;
+}
+input.vis-configuration.vis-config-range::-ms-thumb {
+ border: none;
+ height: 16px;
+ width: 16px;
+ border-radius: 50%;
+ background: #385380;
+}
+input.vis-configuration.vis-config-range:focus::-ms-fill-lower {
+ background: #888;
+}
+input.vis-configuration.vis-config-range:focus::-ms-fill-upper {
+ background: #ccc;
+}
+
+.vis-configuration-popup {
+ position: absolute;
+ background: rgba(57, 76, 89, 0.85);
+ border: 2px solid #f2faff;
+ line-height:30px;
+ height:30px;
+ width:150px;
+ text-align:center;
+ color: #ffffff;
+ font-size:14px;
+ border-radius:4px;
+ -webkit-transition: opacity 0.3s ease-in-out;
+ -moz-transition: opacity 0.3s ease-in-out;
+ transition: opacity 0.3s ease-in-out;
+}
+.vis-configuration-popup:after, .vis-configuration-popup:before {
+ left: 100%;
+ top: 50%;
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+}
+
+.vis-configuration-popup:after {
+ border-color: rgba(136, 183, 213, 0);
+ border-left-color: rgba(57, 76, 89, 0.85);
+ border-width: 8px;
+ margin-top: -8px;
+}
+.vis-configuration-popup:before {
+ border-color: rgba(194, 225, 245, 0);
+ border-left-color: #f2faff;
+ border-width: 12px;
+ margin-top: -12px;
+}
\ No newline at end of file
diff --git a/lib/shared/tooltip.css b/lib/shared/tooltip.css
new file mode 100644
index 0000000000..1c9694aa54
--- /dev/null
+++ b/lib/shared/tooltip.css
@@ -0,0 +1,21 @@
+div.vis-tooltip {
+ position: absolute;
+ visibility: hidden;
+ padding: 5px;
+ white-space: nowrap;
+
+ font-family: verdana;
+ font-size:14px;
+ color:#000000;
+ background-color: #f5f4ed;
+
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ border: 1px solid #808074;
+
+ box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
+ pointer-events: none;
+
+ z-index: 5;
+}
diff --git a/misc/RELEASE_CHECKLIST_TEMPLATE.md b/misc/RELEASE_CHECKLIST_TEMPLATE.md
new file mode 100644
index 0000000000..b2c92e027b
--- /dev/null
+++ b/misc/RELEASE_CHECKLIST_TEMPLATE.md
@@ -0,0 +1,87 @@
+# Release Checklist
+
+## Communication
+- [ ] Create a new issue and copy&paste this checklist into it (Yeah! First Step done!)
+- [ ] Talk to the team: Who should make the release?
+- [ ] Announce a "Code-Freeze". No new Pull-Request until the release is done!
+- [ ] Checkout if we have MAJOR or MINOR changes. If not we do a PATCH release.
+- [ ] The new version will be: `vX.Y.Z`
+- [ ] Identify open BUGS and add them to the next PATCH milestone (optional).
+- [ ] Identify MINOR issues and add them to the next MINOR milestone (optional).
+
+## Update to the newest version
+- [ ] Update to the current version: `git checkout develop && git pull`.
+- [ ] Create a new release branch. (`git checkout -b vX.Y.Z develop`)
+
+## Build & Test
+- [ ] Update the version number of the library in `package.json` (remove the "SNAPSHOT").
+- [ ] Build the library: `npm prune && rm -rf node_modules && npm install && npm run build && npm run test`
+- [ ] Open some of the examples in your browser and visually check if it works as expected! (*We need automated tests for this!*)
+
+## History
+(*THIS IS A LOT OF WORK! WE SHOULD TRY TO automate this in the future!!*)
+
+- [ ] Get all commits since the last release: ```git log `git describe --tags --abbrev=0`..HEAD --oneline > .commits.tmp```
+- [ ] Open ".commity.tmp". and remove all commit before the last release.
+- [ ] Open every commit in GitHub and move every issue/pull-request to the current milestone.
+- [ ] Transfer all Commit-Messages/issues to "HISTORY.md" starting at the button.
+ - Keep the order of the commits. Older commits are lower newers are higher.
+ - Bug-Fixes start with `FIX #issue:`
+ - New Features start with `FEAT #issue:`
+ - Refactors start with `REFA #PR:`
+ - Additional work start with `Added #PR:`
+
+
+## Commit
+- [ ] Commit the new version: `git commit -am "Release vX.Y.Z"`
+- [ ] Push the release branch: `git push`
+- [ ] Open a Pull-Request for the release-branch to the develop-branch.
+- [ ] Wait until somebody of the team looked over your changes and merges the Pull-Request.
+
+### Update Master
+We don't merge the development branch to the master because the master branch is different to the develop-Branch. The master branch has a dist and test folder and does not generate Source-Maps.
+
+If we would merge the development branch would overwrite this. To solve this we use rebase instead:
+
+- [ ] Update: `git fetch && git checkout develop && git pull`
+- [ ] Rebase the `master` branch on the `develop` branch: `git checkout master && git rebase develop`
+- [ ] Generate new dist files: `npm prune && rm -rf node_modules && npm install && npm run build && npm run test && git commit -am "generated dist files for vX.Y.Z"
+- [ ] Create a version tag: `git tag "vX.Y.Z"`
+- [ ] [Remove the protection](https://github.com/almende/vis/settings/branches/master) from `master`.
+- [ ] FORCE-Push the branches to github: `git push --force && git push --tag`
+- [ ] [Re-Enable branch protection](https://github.com/almende/vis/settings/branches/master) (enable ALL checkboxes) for `master`.
+- [ ] Publish with npm: `npm publish` (check [npmjs.com](https://www.npmjs.com/package/vis))
+- [ ] Create a [new Release](https://github.com/almende/vis/releases/new) with the tang and the name "vX.Y.Z" and copy the data vom [HISTORY.md](../HISTORY.md) into the body.
+
+
+## Test
+- [ ] Go to a temp directory (e.g. "vis_vX.Y.Z"): `cd .. && mkdir vis_vX.Y.Z && cd vis_vX.Y.Z`
+- [ ] Install the library from npm: `npm init -f && npm install vis`
+- [ ] Verify if it installs the just released version, and verify if it works: `cd node_modules/vis/
+- [ ] Install the library via bower: `cd ../.. && bower install vis`
+- [ ] Verify if it installs the just released version, and verify if it works: `cd bower_components/vis/`
+- [ ] Clone the master from github: `cd ../.. && git clone git@github.com:almende/vis.git`.
+- [ ] Verify if it installs the just released version, and verify if it works. `cd vis`
+
+## Update website
+- [ ] update the gh-pages branch: `git checkout gh-pages && git pull && git checkout -b "gh-pages_vX.Y.Z"`
+- [ ] Copy the `dist` folder from the `master` branch to the `github-pages` branch in another directory, overwriting existing files: `cp -rf ../vis_vX.Y.Z/vis/dist .`
+- [ ] Generate the documentation: `gulp docs`
+- [ ] Copy the `gen/docs` folder from the `master` branch to the `github-pages` branch in another directory, overwriting existing files: `cp -rf ../vis_vX.Y.Z/vis/gen/docs .`
+- [ ] Copy the `examples` folder from the `master` branch to the `github-pages` branch in another directory, overwriting existing files: `cp -rf ../vis_vX.Y.Z/vis/examples .`
+- [ ] Check if there are new or updated examples, and update the gallery screenshots accordingly.
+- [ ] Update the library version number in the `index.html` page.
+- [ ] Update the CDN links at the download section of index.html AND the CDN link at the top. (search-replace all!!)
+- [ ] Commit the changes: `git add -A && git commit -m "updates for vX.Y.Z"`
+- [ ] Push the changes `git push --set-upstream origin gh-pages_vX.Y.Z`
+
+## Prepare next version
+- [ ] Switch to the "develop" branch: `git checkout develop`.
+- [ ] Change version numbers in "package.json" to a snapshot version `X.X.Z-SNAPSHOT`.
+- [ ] Commit and push: `git commit -am "changed version to vX.X.Z-SNAPSHOT"`
+- [ ] Create new tag: `git tag vX.X.Z-SNAPSHOT`.
+- [ ] [Remove the protection](https://github.com/almende/vis/settings/branches/develop) from `develop`.
+- [ ] FORCE-Push the branches to github: `git push --force && git push --tag`
+- [ ] [Re-Enable branch protection](https://github.com/almende/vis/settings/branches/develop) (enable ALL checkboxes) for `develop`.
+
+DONE!
diff --git a/misc/how_to_help.md b/misc/how_to_help.md
new file mode 100644
index 0000000000..d3e465743f
--- /dev/null
+++ b/misc/how_to_help.md
@@ -0,0 +1,69 @@
+# HowTo Help
+
+The company that developed vis.js for the main part, *almende* is [not able to maintain the project at the moment](./we_need_help.md). So help from the community is very needed and welcome!
+
+## There are many ways to help:
+
+### Answering questions
+
+There are new [issues with questions](//github.com/almende/vis/issues?q=is%3Aissue+is%3Aopen+label%3AQuestion+sort%3Acreated-desc) how to use vis.js opened almost every day. Be part of the community and help answer them!
+
+A better way to ask questions on how to use vis.js is [stackoverflow](https://stackoverflow.com/tags/vis.js). Questions are posed here also and need to be answered by the community. [Please help answering questions](https://stackoverflow.com/tags/vis.js) here also.
+
+### Closing old issues
+
+A new issue is often opened fast and then forgotten. Please help go through [the old issues](//github.com/almende/vis/issues?q=is%3Aissue+is%3Aopen+sort%3Acreated-asc) (especially the [questions](//github.com/almende/vis/issues?q=is%3Aissue+is%3Aopen+sort%3Acreated-asc+label%3AQuestion)) and ask the creator of the issues if the problem still exists before closing the issue. The support team uses the **issue inactive** label to mark these issues.
+
+### Improve the webpage
+
+The visjs.org webpage is hosted on the [gh-pages branch](//github.com/almende/vis/tree/gh-pages). If you find a typo or anything else that should be improved feel free to create a pull-request to *gh-pages*. Please make changes in your own fork of gh-pages so the support team can view the changes in your hosted fork.
+
+### Create new examples
+
+We have [a collection of examples](//github.com/almende/vis/tree/develop/examples). Please help by creating interesting new ones that show a specific problem or layout. Keep the examples easy to understand for beginners and remove unnecessary clutter.
+
+### Provide interesting showcases
+
+If you use vis.js to develop something beautiful feel free to create a pull-request to our show cases page in the [gh-pages branch](//github.com/almende/vis/tree/gh-pages/showcase). [These showcases are displayed on our webpage](http://visjs.org/showcase/index.html) and we are always looking for new examples.
+
+### Confirming and fixing bugs
+
+Every software has bugs. We also have [quite a nice collection](https://github.com/almende/vis/issues?q=is%3Aissue+is%3Aopen+label%3ABug+sort%3Areactions-%2B1-desc) ;-)
+Feel free to fix as many bugs as you want!
+
+You can not only help by fixing bugs, but also by confirming the bug or even creating a minimal code example to prove this bug exists.
+
+### Implementing Feature-Requests
+
+A lot of people have a lot of ideas for improving vis.js. [We label these issues as **Feature-Request**](https://github.com/almende/vis/labels/Feature-Request). Feel free to implement a new feature by creating a new Pull-Request.
+
+[Some issues are labeled **For everybody!**](//github.com/almende/vis/issues?q=is%3Aissue+is%3Aopen+label%3A%22For+everyone%21%22+sort%3Areactions-%2B1-desc). These are a good starting point.
+
+### Reviewing Pull-Requests
+
+We use [GitHub's two-step review](//help.github.com/articles/about-pull-request-reviews/) to make sure pull-requests are clean. You can help by checking out pull-request branches and testing them. You also can comment on lines of code and make sure the pull-request introduces no new bugs or typos.
+
+## Creating Pull Requests
+
+There are some rules for pull-request:
+
+* All pull-request must be to the [develop-branch](//github.com/almende/vis/tree/develop). Pull-request against the [master-branch](//github.com/almende/vis/tree/master) must be closed. (Changes to [gh-pages](//github.com/almende/vis/tree/gh-pages) are also ok.)
+
+* Only commit changes done in the source files in the folder `lib`, not to the builds
+ which are located in the folder `dist`.
+
+* Keep your changes small and clear. Only work on one topic at one time and only change lines of code that you have to change to reach your goal.
+
+* Test your changes before creating a pull-request. The easiest way is to open the existing examples and playing with them.
+
+* If you are fixing or implementing an existing issue, please refer to it in the description and in the commit message.
+
+* If you are introducing a new feature, add some documentation and a new example to make it easy to adapt.
+
+* If you introduce breaking changes, like changing the signature of a public function, point that out in your description. Breaking changes result in a new major release.
+
+* Always adapt to the code style of the existing source. Never adapt existing code to your personal taste. :trollface:
+
+* Pull-requests must be reviewed by at least two member of the support team. The First must approve the pull-request, the second can than merge after also checking it.
+
+**Happy Helping!!**
diff --git a/misc/labels.md b/misc/labels.md
new file mode 100644
index 0000000000..8307c374dc
--- /dev/null
+++ b/misc/labels.md
@@ -0,0 +1,106 @@
+# How we use Github labels
+
+*Because only team members can add and change labels this document is mainly for maintainers, but also for users to understand how we use labels.*
+
+*It is important to also label old and closed issues uniformly in order to export them later e.g. if the project gets separated into multiple components.*
+
+
+## Issue Types
+If an issue was created it MUST always be labeled as one of the following issue types:
+
+### `Question`
+The author has a general or very specific question.
+If it is a general question on how to use vis.js the issues should be closed immediately with a reference to [stackoverflow](https://stackoverflow.com/questions/tagged/vis.js).
+Specific question or hard problems should stay open.
+Questions should be closed within 3 months.
+
+### `Problem`
+This issues points to a potential bug that needs to be confirmed.
+If the problem most likely originates from the user's code it should be labeled as [`Question`](#question) instead.
+The support team should try to reproduce this issue and then close it or mark it as [`Confirmed Bug`](#confirmed-bug).
+
+### `Confirmed Bug`
+This issue was reported as [`Problem`](#problem), but the issue is reproducible and is now a confirmed bug.
+
+### `Feature-Request`
+This issue proposes a new feature or a change of existing functionality. Issues that are unlikely to get implemented should be closed.
+
+### `wontfix`
+This issues is e.g. for discussing a topic or for project management purposes, and is not handled in the usual issue process.
+
+
+## Graph type
+All issues MUST have one of the following type labels. These labels are usually mutually exclusive:
+
+### `DataSet`
+Concerns the DataSet implementation.
+
+### `Graph2D`
+Concerns the 2D-Graph implementation.
+
+### `Graph3D`
+Concerns the 3D-Graph implementation.
+
+### `Network`
+Concerns the Network-Graph implementation.
+
+### `source/non-public API`
+This issues is just for discussion or is concerning the build-process, the code-style or something similar.
+
+### `Timeline`
+Concerns the Timeline-Graph implementation.
+
+
+## Additional labels
+
+### `Docs`
+This issue concerns only the documentation.
+If an existing issue is documented wrongly this is a [`Problem`](#problem) in the component and not a [`docs`](#docs) issue.
+This can be used for typos or requests for an improvement of the docs.
+
+### `Duplicate`
+This issues is a duplicate of an existing issue. The duplicate should be closed. In addition, add a reference to the original issue with a comment.
+
+### `Fixed awaiting release`
+This Issue is fixed or implemented in the "develop" branch but is not released yet and therefore should be still open.
+This issues should be closed after the changes are merged into the "master" branch.
+
+### `For everyone!`
+This is a good issue to start working on if you are new to vis.js and want to help.
+This label is also used for labels that may concern a lot of vis.js users.
+
+### `IE / Edge`
+These issues concern a problem with the Microsoft Internet Explorer or Edge browser.
+
+### `invalid`
+This is not a valid issue.
+Someone just created an empty issue, picked the wrong project or something similar.
+This can also be used for pull-request to a non-develop branch or something similar.
+This issue or pull request should be closed immediately.
+
+### `Issue Inactive`
+Issues marked as [`Question`](#question) or [`Problem`](#problem) get marked as inactive when the author is not responsive or the topic is old.
+If an issue is marked as inactive for about 2 weeks it can be closed without any hesitation.
+
+### `PRIORITY`
+In general this is used for major bugs. There should only exist a few issues marked as PRIORITY at the same time.
+These issues need to be handled before all others.
+
+### `Requires breaking change`
+A lot of code needs to be changed to implement this. This is maybe something for a major release or something for someone with a lot of time on their hands :-)
+
+### `waiting for answer/improvement`
+This is mostly used for pull requests were a reviewer requested some changes and the owner has not responded yet.
+
+### `Work In Progress`
+Someone is working on this issue or a pull request already exists and needs to be reviewed.
+
+## Example Workflows
+
+### Bug
+
+[`Problem`](#Problem) ⟶ [`Confirmed Bug`](#confirmed-bug) ⟶ [`Work In Progress`](#work-in-progress) ⟶ [`Fixed awaiting release`](#fixed-awaiting-release)
+
+### Feature-Request
+
+[`Feature-Request`](#feature-request) ⟶ [`Work In Progress`](#work-in-progress) ⟶ [`Fixed awaiting release`](#fixed-awaiting-release)
diff --git a/misc/we_need_help.md b/misc/we_need_help.md
new file mode 100644
index 0000000000..1a527057c0
--- /dev/null
+++ b/misc/we_need_help.md
@@ -0,0 +1,28 @@
+# We need help!
+
+## The current status
+
+Vis.js is looking for people who can help maintain and improve the library. We've put a lot of effort in building these visualizations, fixing bugs, and supporting users as much as we can. For some time now, we’ve been lacking the manpower to maintain the library the way we have in recent years. [@josdejong](//github.com/josdejong) has left the company for a new opportunity, and [@AlexDM0](//github.com/AlexDM0) has moved internally to a daughter company, with severe impact on his time and availability for Vis.js. At the moment [@ludost](//github.com/ludost) is the official maintainer from Almende, but does not have much time to help out.
+
+Although Almende is looking to replace the expertise required for Vis.js, we don't expect to be able to do comprehensive project management any time soon. At the same time we’d like to spare Vis.js from becoming abandonware, especially given the relative healthy user base. For the longer term future we would be happy if vis.js could stand on its own feet, community supported.
+
+**If you want to support the project please just start by [helping out](./how_to_help.md).**
+
+If you have shown some commitment to the project you can ask [@ludost](//github.com/ludost) to become a member of the community support team. This team has write permissions to the repository and is helping maintaining it. Currently this team consists of:
+
+* [@ludost](//github.com/ludost) (almende maintainer)
+* [@mojoaxel](//github.com/mojoaxel)
+* [@yotamberk](//github.com/yotamberk)
+* [@Tooa](//github.com/Tooa)
+* [@eymiha](//github.com/eymiha)
+* [@bradh](//github.com/bradh)
+* [@wimrijnders](//github.com/wimrijnders)
+* [@macleodbroad-wf](//github.com/macleodbroad-wf)
+
+## Financial help
+
+Cutting new releases is [time consuming manual process](https://github.com/almende/vis/issues/2546) that requires codebase knowledge and experience. Pre-release code review and compatibility testing becomes harder with time as more features are added. Backing the project financially allows members to [allocate time for releases](https://github.com/almende/vis/issues/4197) in the absense of company support. [[Become a backer](https://opencollective.com/visjs)]
+
+---
+
+Thank you to all our supporters! ðŸ™
diff --git a/misc/we_need_help.png b/misc/we_need_help.png
new file mode 100644
index 0000000000..b9c3db8d57
Binary files /dev/null and b/misc/we_need_help.png differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000..aea914ba96
--- /dev/null
+++ b/package.json
@@ -0,0 +1,85 @@
+{
+ "name": "vis-network",
+ "version": "5.0.0",
+ "description": "A dynamic, browser-based visualization library.",
+ "homepage": "http://visjs.org/",
+ "license": "(Apache-2.0 OR MIT)",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/visjs/vis-network.git"
+ },
+ "bugs": {
+ "url": "https://github.com/visjs/vis-network/issues"
+ },
+ "keywords": [
+ "vis",
+ "visualization",
+ "web based",
+ "browser based",
+ "javascript",
+ "chart",
+ "graph",
+ "network",
+ "browser"
+ ],
+ "main": "./dist/vis-network.min.js",
+ "scripts": {
+ "test": "mocha --exit --require @babel/register",
+ "test-cov": "nyc --reporter=lcov mocha --exit --require @babel/register",
+ "js:network": "rollup --config rollup.config.js",
+ "css:network": "concat-glob-cli -f 'lib/{network,shared}/**/*.css' -o dist/vis-network.css",
+ "uglify:css:network": "uglifycss dist/vis-network.css > dist/vis-network.min.css",
+ "images:network": "cpy lib/network/img/* dist/img/network/",
+ "build": "npm run js:network && npm run css:network && npm run uglify:css:network && npm run images:network",
+ "watch": "npm run css:network && npm run uglify:css:network && npm run images:network && rollup --watch --config rollup.config.js",
+ "watch-dev": "npm run watch-dev",
+ "lint": "eslint '{src,test}/**/*.{m,}{j,t}s{x,}'",
+ "clean": "rimraf 'dist/*'",
+ "postinstall": "opencollective postinstall || exit 0"
+ },
+ "dependencies": {
+ "emitter-component": "^1.1.1",
+ "hammerjs": "^2.0.8",
+ "keycharm": "^0.2.0",
+ "moment": "^2.20.1",
+ "propagating-hammerjs": "^1.4.6",
+ "timsort": "^0.3.0",
+ "vis-data": "^6.1.0",
+ "vis-util": "^1.1.1"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.5.4",
+ "@babel/preset-env": "^7.5.4",
+ "@babel/register": "^7.4.4",
+ "clean-css": "^4.1.7",
+ "concat-glob-cli": "^0.1.0",
+ "cpy-cli": "^2.0.0",
+ "eslint": "^4.3.0",
+ "jsdoc": "^3.5.5",
+ "jsdom": "11.3.0",
+ "jsdom-global": "^3.0.2",
+ "merge-stream": "^1.0.1",
+ "mocha": "^5.2.0",
+ "nyc": "^11.2.1",
+ "opencollective": "^1.0.3",
+ "rimraf": "^2.6.1",
+ "rollup": "^1.16.7",
+ "rollup-plugin-babel": "^4.3.3",
+ "rollup-plugin-banner": "^0.2.0",
+ "rollup-plugin-commonjs": "^10.0.1",
+ "rollup-plugin-node-builtins": "^2.1.2",
+ "rollup-plugin-node-resolve": "^5.2.0",
+ "rollup-plugin-sourcemaps": "^0.4.2",
+ "rollup-plugin-uglify": "^6.0.2",
+ "sinon": "^4.0.1",
+ "test-console": "^1.0.0",
+ "uglify-js": "^3.6.0",
+ "uglifycss": "0.0.29",
+ "uuid": "^3.1.0"
+ },
+ "collective": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/visjs",
+ "logo": "https://opencollective.com/opencollective/logo.txt"
+ }
+}
diff --git a/rollup.config.js b/rollup.config.js
new file mode 100644
index 0000000000..46a44a14ae
--- /dev/null
+++ b/rollup.config.js
@@ -0,0 +1,32 @@
+import commonjs from 'rollup-plugin-commonjs';
+import nodeResolve from 'rollup-plugin-node-resolve';
+import nodeBuiltins from 'rollup-plugin-node-builtins';
+import babel from 'rollup-plugin-babel';
+import sourcemaps from 'rollup-plugin-sourcemaps';
+import { uglify } from "rollup-plugin-uglify";
+import banner from 'rollup-plugin-banner';
+import genHeader from './lib/header';
+
+const genSourceMap = false;
+
+export default [{
+ input: 'index.js',
+ output: {
+ file: 'dist/vis-network.min.js',
+ name: 'vis',
+ exports: 'named',
+ format: 'umd',
+ sourcemap: genSourceMap
+ },
+ plugins: [
+ commonjs(),
+ nodeBuiltins(),
+ nodeResolve(),
+ babel(),
+ sourcemaps(),
+ uglify({
+ sourcemap: genSourceMap
+ }),
+ banner(genHeader('network'))
+ ]
+}]
diff --git a/test/Network.test.js b/test/Network.test.js
new file mode 100644
index 0000000000..b53f908bea
--- /dev/null
+++ b/test/Network.test.js
@@ -0,0 +1,1356 @@
+/**
+ *
+ * Useful during debugging
+ * =======================
+ *
+ * console.log(JSON.stringify(output, null, 2));
+ *
+ * for (let i in network.body.edges) {
+ * let edge = network.body.edges[i];
+ * console.log("" + i + ": from: " + edge.fromId + ", to: " + edge.toId);
+ * }
+ */
+import fs from 'fs';
+import assert from 'assert';
+import { DataSet } from 'vis-data';
+import Network from '../lib/network/Network';
+import canvasMockify from './canvas-mock';
+import { allOptions, configureOptions } from './../lib/network/options.js';
+
+
+/**
+ * Merge all options of object b into object b
+ * @param {Object} a
+ * @param {Object} b
+ * @return {Object} a
+ *
+ * Adapted merge() in dotparser.js
+ */
+function merge (a, b) {
+ if (!a) {
+ a = {};
+ }
+
+ if (b) {
+ for (var name in b) {
+ if (b.hasOwnProperty(name)) {
+ if (typeof b[name] === 'object') {
+ a[name] = merge(a[name], b[name]);
+ } else {
+ a[name] = b[name];
+ }
+ }
+ }
+ }
+ return a;
+}
+
+
+/**
+ * Load legacy-style (i.e. not module) javascript files into the given context.
+ */
+function include(list, context) {
+ if (!(list instanceof Array)) {
+ list = [list];
+ }
+
+ for (var n in list) {
+ var path = list[n];
+ var arr = [fs.readFileSync(path) + ''];
+ eval.apply(context, arr);
+ }
+}
+
+
+/**
+ * Defined network consists of two sub-networks:
+ *
+ * - 1-2-3-4
+ * - 11-12-13-14
+ *
+ * For reference, this is the sample network of issue #1218
+ */
+function createSampleNetwork(options) {
+ var NumInitialNodes = 8;
+ var NumInitialEdges = 6;
+
+ var nodes = new DataSet([
+ {id: 1, label: '1'},
+ {id: 2, label: '2'},
+ {id: 3, label: '3'},
+ {id: 4, label: '4'},
+ {id: 11, label: '11'},
+ {id: 12, label: '12'},
+ {id: 13, label: '13'},
+ {id: 14, label: '14'},
+ ]);
+ var edges = new DataSet([
+ {from: 1, to: 2},
+ {from: 2, to: 3},
+ {from: 3, to: 4},
+ {from: 11, to: 12},
+ {from: 12, to: 13},
+ {from: 13, to: 14},
+ ]);
+
+ // create a network
+ var container = document.getElementById('mynetwork');
+ var data = {
+ nodes: nodes,
+ edges: edges
+ };
+
+ var defaultOptions = {
+ layout: {
+ randomSeed: 8
+ },
+ edges: {
+ smooth: {
+ type: 'continuous' // avoid dynamic here, it adds extra hidden nodes
+ }
+ }
+ };
+
+ options = merge(defaultOptions, options);
+
+ var network = new Network(container, data, options);
+
+ assertNumNodes(network, NumInitialNodes);
+ assertNumEdges(network, NumInitialEdges);
+
+ return [network, data, NumInitialNodes, NumInitialEdges];
+};
+
+
+/**
+ * Create a cluster for the dynamic data change cases.
+ *
+ * Works on the network created by createSampleNetwork().
+ *
+ * This is actually a pathological case; there are two separate sub-networks and
+ * a cluster is made of two nodes, each from one of the sub-networks.
+ */
+function createCluster(network) {
+ var clusterOptionsByData = {
+ joinCondition: function(node) {
+ if (node.id == 1 || node.id == 11) return true;
+ return false;
+ },
+ clusterNodeProperties: {id:"c1", label:'c1'}
+ }
+ network.cluster(clusterOptionsByData);
+}
+
+
+/**
+ * Display node/edge state, useful during debugging
+ */
+function log(network) {
+ console.log(Object.keys(network.body.nodes));
+ console.log(network.body.nodeIndices);
+ console.log(Object.keys(network.body.edges));
+ console.log(network.body.edgeIndices);
+};
+
+
+/**
+ * Note that only the node and edges counts are asserted.
+ * This might be done more thoroughly by explicitly checking the id's
+ */
+function assertNumNodes(network, expectedPresent, expectedVisible) {
+ if (expectedVisible === undefined) expectedVisible = expectedPresent;
+
+ assert.equal(Object.keys(network.body.nodes).length, expectedPresent, "Total number of nodes does not match");
+ assert.equal(network.body.nodeIndices.length, expectedVisible, "Number of visible nodes does not match");
+};
+
+
+/**
+ * Comment at assertNumNodes() also applies.
+ */
+function assertNumEdges(network, expectedPresent, expectedVisible) {
+ if (expectedVisible === undefined) expectedVisible = expectedPresent;
+
+ assert.equal(Object.keys(network.body.edges).length, expectedPresent, "Total number of edges does not match");
+ assert.equal(network.body.edgeIndices.length, expectedVisible, "Number of visible edges does not match");
+};
+
+
+/**
+ * Check if the font options haven't changed.
+ *
+ * This is to guard against future code changes; a lot of the code deals with particular properties of
+ * the font options.
+ * If any assertion fails here, all code in Network handling fonts should be checked.
+ */
+function checkFontProperties(fontItem, checkStrict = true) {
+ var knownProperties = [
+ 'color',
+ 'size',
+ 'face',
+ 'background',
+ 'strokeWidth',
+ 'strokeColor',
+ 'align',
+ 'multi',
+ 'vadjust',
+ 'bold',
+ 'boldital',
+ 'ital',
+ 'mono',
+ ];
+
+ // All properties in fontItem should be known
+ for (var prop in fontItem) {
+ if (prop === '__type__') continue; // Skip special field in options definition
+ if (!fontItem.hasOwnProperty(prop)) continue;
+ assert(knownProperties.indexOf(prop) !== -1, "Unknown font option '" + prop + "'");
+ }
+
+ if (!checkStrict) return;
+
+ // All known properties should be present
+ var keys = Object.keys(fontItem);
+ for (var n in knownProperties) {
+ var prop = knownProperties[n];
+ assert(keys.indexOf(prop) !== -1, "Missing known font option '" + prop + "'");
+ }
+}
+
+
+describe('Network', function () {
+
+ before(function() {
+ this.jsdom_global = canvasMockify("
");
+ this.container = document.getElementById('mynetwork');
+ });
+
+
+ after(function() {
+ this.jsdom_global();
+ });
+
+
+/////////////////////////////////////////////////////
+// Local helper methods for Edge and Node testing
+/////////////////////////////////////////////////////
+
+ /**
+ * Simplify network creation for local tests
+ */
+ function createNetwork(options) {
+ var [network, data, numNodes, numEdges] = createSampleNetwork(options);
+
+ return network;
+ }
+
+
+ function firstNode(network) {
+ for (var id in network.body.nodes) {
+ return network.body.nodes[id];
+ }
+
+ return undefined;
+ }
+
+ function firstEdge(network) {
+ for (var id in network.body.edges) {
+ return network.body.edges[id];
+ }
+
+ return undefined;
+ }
+
+
+ function checkChooserValues(item, chooser, labelChooser) {
+ if (chooser === 'function') {
+ assert.equal(typeof item.chooser, 'function');
+ } else {
+ assert.equal(item.chooser, chooser);
+ }
+
+ if (labelChooser === 'function') {
+ assert.equal(typeof item.labelModule.fontOptions.chooser, 'function');
+ } else {
+ assert.equal(item.labelModule.fontOptions.chooser, labelChooser);
+ }
+ }
+
+
+/////////////////////////////////////////////////////
+// End Local helper methods for Edge and Node testing
+/////////////////////////////////////////////////////
+
+
+ /**
+ * Helper function for clustering
+ */
+ function clusterTo(network, clusterId, nodeList, allowSingle) {
+ var options = {
+ joinCondition: function(node) {
+ return nodeList.indexOf(node.id) !== -1;
+ },
+ clusterNodeProperties: {
+ id: clusterId,
+ label: clusterId
+ }
+ }
+
+ if (allowSingle === true) {
+ options.clusterNodeProperties.allowSingleNodeCluster = true
+ }
+
+ network.cluster(options);
+ }
+
+
+ /**
+ * At time of writing, this test detected 22 out of 33 'illegal' loops.
+ * The real deterrent is eslint rule 'guard-for-in`.
+ */
+ it('can deal with added fields in Array.prototype', function (done) {
+ var canvas = window.document.createElement('canvas');
+ Array.prototype.foo = 1; // Just add anything to the prototype
+ Object.prototype.bar = 2; // Let's screw up hashes as well
+
+ // The network should just run without throwing errors
+ try {
+ var [network, data, numNodes, numEdges] = createSampleNetwork({});
+
+ // Do some stuff to trigger more errors
+ clusterTo(network, 'c1', [1,2,3]);
+ data.nodes.remove(1);
+ network.openCluster('c1');
+ clusterTo(network, 'c1', [4], true);
+ clusterTo(network, 'c2', ['c1'], true);
+ clusterTo(network, 'c3', ['c2'], true);
+ data.nodes.remove(4);
+
+ } catch(e) {
+ delete Array.prototype.foo; // Remove it again so as not to confuse other tests.
+ delete Object.prototype.bar;
+ assert(false, "Got exception:\n" + e.stack);
+ }
+
+ delete Array.prototype.foo; // Remove it again so as not to confuse other tests.
+ delete Object.prototype.bar;
+ done();
+ });
+
+
+ /**
+ * This is a fix on one issue (#3543), but in fact **all* options for all API calls should
+ * remain unchanged.
+ * TODO: extend test for all API calls with options, see #3548
+ */
+ it('does not change the options object passed to fit()', function() {
+ var [network, data, numNodes, numEdges] = createSampleNetwork({});
+ var options = {};
+ network.fit(options);
+
+ // options should still be empty
+ for (var prop in options) {
+ assert(!options.hasOwnProperty(prop), 'No properties should be present in options, detected property: ' + prop);
+ }
+ });
+
+
+ it('does not crash when dataChanged is triggered when setting options on first initialization ', function() {
+ // The init should succeed without an error thrown.
+ var options = {
+ nodes: {
+ physics: false // any value here triggered the error
+ }
+ };
+ createSampleNetwork(options);
+
+ // Do the other values as well that can cause this./
+ // 'any values' applies here as well, expecting no throw
+ options = {edges: {physics: false}};
+ createSampleNetwork(options);
+
+ options = {nodes: {hidden: false}};
+ createSampleNetwork(options);
+
+ options = {edges: {hidden: false}};
+ createSampleNetwork(options);
+ });
+
+
+ it('can deal with null data', function() {
+ // While we're at it, try out other silly values as well
+ // All the following are wrong, but none should lead to a crash
+ var awkwardData = [
+ null,
+ [1,2,3],
+ 42,
+ 'meow'
+ ];
+
+ var container = document.getElementById('mynetwork');
+
+ for (var n = 0; n < awkwardData.length; ++n) {
+ var network = new Network(container, awkwardData[n], {}); // Should not throw
+ }
+ });
+
+
+describe('Node', function () {
+
+ it('has known font options', function () {
+ var network = createNetwork({});
+ checkFontProperties(network.nodesHandler.defaultOptions.font);
+ checkFontProperties(allOptions.nodes.font);
+ checkFontProperties(configureOptions.nodes.font, false);
+ });
+
+
+ /**
+ * NOTE: choosify tests of Node and Edge are parallel
+ * TODO: consolidate this is necessary
+ */
+ it('properly handles choosify input', function () {
+ // check defaults
+ var options = {};
+ var network = createNetwork(options);
+ checkChooserValues(firstNode(network), true, true);
+
+ // There's no point in checking invalid values here; these are detected by the options parser
+ // and subsequently handled as missing input, thus assigned defaults
+
+ // check various combinations of valid input
+
+ options = {nodes: {chosen: false}};
+ network = createNetwork(options);
+ checkChooserValues(firstNode(network), false, false);
+
+ options = {nodes: {chosen: { node:true, label:false}}};
+ network = createNetwork(options);
+ checkChooserValues(firstNode(network), true, false);
+
+ options = {nodes: {chosen: {
+ node:true,
+ label: function(value, id, selected, hovering) {}
+ }}};
+ network = createNetwork(options);
+ checkChooserValues(firstNode(network), true, 'function');
+
+ options = {nodes: {chosen: {
+ node: function(value, id, selected, hovering) {},
+ label:false,
+ }}};
+ network = createNetwork(options);
+ checkChooserValues(firstNode(network), 'function', false);
+ });
+}); // Node
+
+
+describe('Edge', function () {
+
+ it('has known font options', function () {
+ var network = createNetwork({});
+ checkFontProperties(network.edgesHandler.defaultOptions.font);
+ checkFontProperties(allOptions.edges.font);
+ checkFontProperties(configureOptions.edges.font, false);
+ });
+
+
+ /**
+ * NOTE: choosify tests of Node and Edge are parallel
+ * TODO: consolidate this is necessary
+ */
+ it('properly handles choosify input', function () {
+ // check defaults
+ var options = {};
+ var network = createNetwork(options);
+ checkChooserValues(firstEdge(network), true, true);
+
+ // There's no point in checking invalid values here; these are detected by the options parser
+ // and subsequently handled as missing input, thus assigned defaults
+
+ // check various combinations of valid input
+
+ options = {edges: {chosen: false}};
+ network = createNetwork(options);
+ checkChooserValues(firstEdge(network), false, false);
+
+ options = {edges: {chosen: { edge:true, label:false}}};
+ network = createNetwork(options);
+ checkChooserValues(firstEdge(network), true, false);
+
+ options = {edges: {chosen: {
+ edge:true,
+ label: function(value, id, selected, hovering) {}
+ }}};
+ network = createNetwork(options);
+ checkChooserValues(firstEdge(network), true, 'function');
+
+ options = {edges: {chosen: {
+ edge: function(value, id, selected, hovering) {},
+ label:false,
+ }}};
+ network = createNetwork(options);
+ checkChooserValues(firstEdge(network), 'function', false);
+ });
+
+
+ /**
+ * Support routine for next unit test
+ */
+ function createDataforColorChange() {
+ var nodes = new DataSet([
+ {id: 1, label: 'Node 1' }, // group:'Group1'},
+ {id: 2, label: 'Node 2', group:'Group2'},
+ {id: 3, label: 'Node 3'},
+ ]);
+
+ // create an array with edges
+ var edges = new DataSet([
+ {id: 1, from: 1, to: 2},
+ {id: 2, from: 1, to: 3, color: { inherit: 'to'}},
+ {id: 3, from: 3, to: 3, color: { color: '#00FF00'}},
+ {id: 4, from: 2, to: 3, color: { inherit: 'from'}},
+ ]);
+
+
+ var data = {
+ nodes: nodes,
+ edges: edges
+ };
+
+ return data;
+ }
+
+
+ /**
+ * Unit test for fix of #3350
+ *
+ * The issue is that changing color options is not registered in the nodes.
+ * We test the updates the color options in the general edges options here.
+ */
+ it('sets inherit color option for edges on call to Network.setOptions()', function () {
+ var container = document.getElementById('mynetwork');
+ var data = createDataforColorChange();
+
+ var options = {
+ "edges" : { "color" : { "inherit" : "to" } },
+ };
+
+ // Test passing options on init.
+ var network = new Network(container, data, options);
+ var edges = network.body.edges;
+ assert.equal(edges[1].options.color.inherit, 'to'); // new default
+ assert.equal(edges[2].options.color.inherit, 'to'); // set in edge
+ assert.equal(edges[3].options.color.inherit, false); // has explicit color
+ assert.equal(edges[4].options.color.inherit, 'from'); // set in edge
+
+ // Sanity check: colors should still be defaults
+ assert.equal(edges[1].options.color.color, network.edgesHandler.options.color.color);
+
+ // Override the color value - inherit returns to default
+ network.setOptions({ edges:{color: {}}});
+ assert.equal(edges[1].options.color.inherit, 'from'); // default
+ assert.equal(edges[2].options.color.inherit, 'to'); // set in edge
+ assert.equal(edges[3].options.color.inherit, false); // has explicit color
+ assert.equal(edges[4].options.color.inherit, 'from'); // set in edge
+
+ // Check no options
+ network = new Network(container, data, {});
+ edges = network.body.edges;
+ assert.equal(edges[1].options.color.inherit, 'from'); // default
+ assert.equal(edges[2].options.color.inherit, 'to'); // set in edge
+ assert.equal(edges[3].options.color.inherit, false); // has explicit color
+ assert.equal(edges[4].options.color.inherit, 'from'); // set in edge
+
+ // Set new value
+ network.setOptions(options);
+ assert.equal(edges[1].options.color.inherit, 'to');
+ assert.equal(edges[2].options.color.inherit, 'to'); // set in edge
+ assert.equal(edges[3].options.color.inherit, false); // has explicit color
+ assert.equal(edges[4].options.color.inherit, 'from'); // set in edge
+
+/*
+ // Useful for debugging
+ console.log('===================================');
+ console.log(edges[1].options.color);
+ console.log(edges[1].options.color.__proto__);
+ console.log(edges[1].options);
+ console.log(edges[1].options.__proto__);
+ console.log(edges[1].edgeOptions);
+*/
+ });
+
+
+ it('sets inherit color option for specific edge', function () {
+ var container = document.getElementById('mynetwork');
+ var data = createDataforColorChange();
+
+ // Check no options
+ var network = new Network(container, data, {});
+ var edges = network.body.edges;
+ assert.equal(edges[1].options.color.inherit, 'from'); // default
+ assert.equal(edges[2].options.color.inherit, 'to'); // set in edge
+ assert.equal(edges[3].options.color.inherit, false); // has explicit color
+ assert.equal(edges[4].options.color.inherit, 'from'); // set in edge
+
+ // Set new value
+ data.edges.update({id: 1, color: { inherit: 'to'}});
+ assert.equal(edges[1].options.color.inherit, 'to'); // Only this changed
+ assert.equal(edges[2].options.color.inherit, 'to');
+ assert.equal(edges[3].options.color.inherit, false); // has explicit color
+ assert.equal(edges[4].options.color.inherit, 'from');
+ });
+
+
+ /**
+ * Perhaps TODO: add unit test for passing string value for color option
+ */
+ it('sets color value for edges on call to Network.setOptions()', function () {
+ var container = document.getElementById('mynetwork');
+ var data = createDataforColorChange();
+
+ var defaultColor = '#848484'; // From defaults
+ var color = '#FF0000';
+
+ var options = {
+ "edges" : { "color" : { "color" : color } },
+ };
+
+ // Test passing options on init.
+ var network = new Network(container, data, options);
+ var edges = network.body.edges;
+ assert.equal(edges[1].options.color.color, color);
+ assert.equal(edges[1].options.color.inherit, false); // Explicit color, so no inherit
+ assert.equal(edges[2].options.color.color, color);
+ assert.equal(edges[2].options.color.inherit, 'to'); // Local value overrides! (bug according to docs)
+ assert.notEqual(edges[3].options.color.color, color); // Has own value
+ assert.equal(edges[3].options.color.inherit, false); // Explicit color, so no inherit
+ assert.equal(edges[4].options.color.color, color);
+
+ // Override the color value - all should return to default
+ network.setOptions({ edges:{color: {}}});
+ assert.equal(edges[1].options.color.color, defaultColor);
+ assert.equal(edges[1].options.color.inherit, 'from');
+ assert.equal(edges[2].options.color.color, defaultColor);
+ assert.notEqual(edges[3].options.color.color, color); // Has own value
+ assert.equal(edges[4].options.color.color, defaultColor);
+
+ // Check no options
+ network = new Network(container, data, {});
+ edges = network.body.edges;
+ // At this point, color has not changed yet
+ assert.equal(edges[1].options.color.color, defaultColor);
+ assert.equal(edges[1].options.color.highlight, defaultColor);
+ assert.equal(edges[1].options.color.inherit, 'from');
+ assert.notEqual(edges[3].options.color.color, color); // Has own value
+
+ // Set new Value
+ network.setOptions(options);
+ assert.equal(edges[1].options.color.color, color);
+ assert.equal(edges[1].options.color.highlight, defaultColor); // Should not be changed
+ assert.equal(edges[1].options.color.inherit, false); // Explicit color, so no inherit
+ assert.equal(edges[2].options.color.color, color);
+ assert.notEqual(edges[3].options.color.color, color); // Has own value
+ assert.equal(edges[4].options.color.color, color);
+ });
+
+ /**
+ * Unit test for fix of #3500
+ * Checking to make sure edges that become unconnected due to node removal get reconnected
+ */
+ it.skip('has reconnected edges (problems since mocha 4)', function (done) {
+ var node1 = {id:1, label:"test1"};
+ var node2 = {id:2, label:"test2"};
+ var nodes = new DataSet([node1, node2]);
+
+ var edge = {id:1, from: 1, to:2};
+ var edges = new DataSet([edge]);
+
+ var data = {
+ nodes: nodes,
+ edges: edges
+ };
+
+ var container = document.getElementById('mynetwork');
+ var network = new Network(container, data);
+
+ //remove node causing edge to become disconnected
+ nodes.remove(node2.id);
+
+ var foundEdge = network.body.edges[edge.id];
+
+ assert.ok(foundEdge===undefined, "edge is still in state cache");
+
+ //add node back reconnecting edge
+ nodes.add(node2);
+
+ foundEdge = network.body.edges[edge.id];
+
+ assert.ok(foundEdge!==undefined, "edge is missing from state cache");
+ done();
+ });
+}); // Edge
+
+
+describe('Clustering', function () {
+
+ it('properly handles options allowSingleNodeCluster', function() {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+ data.edges.update({from: 1, to: 11,});
+ numEdges += 1;
+ assertNumNodes(network, numNodes);
+ assertNumEdges(network, numEdges);
+
+ clusterTo(network, 'c1', [3,4]);
+ numNodes += 1; // A clustering node is now hiding two nodes
+ numEdges += 1; // One clustering edges now hiding two edges
+ assertNumNodes(network, numNodes, numNodes - 2);
+ assertNumEdges(network, numEdges, numEdges - 2);
+
+ // Cluster of single node should fail, because by default allowSingleNodeCluster == false
+ clusterTo(network, 'c2', [14]);
+ assertNumNodes(network, numNodes, numNodes - 2); // Nothing changed
+ assertNumEdges(network, numEdges, numEdges - 2);
+ assert(network.body.nodes['c2'] === undefined); // Cluster not created
+
+ // Redo with allowSingleNodeCluster == true
+ clusterTo(network, 'c2', [14], true);
+ numNodes += 1;
+ numEdges += 1;
+ assertNumNodes(network, numNodes, numNodes - 3);
+ assertNumEdges(network, numEdges, numEdges - 3);
+ assert(network.body.nodes['c2'] !== undefined); // Cluster created
+
+
+ // allowSingleNodeCluster: true with two nodes
+ // removing one clustered node should retain cluster
+ clusterTo(network, 'c3', [11, 12], true);
+ numNodes += 1; // Added cluster
+ numEdges += 2;
+ assertNumNodes(network, numNodes, 6);
+ assertNumEdges(network, numEdges, 5);
+
+ data.nodes.remove(12);
+ assert(network.body.nodes['c3'] !== undefined); // Cluster should still be present
+ numNodes -= 1; // removed node
+ numEdges -= 3; // cluster edge C3-13 should be removed
+ assertNumNodes(network, numNodes, 6);
+ assertNumEdges(network, numEdges, 4);
+ });
+
+
+ it('removes nested clusters with allowSingleNodeCluster === true', function() {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+ // Create a chain of nested clusters, three deep
+ clusterTo(network, 'c1', [4], true);
+ clusterTo(network, 'c2', ['c1'], true);
+ clusterTo(network, 'c3', ['c2'], true);
+ numNodes += 3;
+ numEdges += 3;
+ assertNumNodes(network, numNodes, numNodes - 3);
+ assertNumEdges(network, numEdges, numEdges - 3);
+ assert(network.body.nodes['c1'] !== undefined);
+ assert(network.body.nodes['c2'] !== undefined);
+ assert(network.body.nodes['c3'] !== undefined);
+
+ // The whole chain should be removed when the bottom-most node is deleted
+ data.nodes.remove(4);
+ numNodes -= 4;
+ numEdges -= 4;
+ assertNumNodes(network, numNodes);
+ assertNumEdges(network, numEdges);
+ assert(network.body.nodes['c1'] === undefined);
+ assert(network.body.nodes['c2'] === undefined);
+ assert(network.body.nodes['c3'] === undefined);
+ });
+
+
+ /**
+ * Check on fix for #1218
+ */
+ it('connects a new edge to a clustering node instead of the clustered node', function () {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+
+ createCluster(network);
+ numNodes += 1; // A clustering node is now hiding two nodes
+ numEdges += 2; // Two clustering edges now hide two edges
+ assertNumNodes(network, numNodes, numNodes - 2);
+ assertNumEdges(network, numEdges, numEdges - 2);
+
+ //console.log("Creating node 21")
+ data.nodes.update([{id: 21, label: '21'}]);
+ numNodes += 1; // New unconnected node added
+ assertNumNodes(network, numNodes, numNodes - 2);
+ assertNumEdges(network, numEdges, numEdges - 2); // edges unchanged
+
+ //console.log("Creating edge 21 pointing to 1");
+ // '1' is part of the cluster so should
+ // connect to cluster instead
+ data.edges.update([{from: 21, to: 1}]);
+ numEdges += 2; // A new clustering edge is hiding a new edge
+ assertNumNodes(network, numNodes, numNodes - 2); // nodes unchanged
+ assertNumEdges(network, numEdges, numEdges - 3);
+ });
+
+
+ /**
+ * Check on fix for #1315
+ */
+ it('can uncluster a clustered node when a node is removed that has an edge to that cluster', function () {
+ // NOTE: this block is same as previous test
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+
+ createCluster(network);
+ numNodes += 1; // A clustering node is now hiding two nodes
+ numEdges += 2; // Two clustering edges now hide two edges
+ assertNumNodes(network, numNodes, numNodes - 2);
+ assertNumEdges(network, numEdges, numEdges - 2);
+ // End block same as previous test
+
+ //console.log("removing 12");
+ data.nodes.remove(12);
+
+ // NOTE:
+ // At this particular point, there are still the two edges for node 12 in the edges DataSet.
+ // If you want to do the delete correctly, these should also be deleted explictly from
+ // the edges DataSet. In the Network instance, however, this.body.nodes and this.body.edges
+ // should be correct, with the edges of 12 all cleared out.
+
+ // 12 was connected to 11, which is clustered
+ numNodes -= 1; // 12 removed, one less node
+ numEdges -= 3; // clustering edge c1-12 and 2 edges of 12 gone
+ assertNumNodes(network, numNodes, numNodes - 2);
+ assertNumEdges(network, numEdges, numEdges - 1);
+
+ //console.log("Unclustering c1");
+ network.openCluster("c1");
+ numNodes -= 1; // cluster node removed, one less node
+ numEdges -= 1; // clustering edge gone, regular edge visible
+ assertNumNodes(network, numNodes, numNodes); // all are visible again
+ assertNumEdges(network, numEdges, numEdges); // all are visible again
+
+ });
+
+
+ /**
+ * Check on fix for #1291
+ */
+ it('can remove a node inside a cluster and then open that cluster', function () {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+
+ var clusterOptionsByData = {
+ joinCondition: function(node) {
+ if (node.id == 1 || node.id == 2 || node.id == 3) return true;
+ return false;
+ },
+ clusterNodeProperties: {id:"c1", label:'c1'}
+ }
+
+ network.cluster(clusterOptionsByData);
+ numNodes += 1; // new cluster node
+ numEdges += 1; // 1 cluster edge expected
+ assertNumNodes(network, numNodes, numNodes - 3); // 3 clustered nodes
+ assertNumEdges(network, numEdges, numEdges - 3); // 3 edges hidden
+
+ //console.log("removing node 2, which is inside the cluster");
+ data.nodes.remove(2);
+ numNodes -= 1; // clustered node removed
+ numEdges -= 2; // edges removed hidden in cluster
+ assertNumNodes(network, numNodes, numNodes - 2); // view doesn't change
+ assertNumEdges(network, numEdges, numEdges - 1); // view doesn't change
+
+ //console.log("Unclustering c1");
+ network.openCluster("c1")
+ numNodes -= 1; // cluster node gone
+ numEdges -= 1; // cluster edge gone
+ assertNumNodes(network, numNodes, numNodes); // all visible
+ assertNumEdges(network, numEdges, numEdges); // all visible
+
+ //log(network);
+ });
+
+
+ /**
+ * Helper function for setting up a graph for testing clusterByEdgeCount()
+ */
+ function createOutlierGraph() {
+ // create an array with nodes
+ var nodes = new DataSet([
+ {id: 1, label: '1', group:'Group1'},
+ {id: 2, label: '2', group:'Group2'},
+ {id: 3, label: '3', group:'Group3'},
+ {id: 4, label: '4', group:'Group4'},
+ {id: 5, label: '5', group:'Group4'}
+ ]);
+
+ // create an array with edges
+ var edges = new DataSet([
+ {from: 1, to: 3},
+ {from: 1, to: 2},
+ {from: 2, to: 4},
+ {from: 2, to: 5}
+ ]);
+
+ // create a network
+ var container = document.getElementById('mynetwork');
+ var data = {
+ nodes: nodes,
+ edges: edges
+ };
+ var options = {
+ "groups" : {
+ "Group1" : { level:1 },
+ "Group2" : { level:2 },
+ "Group3" : { level:3 },
+ "Group4" : { level:4 }
+ }
+ };
+
+ var network = new Network (container, data, options);
+
+ return network;
+ }
+
+
+ /**
+ * Check on fix for #3367
+ */
+ it('correctly handles edge cases of clusterByEdgeCount()', function () {
+ /**
+ * Collect clustered id's
+ *
+ * All node id's in clustering nodes are collected into an array;
+ * The results for all clusters are returned as an array.
+ *
+ * Ordering of output depends on the order in which they are defined
+ * within nodes.clustering; strictly, speaking, the array and its items
+ * are collections, so order should not matter.
+ */
+ var collectClusters = function(network) {
+ var clusters = [];
+ for(var n in network.body.nodes) {
+ var node = network.body.nodes[n];
+ if (node.containedNodes === undefined) continue; // clusters only
+
+ // Collect id's of nodes in the cluster
+ var nodes = [];
+ for(var m in node.containedNodes) {
+ nodes.push(m);
+ }
+ clusters.push(nodes);
+ }
+
+ return clusters;
+ }
+
+
+ /**
+ * Compare cluster data
+ *
+ * params are arrays of arrays of id's, e.g:
+ *
+ * [[1,3],[2,4]]
+ *
+ * Item arrays are the id's of nodes in a given cluster
+ *
+ * This comparison depends on the ordering; better
+ * would be to treat the items and values as collections.
+ */
+ var compareClusterInfo = function(recieved, expected) {
+ if (recieved.length !== expected.length) return false;
+
+ for (var n = 0; n < recieved.length; ++n) {
+ var itema = recieved[n];
+ var itemb = expected[n];
+ if (itema.length !== itemb.length) return false;
+
+ for (var m = 0; m < itema.length; ++m) {
+ if (itema[m] != itemb[m]) return false; // != because values can be string or number
+ }
+ }
+
+ return true;
+ }
+
+
+ var assertJoinCondition = function(joinCondition, expected) {
+ var network = createOutlierGraph();
+ network.clusterOutliers({joinCondition: joinCondition});
+ var recieved = collectClusters(network);
+ //console.log(recieved);
+
+ assert(compareClusterInfo(recieved, expected),
+ 'recieved:' + JSON.stringify(recieved) + '; '
+ + 'expected: ' + JSON.stringify(expected));
+ };
+
+
+ // Should cluster 3,4,5:
+ var joinAll_ = function(n) { return true ; }
+
+ // Should cluster none:
+ var joinNone_ = function(n) { return false ; }
+
+ // Should cluster 4 & 5:
+ var joinLevel_ = function(n) { return n.level > 3 ; }
+
+ assertJoinCondition(undefined , [[1,3],[2,4,5]]);
+ assertJoinCondition(null , [[1,3],[2,4,5]]);
+ assertJoinCondition(joinNone_ , []);
+ assertJoinCondition(joinLevel_ , [[2,4,5]]);
+ });
+
+
+ ///////////////////////////////////////////////////////////////
+ // Automatic opening of clusters due to dynamic data change
+ ///////////////////////////////////////////////////////////////
+
+ /**
+ * Helper function, created nested clusters, three deep
+ */
+ function createNetwork1() {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+
+ clusterTo(network, 'c1', [3,4]);
+ numNodes += 1; // new cluster node
+ numEdges += 1; // 1 cluster edge expected
+ assertNumNodes(network, numNodes, numNodes - 2); // 2 clustered nodes
+ assertNumEdges(network, numEdges, numEdges - 2); // 2 edges hidden
+
+ clusterTo(network, 'c2', [2,'c1']);
+ numNodes += 1; // new cluster node
+ numEdges += 1; // 2 cluster edges expected
+ assertNumNodes(network, numNodes, numNodes - 4); // 4 clustered nodes, including c1
+ assertNumEdges(network, numEdges, numEdges - 4); // 4 edges hidden, including edge for c1
+
+ clusterTo(network, 'c3', [1,'c2']);
+ // Attempt at visualization: parentheses belong to the cluster one level above
+ // c3
+ // ( -c2 )
+ // ( -c1 )
+ // 14-13-12-11 1 -2 (-3-4)
+ numNodes += 1; // new cluster node
+ numEdges += 0; // No new cluster edge expected
+ assertNumNodes(network, numNodes, numNodes - 6); // 6 clustered nodes, including c1 and c2
+ assertNumEdges(network, numEdges, numEdges - 5); // 5 edges hidden, including edges for c1 and c2
+
+ return [network, data, numNodes, numEdges];
+ }
+
+
+ it('opens clusters automatically when nodes deleted', function () {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+
+ // Simple case: cluster of two nodes, delete one node
+ clusterTo(network, 'c1', [3,4]);
+ numNodes += 1; // new cluster node
+ numEdges += 1; // 1 cluster edge expected
+ assertNumNodes(network, numNodes, numNodes - 2); // 2 clustered nodes
+ assertNumEdges(network, numEdges, numEdges - 2); // 2 edges hidden
+
+ data.nodes.remove(4);
+ numNodes -= 2; // deleting clustered node also removes cluster node
+ numEdges -= 2; // cluster edge should also be removed
+ assertNumNodes(network, numNodes, numNodes);
+ assertNumEdges(network, numEdges, numEdges);
+
+
+ // Extended case: nested nodes, three deep
+ [network, data, numNodes, numEdges] = createNetwork1();
+
+ data.nodes.remove(4);
+ // c3
+ // ( -c2 )
+ // 14-13-12-11 1 (-2 -3)
+ numNodes -= 2; // node removed, c1 also gone
+ numEdges -= 2;
+ assertNumNodes(network, numNodes, numNodes - 4);
+ assertNumEdges(network, numEdges, numEdges - 3);
+
+ data.nodes.remove(1);
+ // c2
+ // 14-13-12-11 (2 -3)
+ numNodes -= 2; // node removed, c3 also gone
+ numEdges -= 2;
+ assertNumNodes(network, numNodes, numNodes - 2);
+ assertNumEdges(network, numEdges, numEdges - 1);
+
+ data.nodes.remove(2);
+ // 14-13-12-11 3
+ numNodes -= 2; // node removed, c2 also gone
+ numEdges -= 1;
+ assertNumNodes(network, numNodes); // All visible again
+ assertNumEdges(network, numEdges);
+
+ // Same as previous step, but remove all the given nodes in one go
+ // The result should be the same.
+ [network, data, numNodes, numEdges] = createNetwork1(); // nested nodes, three deep
+ data.nodes.remove([1,2,4]);
+ // 14-13-12-11 3
+ assertNumNodes(network, 5);
+ assertNumEdges(network, 3);
+ });
+
+
+ ///////////////////////////////////////////////////////////////
+ // Opening of clusters at various clustering depths
+ ///////////////////////////////////////////////////////////////
+
+ /**
+ * Check correct opening of a single cluster.
+ * This is the 'simple' case.
+ */
+ it('properly opens 1-level clusters', function () {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+
+ // Pedantic: make a cluster of everything
+ clusterTo(network, 'c1', [1,2,3,4,11, 12, 13, 14]);
+ // c1(14-13-12-11 1-2-3-4)
+ numNodes += 1;
+ assertNumNodes(network, numNodes, 1); // Just the clustering node visible
+ assertNumEdges(network, numEdges, 0); // No extra edges!
+
+ network.clustering.openCluster('c1', {});
+ numNodes -= 1;
+ assertNumNodes(network, numNodes, numNodes); // Expecting same as original
+ assertNumEdges(network, numEdges, numEdges);
+
+ // One external connection
+ [network, data, numNodes, numEdges] = createSampleNetwork();
+ // 14-13-12-11 1-2-3-4
+ clusterTo(network, 'c1', [3,4]);
+ network.clustering.openCluster('c1', {});
+ assertNumNodes(network, numNodes, numNodes); // Expecting same as original
+ assertNumEdges(network, numEdges, numEdges);
+
+ // Two external connections
+ clusterTo(network, 'c1', [2,3]);
+ network.clustering.openCluster('c1', {});
+ assertNumNodes(network, numNodes, numNodes); // Expecting same as original
+ assertNumEdges(network, numEdges, numEdges);
+
+ // One external connection to cluster
+ clusterTo(network, 'c1', [1,2]);
+ clusterTo(network, 'c2', [3,4]);
+ // 14-13-12-11 c1(1-2-)-c2(-3-4)
+ network.clustering.openCluster('c1', {});
+ // 14-13-12-11 1-2-c2(-3-4)
+ numNodes += 1;
+ numEdges += 1;
+ assertNumNodes(network, numNodes, numNodes - 2);
+ assertNumEdges(network, numEdges, numEdges - 2);
+
+ // two external connections to clusters
+ [network, data, numNodes, numEdges] = createSampleNetwork();
+ data.edges.update({
+ from: 1,
+ to: 11,
+ });
+ numEdges += 1;
+ assertNumNodes(network, numNodes, numNodes);
+ assertNumEdges(network, numEdges, numEdges);
+
+ clusterTo(network, 'c1', [1,2]);
+ // 14-13-12-11-c1(-1-2-)-3-4
+ numNodes += 1;
+ numEdges += 2;
+ clusterTo(network, 'c2', [3,4]);
+ // 14-13-12-11-c1(-1-2-)-c2(-3-4)
+ // NOTE: clustering edges are hidden by clustering here!
+ numNodes += 1;
+ numEdges += 1;
+ clusterTo(network, 'c3', [11,12]);
+ // 14-13-c3(-12-11-)-c1(-1-2-)-c2(-3-4)
+ numNodes += 1;
+ numEdges += 2;
+ assertNumNodes(network, numNodes, numNodes - 6);
+ assertNumEdges(network, numEdges, numEdges - 8); // 6 regular edges hidden; also 2 clustering!!!!!
+
+ network.clustering.openCluster('c1', {});
+ numNodes -= 1;
+ numEdges -= 2;
+ // 14-13-c3(-12-11-)-1-2-c2(-3-4)
+ assertNumNodes(network, numNodes, numNodes - 4);
+ assertNumEdges(network, numEdges, numEdges - 5);
+ });
+
+
+ /**
+ * Check correct opening of nested clusters.
+ * The test uses clustering three levels deep and opens the middle one.
+ */
+ it('properly opens clustered clusters', function () {
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+ data.edges.update({from: 1, to: 11,});
+ numEdges += 1;
+ clusterTo(network, 'c1', [3,4]);
+ clusterTo(network, 'c2', [2,'c1']);
+ clusterTo(network, 'c3', [1,'c2']);
+ // Attempt at visualization: parentheses belong to the cluster one level above
+ // -c3
+ // ( -c2 )
+ // ( -c1 )
+ // 14-13-12-11 -1 -2 (-3-4)
+ numNodes += 3;
+ numEdges += 3;
+ //console.log("numNodes: " + numNodes + "; numEdges: " + numEdges);
+ assertNumNodes(network, numNodes, numNodes - 6);
+ assertNumEdges(network, numEdges, numEdges - 6);
+
+ // Open the middle cluster
+ network.clustering.openCluster('c2', {});
+ // -c3
+ // ( -c1 )
+ // 14-13-12-11 -1 -2 (-3-4)
+ numNodes -= 1;
+ numEdges -= 1;
+ assertNumNodes(network, numNodes, numNodes - 5);
+ assertNumEdges(network, numEdges, numEdges - 5);
+
+ //
+ // Same, with one external connection to cluster
+ //
+ var [network, data, numNodes, numEdges] = createSampleNetwork();
+ data.edges.update({from: 1, to: 11,});
+ data.edges.update({from: 2, to: 12,});
+ numEdges += 2;
+ // 14-13-12-11-1-2-3-4
+ // |------|
+ assertNumNodes(network, numNodes);
+ assertNumEdges(network, numEdges);
+
+
+ clusterTo(network, 'c0', [11,12]);
+ clusterTo(network, 'c1', [3,4]);
+ clusterTo(network, 'c2', [2,'c1']);
+ clusterTo(network, 'c3', [1,'c2']);
+ // +----------------+
+ // | c3 |
+ // | +----------+ |
+ // | | c2 | |
+ // +-------+ | | +----+ | |
+ // | c0 | | | | c1 | | |
+ // 14-13-|-12-11-|-|-1-|-2-|-3-4| | |
+ // | | | | | | +----+ | |
+ // +-------+ | | | | |
+ // | | +----------+ |
+ // | | | |
+ // | +----------------+
+ // |------------|
+ // (I)
+ numNodes += 4;
+ numEdges = 15;
+ assertNumNodes(network, numNodes, 4);
+ assertNumEdges(network, numEdges, 3); // (I) link 2-12 is combined into cluster edge for 11-1
+
+ // Open the middle cluster
+ network.clustering.openCluster('c2', {});
+ // +--------------+
+ // | c3 |
+ // | |
+ // +-------+ | +----+ |
+ // | c0 | | | c1 | |
+ // 14-13-|-12-11-|-|-1--2-|-3-4| |
+ // | | | | | +----+ |
+ // +-------+ | | |
+ // | | | |
+ // | +--------------+
+ // |-----------|
+ // (I)
+ numNodes -= 1;
+ numEdges -= 2;
+ assertNumNodes(network, numNodes, 4); // visibility doesn't change, cluster opened within cluster
+ assertNumEdges(network, numEdges, 3); // (I)
+
+ // Open the top cluster
+ network.clustering.openCluster('c3', {});
+ //
+ // +-------+ +----+
+ // | c0 | | c1 |
+ // 14-13-|-12-11-|-1-2-|-3-4|
+ // | | | | +----+
+ // +-------+ |
+ // | |
+ // |--------|
+ // (II)
+ numNodes -= 1;
+ numEdges = 12;
+ assertNumNodes(network, numNodes, 6); // visibility doesn't change, cluster opened within cluster
+ assertNumEdges(network, numEdges, 6); // (II) link 2-12 visible again
+ });
+}); // Clustering
+
+
+describe('on node.js', function () {
+
+ it('should be running', function () {
+ assert(this.container !== null, 'Container div not found');
+
+ // The following should now just plain succeed
+ var [network, data] = createSampleNetwork();
+
+ assert.equal(Object.keys(network.body.nodes).length, 8);
+ assert.equal(Object.keys(network.body.edges).length, 6);
+ });
+
+
+describe('runs example ', function () {
+
+ function loadExample(path, noPhysics) {
+ include(path, this);
+ var container = document.getElementById('mynetwork');
+
+ // create a network
+ var data = {
+ nodes: new DataSet(nodes),
+ edges: new DataSet(edges)
+ };
+
+ if (noPhysics) {
+ // Avoid excessive processor time due to load.
+ // We're just interested that the load itself is good
+ options.physics = false;
+ }
+
+ var network = new Network(container, data, options);
+ return network;
+ };
+
+
+ it('basicUsage', function () {
+ var network = loadExample('./test/network/basicUsage.js');
+ //console.log(Object.keys(network.body.edges));
+
+ // Count in following also contains the helper nodes for dynamic edges
+ assert.equal(Object.keys(network.body.nodes).length, 10);
+ assert.equal(Object.keys(network.body.edges).length, 5);
+ });
+
+
+ it('WorlCup2014', function (done) {
+ // This is a huge example (which is why it's tested here!), so it takes a long time to load.
+ this.timeout(15000);
+
+ var network = loadExample('./examples/network/datasources/WorldCup2014.js', true);
+
+ // Count in following also contains the helper nodes for dynamic edges
+ assert.equal(Object.keys(network.body.nodes).length, 9964);
+ assert.equal(Object.keys(network.body.edges).length, 9228);
+ done();
+ });
+
+
+ // This actually failed to load, added for this reason
+ it.skip('disassemblerExample (problems since mocha 4)', function () {
+ var network = loadExample('./examples/network/exampleApplications/disassemblerExample.js');
+ // console.log(Object.keys(network.body.nodes));
+ // console.log(Object.keys(network.body.edges));
+
+ // Count in following also contains the helper nodes for dynamic edges
+ assert.equal(Object.keys(network.body.nodes).length, 9);
+ assert.equal(Object.keys(network.body.edges).length, 14 - 3); // NB 3 edges in data not displayed
+ });
+
+}); // runs example
+}); // on node.js
+}); // Network
diff --git a/test/canvas-mock.js b/test/canvas-mock.js
new file mode 100644
index 0000000000..5136568ee1
--- /dev/null
+++ b/test/canvas-mock.js
@@ -0,0 +1,164 @@
+/**
+ * Set up mock 2D context, for usage in unit tests.
+ *
+ * Adapted from: https://github.com/Cristy94/canvas-mock
+ */
+var jsdom = require('jsdom');
+var jsdom_global = require('jsdom-global');
+
+var canvasMock; // Use one canvas instance for all calls to createElement('canvas');
+
+
+function replaceCanvasContext (el) {
+ el.getContext = function() {
+ return {
+ fillRect: function() {},
+ clearRect: function(){},
+ getImageData: function(x, y, w, h) {
+ return {
+ data: new Array(w*h*4)
+ };
+ },
+ putImageData: function() {},
+ createImageData: function(){ return []},
+ setTransform: function(){},
+ drawImage: function(){},
+ save: function(){},
+ text: function(){},
+ fillText: function(){},
+ restore: function(){},
+ beginPath: function(){},
+ moveTo: function(){},
+ lineTo: function(){},
+ closePath: function(){},
+ stroke: function(){},
+ translate: function(){},
+ scale: function(){},
+ rotate: function(){},
+ circle: function(){},
+ arc: function(){},
+ fill: function(){},
+
+ //
+ // Following added for vis.js unit tests
+ //
+
+ measureText: function(text) {
+ return {
+ width: 12*text.length,
+ height: 14
+ };
+ }
+ };
+ }
+}
+
+
+/**
+ * Overrides document.createElement(), in order to supply a custom canvas element.
+ *
+ * In the canvas element, getContext() is overridden in order to supply a simple
+ * mock object for the 2D context. For all other elements, the call functions unchanged.
+ *
+ * The override is only done if there is no 2D context already present.
+ * This allows for normal running in a browser, and for node.js the usage of 'canvas'.
+ *
+ * @param {object} window - current global window object. This can possibly come from module 'jsdom',
+ * when running under node.js.
+ * @private
+ */
+function overrideCreateElement(window) {
+ var d = window.document;
+ var f = window.document.createElement;
+
+ // Check if 2D context already present. That happens either when running in a browser,
+ // or this is node.js with 'canvas' installed.
+ var ctx = d.createElement('canvas').getContext('2d');
+ if (ctx !== null && ctx !== undefined) {
+ //console.log('2D context is present, no need to override');
+ return;
+ }
+
+ window.document.createElement = function(param) {
+ if (param === 'canvas') {
+ if (canvasMock === undefined) {
+ canvasMock = f.call(d, 'canvas');
+ replaceCanvasContext(canvasMock);
+ }
+ return canvasMock;
+ } else {
+ return f.call(d, param);
+ }
+ };
+}
+
+/**
+ * The override is only done if there is no 2D context already present.
+ * This allows for normal running in a browser, and for node.js the usage of 'style'
+ * property on a newly created svg element.
+ *
+ * @param {object} window - current global window object. This can possibly come from module 'jsdom',
+ * when running under node.js.
+ * @private
+ */
+function overrideCreateElementNS(window) {
+ var d = window.document;
+ var f = window.document.createElementNS;
+
+ window.document.createElementNS = function(namespaceURI, qualifiedName) {
+ if (namespaceURI === 'http://www.w3.org/2000/svg') {
+ var result = f.call(d, namespaceURI, qualifiedName);
+ if (result.style == undefined) {
+ result.style = {};
+ return result;
+ }
+ }
+ };
+}
+
+/**
+ * Initialize the mock, jsdom and jsdom_global for unit test usage.
+ *
+ * Suppresses a warning from `jsdom` on usage of `getContext()`. A mock definition is added for
+ * it, so the message is not relevant.
+ *
+ * @param {string} [html=''] html definitions which should be added to the jsdom definition
+ * @returns {function} function to call in after(), to clean up for `jsdom_global`
+ */
+function mockify(html = '') {
+ // Start of message that we want to suppress.
+ let msg = 'Error: Not implemented: HTMLCanvasElement.prototype.getContext'
+ + ' (without installing the canvas npm package)';
+
+ // Override default virtual console of jsdom
+ const virtualConsole = new jsdom.VirtualConsole();
+
+ // Set up a simple 'mock' console output. Only 'error' needs to be overridden
+ let myConsole = {
+ error: (msg) => {
+ if (msg.indexOf(msg) === 0) {
+ //console.error('all is well');
+ } else {
+ // All other messages pass through
+ console.error(msg);
+ }
+ }
+ };
+
+ // Using the global catch instead of specific event handler, because I couldn't get them to work
+ virtualConsole.sendTo(myConsole);
+
+ let cleanupFunction = jsdom_global(
+ html,
+ { skipWindowCheck: true, virtualConsole: virtualConsole}
+ );
+
+ overrideCreateElement(window); // The actual initialization of canvas-mock
+
+ overrideCreateElementNS(window);
+
+ return cleanupFunction;
+}
+
+
+module.exports = mockify;
diff --git a/test/network/basicUsage.js b/test/network/basicUsage.js
new file mode 100644
index 0000000000..85808210ad
--- /dev/null
+++ b/test/network/basicUsage.js
@@ -0,0 +1,21 @@
+// Network from `basicUsage` example
+
+ // create an array with nodes
+ var nodes = [
+ {id: 1, label: 'Node 1'},
+ {id: 2, label: 'Node 2'},
+ {id: 3, label: 'Node 3'},
+ {id: 4, label: 'Node 4'},
+ {id: 5, label: 'Node 5'}
+ ];
+
+ // create an array with edges
+ var edges = [
+ {from: 1, to: 3},
+ {from: 1, to: 2},
+ {from: 2, to: 4},
+ {from: 2, to: 5},
+ {from: 3, to: 3}
+ ];
+
+ var options = {};
diff --git a/test/network/maximumWidthEdgeCase.html b/test/network/maximumWidthEdgeCase.html
new file mode 100644
index 0000000000..ed92cac6f7
--- /dev/null
+++ b/test/network/maximumWidthEdgeCase.html
@@ -0,0 +1,65 @@
+
+
+
+ Maximum Width Edge Case Test
+
+
+
+
+
+
+
+
+
+A word in a label that's wider than the maximum width will be forced onto a line. We can't do better without breaking the word into pieces, and even then the pieces could still be too wide.
+
+Avoid the problem. Don't set ridiculously small maximum widths.
+
+
+
+
+
+
+
diff --git a/test/networkTest.html b/test/networkTest.html
new file mode 100644
index 0000000000..b10873b429
--- /dev/null
+++ b/test/networkTest.html
@@ -0,0 +1,63 @@
+
+
+
+
+ JS Bin
+
+
+
+
+
+Network Test
+
+
+
+
+
\ No newline at end of file
diff --git a/test/network_unittests.html b/test/network_unittests.html
new file mode 100644
index 0000000000..2d3e2eaab3
--- /dev/null
+++ b/test/network_unittests.html
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file