Skip to content

Instantly share code, notes, and snippets.

@rpgove
Last active January 10, 2023 06:29
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rpgove/386b7a28977a179717a460f9a541af2a to your computer and use it in GitHub Desktop.
Save rpgove/386b7a28977a179717a460f9a541af2a to your computer and use it in GitHub Desktop.
Group-in-a-box layout
license: gpl-3.0
height: 302

A group-in-a-box layout showing interactions between Les Miserables characters, where the characters are grouped by their communities (determined using the Louvain modularity community detection algorithm). Within each group, nodes are positioned using a force-directed layout.

In contrast with a pure force-directed layout, group-in-a-box layouts can clearly show connections within and between clusters. Matrix diagrams can also be used for this purpose, but group-in-a-box can be more effective for showing connections within and between categories of nodes that do not form clear clusters.

/* global d3 */
function forceInABox(alpha) {
function index(d) {
return d.index;
}
var id = index,
nodes,
links, //needed for the force version
tree,
size = [100,100],
nodeSize = 1, // The expected node size used for computing the cluster node
forceCharge = -2,
foci = {},
// oldStart = force.start,
linkStrengthIntraCluster = 0.1,
linkStrengthInterCluster = 0.01,
// oldGravity = force.gravity(),
templateNodes = [],
offset = [0,0],
templateForce,
templateNodesSel,
groupBy = function (d) { return d.cluster; },
template = "treemap",
enableGrouping = true,
strength = 0.1;
// showingTemplate = false;
function force(alpha) {
if (!enableGrouping) {
return force;
}
if (template==="force") {
//Do the tick of the template force and get the new focis
templateForce.tick();
getFocisFromTemplate();
}
for (var i = 0, n = nodes.length, node, k = alpha * strength; i < n; ++i) {
node = nodes[i];
node.vx += (foci[groupBy(node)].x - node.x) * k;
node.vy += (foci[groupBy(node)].y - node.y) * k;
}
}
function initialize() {
if (!nodes) return;
// var i,
// n = nodes.length,
// m = links.length,
// nodeById = map(nodes, id),
// link;
if (template==="treemap") {
initializeWithTreemap();
} else {
initializeWithForce();
}
}
force.initialize = function(_) {
nodes = _;
initialize();
};
function getLinkKey(l) {
var sourceID = groupBy(l.source),
targetID = groupBy(l.target);
return sourceID <= targetID ?
sourceID + "~" + targetID :
targetID + "~" + sourceID;
}
function computeClustersNodeCounts(nodes) {
var clustersCounts = d3.map();
nodes.forEach(function (d) {
if (!clustersCounts.has(groupBy(d))) {
clustersCounts.set(groupBy(d), 0);
}
});
nodes.forEach(function (d) {
// if (!d.show) { return; }
clustersCounts.set(groupBy(d), clustersCounts.get(groupBy(d)) + 1);
});
return clustersCounts;
}
//Returns
function computeClustersLinkCounts(links) {
var dClusterLinks = d3.map(),
clusterLinks = [];
links.forEach(function (l) {
var key = getLinkKey(l), count;
if (dClusterLinks.has(key)) {
count = dClusterLinks.get(key);
} else {
count = 0;
}
count += 1;
dClusterLinks.set(key, count);
});
dClusterLinks.entries().forEach(function (d) {
var source, target;
source = d.key.split("~")[0];
target = d.key.split("~")[1];
clusterLinks.push({
"source":source,
"target":target,
"count":d.value,
});
});
return clusterLinks;
}
//Returns the metagraph of the clusters
function getGroupsGraph() {
var gnodes = [],
glinks = [],
// edges = [],
dNodes = d3.map(),
// totalSize = 0,
clustersList,
c, i, size,
clustersCounts,
clustersLinks;
clustersCounts = computeClustersNodeCounts(nodes);
clustersLinks = computeClustersLinkCounts(links);
//map.keys() is really slow, it's crucial to have it outside the loop
clustersList = clustersCounts.keys();
for (i = 0; i< clustersList.length ; i+=1) {
c = clustersList[i];
size = clustersCounts.get(c);
gnodes.push({id : c, size :size });
dNodes.set(c, i);
// totalSize += size;
}
clustersLinks.forEach(function (l) {
glinks.push({
"source":dNodes.get(l.source),
"target":dNodes.get(l.target),
"count":l.count
});
});
return {nodes: gnodes, links: glinks};
}
function getGroupsTree() {
var children = [],
totalSize = 0,
clustersList,
c, i, size, clustersCounts;
clustersCounts = computeClustersNodeCounts(force.nodes());
//map.keys() is really slow, it's crucial to have it outside the loop
clustersList = clustersCounts.keys();
for (i = 0; i< clustersList.length ; i+=1) {
c = clustersList[i];
size = clustersCounts.get(c);
children.push({id : c, size :size });
totalSize += size;
}
// return {id: "clustersTree", size: totalSize, children : children};
return {id: "clustersTree", children : children};
}
function getFocisFromTemplate() {
//compute foci
foci.none = {x : 0, y : 0};
templateNodes.forEach(function (d) {
if (template==="treemap") {
foci[d.data.id] = {
x : (d.x0 + (d.x1-d.x0) / 2) - offset[0],
y : (d.y0 + (d.y1-d.y0) / 2) - offset[1]
};
} else {
foci[d.id] = {x : d.x - offset[0] , y : d.y - offset[1]};
}
});
}
function initializeWithTreemap() {
var treemap = d3.treemap()
.size(force.size());
tree = d3.hierarchy(getGroupsTree())
// .sort(function (p, q) { return d3.ascending(p.size, q.size); })
// .count()
.sum(function (d) { return d.size; })
.sort(function(a, b) {
return b.height - a.height || b.value - a.value; })
;
templateNodes = treemap(tree).leaves();
getFocisFromTemplate();
}
function checkLinksAsObjects() {
// Check if links come in the format of indexes instead of objects
var linkCount = 0;
if (nodes.length===0) return;
links.forEach(function (link) {
var source, target;
if (!nodes) return;
source = link.source;
target = link.target;
if (typeof link.source !== "object") source = nodes[link.source];
if (typeof link.target !== "object") target = nodes[link.target];
if (source === undefined || target === undefined) {
console.log(link);
throw Error("Error setting links, couldn't find nodes for a link (see it on the console)" );
}
link.source = source; link.target = target;
link.index = linkCount++;
});
}
function initializeWithForce() {
var net;
if (nodes && nodes.length>0) {
if (groupBy(nodes[0])===undefined) {
throw Error("Couldn't find the grouping attribute for the nodes. Make sure to set it up with forceInABox.groupBy('attr') before calling .links()");
}
}
checkLinksAsObjects();
net = getGroupsGraph();
templateForce = d3.forceSimulation(net.nodes)
.force("x", d3.forceX(size[0]/2).strength(0.5))
.force("y", d3.forceY(size[1]/2).strength(0.5))
.force("collide", d3.forceCollide(function (d) { return d.size*nodeSize; }))
.force("charge", d3.forceManyBody().strength(function (d) { return forceCharge * d.size; }))
.force("links", d3.forceLink(!net.nodes ? net.links :[]))
templateNodes = templateForce.nodes();
getFocisFromTemplate();
}
function drawTreemap(container) {
container.selectAll(".cell").remove();
container.selectAll("cell")
.data(templateNodes)
.enter().append("svg:rect")
.attr("class", "cell")
.attr("x", function (d) { return d.x0; })
.attr("y", function (d) { return d.y0; })
.attr("width", function (d) { return d.x1-d.x0; })
.attr("height", function (d) { return d.y1-d.y0; });
}
function drawGraph(container) {
container.selectAll(".cell").remove();
templateNodesSel = container.selectAll("cell")
.data(templateNodes);
templateNodesSel
.enter().append("svg:circle")
.attr("class", "cell")
.attr("cx", function (d) { return d.x; })
.attr("cy", function (d) { return d.y; })
.attr("r", function (d) { return d.size*nodeSize; });
}
force.drawTemplate = function (container) {
// showingTemplate = true;
if (template === "treemap") {
drawTreemap(container);
} else {
drawGraph(container);
}
return force;
};
//Backwards compatibility
force.drawTreemap = force.drawTemplate;
force.deleteTemplate = function (container) {
// showingTemplate = false;
container.selectAll(".cell").remove();
return force;
};
force.template = function (x) {
if (!arguments.length) return template;
template = x;
initialize();
return force;
};
force.groupBy = function (x) {
if (!arguments.length) return groupBy;
if (typeof x === "string") {
groupBy = function (d) {return d[x]; };
return force;
}
groupBy = x;
return force;
};
force.enableGrouping = function (x) {
if (!arguments.length) return enableGrouping;
enableGrouping = x;
// update();
return force;
};
force.strength = function (x) {
if (!arguments.length) return strength;
strength = x;
return force;
};
force.getLinkStrength = function (e) {
if(enableGrouping) {
if (groupBy(e.source) === groupBy(e.target)) {
if (typeof(linkStrengthIntraCluster)==="function") {
return linkStrengthIntraCluster(e);
} else {
return linkStrengthIntraCluster;
}
} else {
if (typeof(linkStrengthInterCluster)==="function") {
return linkStrengthInterCluster(e);
} else {
return linkStrengthInterCluster;
}
}
} else {
// Not grouping return the intracluster
if (typeof(linkStrengthIntraCluster)==="function") {
return linkStrengthIntraCluster(e);
} else {
return linkStrengthIntraCluster;
}
}
};
force.id = function(_) {
return arguments.length ? (id = _, force) : id;
};
force.size = function(_) {
return arguments.length ? (size = _, force) : size;
};
force.linkStrengthInterCluster = function(_) {
return arguments.length ? (linkStrengthInterCluster = _, force) : linkStrengthInterCluster;
};
force.linkStrengthIntraCluster = function(_) {
return arguments.length ? (linkStrengthIntraCluster = _, force) : linkStrengthIntraCluster;
};
force.nodes = function(_) {
return arguments.length ? (nodes = _, force) : nodes;
};
force.links = function(_) {
if (!arguments.length)
return links;
if (_ === null) links = [];
else links = _;
return force;
};
force.nodeSize = function(_) {
return arguments.length ? (nodeSize = _, force) : nodeSize;
};
force.forceCharge = function(_) {
return arguments.length ? (forceCharge = _, force) : forceCharge;
};
force.offset = function(_) {
return arguments.length ? (offset = _, force) : offset;
};
return force;
}
<!DOCTYPE html>
<meta charset="utf-8">
<style>
rect.cell {
fill: none;
stroke: #ddd;
stroke-width: 2px;
}
.links line {
stroke: #999;
stroke-opacity: 0.7;
}
.nodes circle {
fill: #d62333;
stroke: #fff;
stroke-width: 2px;
}
</style>
<svg></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="forceInABox.js"></script>
<script>
var width = 600;
var height = 300;
var nodeRadius = d3.scaleSqrt().range([4, 10]);
var linkWidth = d3.scaleLinear().range([1, 2 * nodeRadius.range()[0]]);
var drag = d3.drag()
.on('start', dragStart)
.on('drag', dragging)
.on('end', dragEnd);
var svg = d3.select('svg')
.attr('width', width + 2)
.attr('height', height + 2)
.append('g')
.attr('transform', 'translate(1,1)');
var groupingForce = forceInABox()
.strength(0.1)
.template('treemap')
.groupBy('community')
.size([width, height]);
var forceSim = d3.forceSimulation()
.force('link', d3.forceLink()
.id(function(d) { return d.id; })
.distance(50)
.strength(groupingForce.getLinkStrength)
)
.force('group', groupingForce)
.force('charge', d3.forceManyBody())
.force('center', d3.forceCenter(width/2, height/2))
.force('x', d3.forceX(width/2).strength(0.02))
.force('y', d3.forceY(height/2).strength(0.04));
d3.json('jean.json', function (error, graph) {
if (error) throw error;
// Make sure small nodes are drawn on top of larger nodes
graph.nodes.sort(function (a, b) { return b.chapters.length - a.chapters.length; });
nodeRadius.domain([graph.nodes[graph.nodes.length-1].chapters.length, graph.nodes[0].chapters.length]);
linkWidth.domain(d3.extent(graph.links, function (d) { return d.chapters.length; }));
forceSim.nodes(graph.nodes)
.on('tick', tick);
forceSim.force('link')
.links(graph.links);
groupingForce.links(graph.links)
.drawTreemap(svg);
var link = svg.append('g')
.attr('class', 'links')
.selectAll('line')
.data(graph.links)
.enter().append('line')
.attr('stroke-width', function (d) { return linkWidth(d.chapters.length); });
var node = svg.append('g')
.attr('class', 'nodes')
.selectAll('circle')
.data(graph.nodes)
.enter().append('circle')
.attr('r', function (d) { return nodeRadius(d.chapters.length); })
.call(drag);
node.append('title').text(function (d) { return d.name; });
function tick () {
link
.attr('x1', function (d) { return d.source.x; })
.attr('x2', function (d) { return d.target.x; })
.attr('y1', function (d) { return d.source.y; })
.attr('y2', function (d) { return d.target.y; });
node
.attr('cx', function (d) { return d.x; })
.attr('cy', function (d) { return d.y; });
}
});
function dragStart (d) {
if (!d3.event.active) forceSim.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragging (d) {
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function dragEnd (d) {
if (!d3.event.active) forceSim.alphaTarget(0);
d.fx = null;
d.fy = null;
}
</script>
{"nodes": [{"community": 0, "id": "TH", "chapters": ["1.4.1", "3.8.9", "5.9.4", "2.2.2", "5.3.3", "3.8.18", "3.8.19", "2.5.10", "3.8.12", "3.8.16", "3.8.17", "2.3.8", "2.3.9", "1.4.3", "2.3.2", "2.3.10", "3.8.8", "5.3.8", "3.8.6", "3.8.7", "3.8.4", "4.6.3", "4.8.4", "2.1.19", "5.6.1", "3.8.21", "3.8.20"], "name": "Th\\'enardier"}, {"community": 4, "id": "MN", "chapters": ["3.2.6", "4.6.1"], "name": "Magnon"}, {"community": 1, "id": "FT", "chapters": ["1.3.3", "1.3.2", "1.3.7", "3.6.6", "1.3.4", "1.3.8"], "name": "F\\'elix Tholomy\\`es"}, {"community": 2, "id": "BA", "chapters": ["4.12.6", "4.12.4", "4.12.3", "3.4.4", "4.14.1", "4.14.3", "3.4.1", "4.11.4", "4.11.5"], "name": "Bahorel"}, {"community": 0, "id": "BB", "chapters": ["3.8.21", "4.6.3", "3.8.20", "3.7.3", "4.8.4"], "name": "Babet"}, {"community": 1, "id": "BL", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.6", "1.3.4"], "name": "Blacheville"}, {"community": 3, "id": "BM", "chapters": ["1.7.10", "1.7.9", "1.5.12"], "name": "Monsieur Bamatabois"}, {"community": 3, "id": "JV", "chapters": ["5.1.24", "5.5.5", "5.5.4", "5.5.7", "5.5.8", "1.5.13", "3.8.18", "3.8.19", "1.6.1", "2.5.10", "3.8.14", "1.8.4", "2.3.10", "5.8.1", "2.8.8", "5.8.2", "4.5.2", "5.8.3", "5.3.11", "2.8.9", "5.3.10", "2.8.7", "2.8.6", "2.8.4", "2.8.1", "1.8.1", "4.3.7", "4.3.4", "4.3.5", "5.6.2", "1.8.2", "4.3.1", "4.3.8", "2.3.8", "1.2.11", "5.6.3", "1.7.11", "5.9.2", "4.3.2", "4.15.1", "4.15.2", "4.15.3", "5.8.4", "3.6.1", "3.6.2", "2.5.8", "3.8.9", "2.5.6", "2.2.1", "2.5.7", "2.5.4", "1.6.2", "5.3.4", "2.5.9", "5.3.2", "1.2.9", "5.3.9", "1.5.6", "1.5.1", "1.5.3", "1.5.2", "2.4.3", "2.4.2", "2.4.1", "4.9.1", "2.4.5", "2.4.4", "1.7.9", "1.7.8", "1.7.7", "1.8.5", "1.7.5", "1.7.4", "1.7.3", "1.7.2", "1.7.1", "1.8.3", "1.2.10", "2.3.9", "1.2.12", "1.2.13", "5.1.19", "5.1.18", "5.9.3", "1.7.10", "5.1.11", "2.3.6", "2.3.7", "1.2.6", "1.2.7", "1.2.4", "1.2.5", "1.2.3", "3.8.8", "5.3.8", "5.3.7", "5.3.6", "5.3.5", "2.5.5", "2.5.2", "2.5.3", "5.3.1", "2.5.1", "1.2.1", "5.1.9", "5.1.4", "5.1.6", "4.4.1", "4.4.2", "5.7.1", "5.9.5", "3.8.21", "3.8.20"], "name": "Jean Valjean"}, {"community": 2, "id": "BO", "chapters": ["3.4.2", "4.12.6", "3.4.1", "4.12.3", "4.12.2", "3.4.4", "5.1.14", "5.1.7", "5.1.11", "5.1.2", "4.14.1", "4.14.3", "4.14.5", "5.1.21", "3.8.15", "5.1.18"], "name": "Bossuet (Lesgle)"}, {"community": 2, "id": "JP", "chapters": ["4.12.6", "4.14.3", "3.4.1", "4.12.3", "4.12.8"], "name": "Jean Prouvaire"}, {"community": 0, "id": "BJ", "chapters": ["4.6.3", "4.8.4"], "name": "Brujon"}, {"community": 1, "id": "DA", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.6", "1.3.4"], "name": "Dahlia"}, {"community": 4, "id": "BT", "chapters": ["3.3.1", "3.3.3"], "name": "Baroness of T--"}, {"community": 5, "id": "BU", "chapters": ["3.1.8", "3.8.22"], "name": "Madame Burgon"}, {"community": 2, "id": "EN", "chapters": ["4.12.7", "4.12.6", "4.12.5", "4.12.4", "4.12.3", "5.1.21", "5.1.22", "5.1.23", "4.12.8", "4.1.6", "4.14.1", "4.14.3", "4.14.5", "5.1.19", "5.1.18", "5.1.14", "5.1.17", "5.1.11", "5.1.13", "5.1.12", "3.4.3", "3.4.1", "5.1.9", "5.1.8", "3.4.5", "5.1.5", "5.1.4", "5.1.7", "5.1.6", "5.1.3", "5.1.2"], "name": "Enjolras"}, {"community": 1, "id": "SP", "chapters": ["1.8.5", "1.7.1"], "name": "Sister Perp\\'etue"}, {"community": 2, "id": "FE", "chapters": ["4.12.6", "3.4.1", "4.12.3", "5.1.18", "5.1.21", "5.1.2", "4.14.1"], "name": "Feuilly"}, {"community": 3, "id": "BR", "chapters": ["1.7.11", "1.7.10"], "name": "Brevet"}, {"community": 6, "id": "BS", "chapters": ["5.2.3", "5.2.4"], "name": "Bruneseau"}, {"community": 5, "id": "JD", "chapters": ["3.1.8"], "name": "Jondrette"}, {"community": 1, "id": "ZE", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.4"], "name": "Zephine"}, {"community": 1, "id": "LI", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"], "name": "Listolier"}, {"community": 0, "id": "JA", "chapters": ["4.12.7", "5.4.1", "1.5.13", "1.5.12", "1.6.2", "4.14.3", "4.14.5", "2.5.10", "1.8.5", "4.15.1", "1.8.3", "5.1.19", "5.1.18", "1.5.5", "1.5.6", "1.8.4", "5.3.9", "5.3.3", "2.4.5", "5.3.11", "5.3.10", "5.1.6", "3.8.21", "3.8.20"], "name": "Javert"}, {"community": 0, "id": "BZ", "chapters": ["5.5.1", "2.2.2"], "name": "Boulatruelle"}, {"community": 3, "id": "GR", "chapters": ["2.8.7", "2.8.5"], "name": "Gribier"}, {"community": 1, "id": "FV", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.6", "1.3.4"], "name": "Favourite"}, {"community": 0, "id": "TM", "chapters": ["2.3.8", "1.4.1", "1.4.3", "2.3.9", "2.3.2", "2.3.3", "2.3.4", "3.8.18", "3.8.19", "4.6.1", "3.8.7", "3.8.12", "3.8.21", "3.8.20", "3.8.16", "3.8.17"], "name": "Madame Th\\'enardier"}, {"community": 0, "id": "LL", "chapters": ["2.4.3", "2.5.10", "2.4.5", "2.4.4"], "name": "Old woman 2"}, {"community": 4, "id": "GP", "chapters": ["3.3.2", "2.1.19", "3.3.4"], "name": "George Pontmercy"}, {"community": 0, "id": "TS", "chapters": ["4.5.3", "4.15.1"], "name": "Toussaint"}, {"community": 0, "id": "EP", "chapters": ["2.3.8", "4.14.6", "4.2.3", "3.8.7", "4.9.2", "4.11.6", "4.2.4", "3.8.11", "4.8.3", "4.8.4", "3.8.16"], "name": "Eponine"}, {"community": 2, "id": "XB", "chapters": ["5.1.16", "4.6.2"], "name": "Child 2"}, {"community": 4, "id": "MV", "chapters": ["3.2.8"], "name": "Madamoiselle Vaubois"}, {"community": 1, "id": "FN", "chapters": ["1.4.1", "1.5.9", "1.5.8", "1.5.10", "1.5.13", "1.5.12", "1.3.3", "1.8.5", "1.6.1", "1.7.1", "1.3.4", "1.8.4", "1.7.6", "1.3.9", "1.3.8", "1.8.1", "1.8.2", "1.8.3"], "name": "Fantine"}, {"community": 8, "id": "LP", "chapters": ["4.1.4", "4.1.3"], "name": "Louis Philippe"}, {"community": 3, "id": "JU", "chapters": ["1.7.11", "1.7.9", "1.7.10"], "name": "Judge of Douai"}, {"community": 3, "id": "NP", "chapters": ["1.1.1", "2.1.10", "2.1.8", "2.1.9", "2.1.7", "2.1.4"], "name": "Napoleon"}, {"community": 4, "id": "TG", "chapters": ["3.5.6", "3.2.8", "3.3.7", "4.5.1"], "name": "Lieutenant Theodule Gillenormand"}, {"community": 0, "id": "PO", "chapters": ["1.8.5", "1.7.4"], "name": "Old woman 1"}, {"community": 2, "id": "PL", "chapters": ["4.9.3", "3.5.4", "4.4.2"], "name": "Mother Plutarch"}, {"community": 3, "id": "PG", "chapters": ["1.2.13"], "name": "Petit Gervais"}, {"community": 1, "id": "SS", "chapters": ["1.7.6", "1.8.1", "1.7.1", "1.8.5"], "name": "Sister Simplice"}, {"community": 0, "id": "GU", "chapters": ["3.8.21", "4.6.3", "3.8.20", "3.7.3", "4.8.4"], "name": "Gueulemer"}, {"community": 3, "id": "CH", "chapters": ["1.7.11", "1.7.9", "1.7.10"], "name": "Champmathieu"}, {"community": 0, "id": "CO", "chapters": ["5.9.5", "2.5.6", "2.4.2", "4.8.3", "2.5.5", "5.5.4", "5.5.6", "4.3.4", "5.7.1", "4.3.5", "5.6.2", "5.8.1", "5.8.2", "5.8.3", "4.15.1", "2.3.8", "5.9.4", "1.4.3", "5.9.1", "2.3.1", "2.3.3", "2.3.4", "2.3.5", "2.3.6", "2.3.7", "2.4.4", "3.8.8", "2.4.3", "2.5.7", "2.5.4", "4.8.2", "2.5.2", "2.5.3", "2.4.5", "2.5.1", "4.5.1", "4.5.2", "4.5.3", "4.5.5", "4.5.6", "2.4.1", "2.8.4", "4.4.1", "4.3.6", "4.3.7", "3.6.2", "3.6.3", "4.8.6", "3.6.6", "5.6.1", "3.6.8", "5.1.10", "3.6.1", "4.8.1", "4.3.8"], "name": "Cosette"}, {"community": 3, "id": "CN", "chapters": ["1.7.11", "1.7.10"], "name": "Chenildieu"}, {"community": 2, "id": "CM", "chapters": ["4.12.6", "4.1.6", "3.4.1", "5.1.8", "3.4.5", "5.1.4", "5.1.7", "4.12.8", "4.14.1", "4.14.3", "4.11.4", "4.11.5", "5.1.21", "4.14.5", "5.1.2", "5.1.17", "5.1.18"], "name": "Combeferre"}, {"community": 3, "id": "CL", "chapters": ["1.1.4"], "name": "Countess de L\\^o"}, {"community": 3, "id": "CC", "chapters": ["1.7.11", "1.7.10"], "name": "Cochepaille"}, {"community": 7, "id": "VI", "chapters": ["1.5.9", "1.5.8"], "name": "Madame Victurnien"}, {"community": 3, "id": "IS", "chapters": ["1.2.6"], "name": "Isabeau"}, {"community": 2, "id": "XA", "chapters": ["5.1.16", "4.6.2"], "name": "Child 1"}, {"community": 4, "id": "MG", "chapters": ["5.5.4", "3.5.6", "3.3.1", "5.6.2", "3.3.2", "3.3.5", "3.3.7", "3.3.8", "3.2.8", "4.8.7"], "name": "Madamoiselle Gillenormand"}, {"community": 2, "id": "HL", "chapters": ["4.12.4", "4.12.2", "4.12.1"], "name": "Madame Hucheloup"}, {"community": 3, "id": "GG", "chapters": ["1.1.10"], "name": "G--"}, {"community": 3, "id": "GE", "chapters": ["1.1.4"], "name": "G\\'eborand"}, {"community": 2, "id": "GA", "chapters": ["4.12.7", "4.12.4", "4.12.3", "5.1.8", "5.1.15", "5.1.7", "3.1.8", "5.1.11", "4.14.3", "4.14.1", "4.11.1", "4.11.2", "4.11.3", "4.11.4", "4.14.7", "4.15.4", "4.14.5", "4.6.3", "4.6.2", "4.15.2", "3.8.22"], "name": "Gavroche"}, {"community": 2, "id": "CR", "chapters": ["4.12.6", "4.12.5", "4.12.4", "4.12.3", "5.1.21", "4.1.6", "4.14.1", "4.14.3", "4.14.5", "3.8.15", "5.1.18", "5.1.15", "5.1.14", "5.1.17", "5.1.13", "4.11.4", "4.11.5", "4.11.6", "4.8.3", "4.9.2", "3.4.2", "3.4.3", "3.4.1", "3.4.6", "3.4.5", "5.1.7", "5.1.2"], "name": "Courfeyrac"}, {"community": 0, "id": "QU", "chapters": ["4.12.8", "3.8.21", "3.8.20", "3.7.3", "4.8.4"], "name": "Claquesous"}, {"community": 0, "id": "AZ", "chapters": ["2.3.8", "3.8.16", "5.6.1"], "name": "Anzelma"}, {"community": 3, "id": "CV", "chapters": ["1.1.7"], "name": "Cravatte"}, {"community": 4, "id": "GI", "chapters": ["3.2.4", "5.5.3", "5.3.12", "5.5.6", "3.5.6", "3.2.3", "5.6.2", "3.3.1", "3.2.5", "3.2.6", "3.2.7", "3.3.5", "3.3.4", "3.2.2", "5.6.1", "3.3.8", "3.2.1", "3.2.8", "4.8.7", "5.5.4"], "name": "Monsieur Luke Esprit Gillenormand"}, {"community": 3, "id": "ME", "chapters": ["1.2.12", "1.1.2", "1.1.5", "1.1.4", "1.1.7", "1.1.6", "1.2.4", "1.2.5", "1.2.2", "1.2.3"], "name": "Madame Magloire"}, {"community": 3, "id": "JL", "chapters": ["1.2.1"], "name": "Jacquin Labarre"}, {"community": 3, "id": "FF", "chapters": ["1.5.6", "2.8.9", "2.8.8", "2.8.7", "1.5.7", "2.8.4", "2.8.3", "2.8.2", "2.8.1", "2.5.8", "2.5.9", "2.8.5"], "name": "Fauchelevent"}, {"community": 2, "id": "GT", "chapters": ["4.1.6", "3.4.1", "4.12.3", "4.12.2", "3.4.4", "5.1.23"], "name": "Grantaire"}, {"community": 2, "id": "MA", "chapters": ["4.13.3", "4.13.1", "5.1.21", "5.1.8", "5.1.24", "3.8.4", "5.3.7", "5.9.1", "5.6.2", "5.3.5", "5.6.1", "3.6.2", "4.3.6", "5.5.3", "5.5.2", "5.5.4", "5.5.7", "5.5.6", "5.5.8", "3.6.9", "5.7.1", "3.8.5", "5.3.2", "4.14.3", "3.3.2", "4.14.5", "4.14.4", "4.14.7", "4.14.6", "3.8.10", "3.3.5", "3.8.13", "3.8.14", "3.3.4", "5.9.5", "5.9.4", "5.1.19", "3.3.7", "5.3.1", "4.2.4", "4.8.6", "4.9.2", "3.4.6", "4.8.2", "3.8.11", "4.8.1", "5.3.6", "4.8.3", "5.3.4", "3.8.2", "3.8.3", "4.8.7", "3.8.1", "3.4.2", "3.4.3", "4.5.4", "5.3.12", "4.5.6", "3.4.5", "5.1.4", "3.5.3", "3.5.2", "3.5.1", "3.6.7", "3.3.1", "5.7.2", "4.2.1", "3.6.3", "3.6.4", "3.6.5", "3.6.6", "3.3.6", "3.6.8", "3.3.8", "3.6.1", "3.2.8", "3.3.3"], "name": "Marius"}, {"community": 3, "id": "MC", "chapters": ["1.1.4"], "name": "Marquis de Champtercier"}, {"community": 1, "id": "FA", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"], "name": "Fameuil"}, {"community": 2, "id": "MM", "chapters": ["4.2.3", "3.5.5", "3.5.4", "4.4.2", "4.14.1", "4.14.2", "3.3.5", "4.11.5", "4.9.3"], "name": "Monsieur Mabeuf"}, {"community": 0, "id": "MO", "chapters": ["4.8.4", "3.8.21", "4.6.2", "3.7.3", "4.4.2"], "name": "Montparnasse"}, {"community": 3, "id": "MB", "chapters": ["1.1.1", "1.1.2", "1.1.5", "1.1.4", "1.1.7", "1.1.9", "1.2.4", "1.2.2", "1.2.3"], "name": "Mademoiselle Baptistine"}, {"community": 3, "id": "MI", "chapters": ["2.8.3", "2.8.2", "2.6.7", "2.8.8"], "name": "Mother Innocent"}, {"community": 3, "id": "SN", "chapters": ["1.1.8", "1.1.14"], "name": "Count ***"}, {"community": 1, "id": "MT", "chapters": ["1.5.9", "1.5.10", "1.2.1"], "name": "Marguerite"}, {"community": 2, "id": "JO", "chapters": ["4.12.6", "3.4.1", "4.12.3", "4.12.2", "3.4.4", "5.1.21", "5.1.2", "4.14.1", "4.14.3"], "name": "Joly"}, {"community": 4, "id": "MP", "chapters": ["3.3.2", "3.2.8"], "name": "Madame Pontmercy"}, {"community": 3, "id": "MR", "chapters": ["1.2.1"], "name": "Madame de R--"}, {"community": 3, "id": "SC", "chapters": ["1.7.2"], "name": "Monsieur Scaufflaire"}, {"community": 3, "id": "MY", "chapters": ["1.1.1", "1.1.3", "1.1.2", "1.1.5", "1.1.4", "1.1.7", "1.1.6", "1.1.8", "1.2.12", "1.2.4", "1.2.5", "1.2.2", "1.2.3", "1.5.4", "1.1.11", "1.1.10", "1.1.13", "1.1.12", "1.1.14"], "name": "Monsieur Charles Fran\\c{c}ois Bienvenu Myriel"}], "links": [{"source": "EN", "target": "GT", "chapters": ["4.1.6", "5.1.23", "4.12.3"]}, {"source": "BJ", "target": "GU", "chapters": ["4.6.3", "4.8.4"]}, {"source": "MA", "target": "TH", "chapters": ["5.9.4", "3.8.4"]}, {"source": "BB", "target": "QU", "chapters": ["3.8.21", "3.8.20", "4.8.4"]}, {"source": "EN", "target": "QU", "chapters": ["4.12.8"]}, {"source": "BL", "target": "ZE", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "JA", "target": "PO", "chapters": ["1.8.5"]}, {"source": "BA", "target": "EN", "chapters": ["4.14.1", "4.12.6", "4.12.4", "4.12.3"]}, {"source": "JO", "target": "MM", "chapters": ["4.14.1"]}, {"source": "GT", "target": "HL", "chapters": ["4.12.2"]}, {"source": "BJ", "target": "GA", "chapters": ["4.6.3"]}, {"source": "FE", "target": "MA", "chapters": ["5.1.21"]}, {"source": "BM", "target": "JV", "chapters": ["1.7.9", "1.7.10"]}, {"source": "EN", "target": "JA", "chapters": ["4.12.7", "4.14.3", "5.1.6", "4.14.5"]}, {"source": "MO", "target": "TH", "chapters": ["4.8.4"]}, {"source": "EN", "target": "FE", "chapters": ["4.12.6", "4.12.3", "5.1.18", "5.1.21", "5.1.2", "4.14.1"]}, {"source": "JO", "target": "JP", "chapters": ["4.12.6", "4.12.3"]}, {"source": "JV", "target": "PO", "chapters": ["1.8.5", "1.7.4"]}, {"source": "MG", "target": "MP", "chapters": ["3.2.8"]}, {"source": "MG", "target": "MV", "chapters": ["3.2.8"]}, {"source": "GA", "target": "MO", "chapters": ["4.6.2"]}, {"source": "JV", "target": "PG", "chapters": ["1.2.13"]}, {"source": "MY", "target": "NP", "chapters": ["1.1.1"]}, {"source": "BU", "target": "GA", "chapters": ["3.1.8", "3.8.22"]}, {"source": "BO", "target": "HL", "chapters": ["4.12.2"]}, {"source": "GA", "target": "MM", "chapters": ["4.14.1"]}, {"source": "EP", "target": "TH", "chapters": ["3.8.7", "4.8.4", "3.8.16"]}, {"source": "FE", "target": "JP", "chapters": ["4.12.6", "4.12.3"]}, {"source": "EP", "target": "TM", "chapters": ["2.3.8", "3.8.16"]}, {"source": "EP", "target": "GU", "chapters": ["4.8.4"]}, {"source": "CO", "target": "JA", "chapters": ["4.15.1"]}, {"source": "CR", "target": "GA", "chapters": ["4.12.4", "4.12.3", "5.1.15", "5.1.7", "4.14.1", "4.11.4", "4.14.5"]}, {"source": "CV", "target": "MY", "chapters": ["1.1.7"]}, {"source": "BT", "target": "GI", "chapters": ["3.3.1"]}, {"source": "MA", "target": "MM", "chapters": ["3.3.5"]}, {"source": "FN", "target": "ZE", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.4"]}, {"source": "QU", "target": "TH", "chapters": ["3.8.20", "4.8.4"]}, {"source": "ME", "target": "MY", "chapters": ["1.2.12", "1.1.2", "1.1.5", "1.1.4", "1.1.7", "1.1.6", "1.2.4", "1.2.5", "1.2.2", "1.2.3"]}, {"source": "FE", "target": "JO", "chapters": ["4.14.1", "4.12.6", "4.12.3", "5.1.21", "5.1.2"]}, {"source": "CO", "target": "FT", "chapters": ["3.6.6"]}, {"source": "GA", "target": "JO", "chapters": ["4.14.1", "4.14.3", "4.12.3"]}, {"source": "GU", "target": "JA", "chapters": ["3.8.21"]}, {"source": "BA", "target": "MM", "chapters": ["4.14.1", "4.11.5"]}, {"source": "BB", "target": "EP", "chapters": ["4.8.4"]}, {"source": "CO", "target": "MG", "chapters": ["5.6.2", "5.5.4"]}, {"source": "CM", "target": "JP", "chapters": ["4.12.6", "4.12.8"]}, {"source": "GA", "target": "JA", "chapters": ["4.12.7"]}, {"source": "AZ", "target": "EP", "chapters": ["2.3.8", "3.8.16"]}, {"source": "CM", "target": "JO", "chapters": ["4.14.1", "4.12.6", "4.14.3", "5.1.21", "5.1.2"]}, {"source": "EN", "target": "JV", "chapters": ["5.1.4", "5.1.6", "5.1.9", "5.1.18"]}, {"source": "BO", "target": "CR", "chapters": ["3.4.2", "4.12.6", "4.12.3", "5.1.18", "5.1.14", "5.1.7", "5.1.2", "4.14.1", "4.14.5", "5.1.21", "3.8.15"]}, {"source": "FF", "target": "MI", "chapters": ["2.8.3", "2.8.2", "2.8.8"]}, {"source": "GA", "target": "JV", "chapters": ["4.15.2"]}, {"source": "GU", "target": "MO", "chapters": ["3.8.21", "4.8.4"]}, {"source": "JV", "target": "QU", "chapters": ["3.8.20"]}, {"source": "BU", "target": "JD", "chapters": ["3.1.8"]}, {"source": "CR", "target": "HL", "chapters": ["4.12.4"]}, {"source": "GA", "target": "JP", "chapters": ["4.12.3"]}, {"source": "DA", "target": "FN", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.4"]}, {"source": "GP", "target": "MA", "chapters": ["3.3.4"]}, {"source": "GG", "target": "MY", "chapters": ["1.1.10"]}, {"source": "BA", "target": "GA", "chapters": ["4.14.1", "4.11.4", "4.14.3", "4.12.4", "4.12.3"]}, {"source": "DA", "target": "FA", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "GA", "target": "GT", "chapters": ["4.12.3"]}, {"source": "BJ", "target": "EP", "chapters": ["4.8.4"]}, {"source": "CH", "target": "JU", "chapters": ["1.7.11", "1.7.9", "1.7.10"]}, {"source": "CH", "target": "JV", "chapters": ["1.7.11", "1.7.9", "1.7.10"]}, {"source": "GP", "target": "MP", "chapters": ["3.3.2"]}, {"source": "FE", "target": "MM", "chapters": ["4.14.1"]}, {"source": "DA", "target": "FT", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "DA", "target": "FV", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.6", "1.3.4"]}, {"source": "BA", "target": "GT", "chapters": ["4.12.3"]}, {"source": "GA", "target": "XA", "chapters": ["4.6.2"]}, {"source": "BJ", "target": "TH", "chapters": ["4.6.3", "4.8.4"]}, {"source": "GI", "target": "TG", "chapters": ["3.5.6"]}, {"source": "EP", "target": "MO", "chapters": ["4.8.4"]}, {"source": "BM", "target": "BR", "chapters": ["1.7.10"]}, {"source": "BJ", "target": "QU", "chapters": ["4.8.4"]}, {"source": "BA", "target": "HL", "chapters": ["4.12.4"]}, {"source": "BO", "target": "FE", "chapters": ["4.12.6", "4.12.3", "5.1.18", "5.1.21", "5.1.2", "4.14.1"]}, {"source": "JV", "target": "MA", "chapters": ["5.9.5", "5.5.4", "5.5.7", "5.1.4", "5.1.24", "3.6.2", "3.6.1", "5.7.1", "5.6.2", "5.5.8", "5.3.7", "5.3.6", "5.3.5", "5.3.4", "3.8.14", "5.3.2", "5.3.1"]}, {"source": "FF", "target": "JA", "chapters": ["1.5.6"]}, {"source": "MA", "target": "MG", "chapters": ["5.5.4", "3.3.1", "3.3.2", "3.3.5", "5.6.2", "3.2.8"]}, {"source": "BL", "target": "LI", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"]}, {"source": "BA", "target": "JO", "chapters": ["4.14.1", "4.12.6", "4.14.3", "4.12.3", "3.4.4"]}, {"source": "FF", "target": "JV", "chapters": ["2.8.4", "2.8.9", "2.8.8", "2.8.7", "1.5.6", "2.8.1", "2.5.8", "2.5.9"]}, {"source": "GU", "target": "JV", "chapters": ["3.8.20"]}, {"source": "CM", "target": "GT", "chapters": ["4.1.6"]}, {"source": "FV", "target": "LI", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "JV", "target": "ME", "chapters": ["1.2.4", "1.2.5", "1.2.3"]}, {"source": "GA", "target": "XB", "chapters": ["4.6.2"]}, {"source": "HL", "target": "JO", "chapters": ["4.12.2"]}, {"source": "BL", "target": "FT", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"]}, {"source": "MN", "target": "TM", "chapters": ["4.6.1"]}, {"source": "GI", "target": "JV", "chapters": ["5.6.2", "5.5.4"]}, {"source": "BA", "target": "JP", "chapters": ["4.12.6", "4.12.3"]}, {"source": "GU", "target": "QU", "chapters": ["3.8.21", "3.8.20", "4.8.4"]}, {"source": "EP", "target": "MA", "chapters": ["3.8.11", "4.8.3", "4.14.6", "4.9.2", "4.2.4"]}, {"source": "CM", "target": "MA", "chapters": ["5.1.4", "4.14.3", "4.14.5", "5.1.21", "3.4.5"]}, {"source": "GP", "target": "TH", "chapters": ["2.1.19"]}, {"source": "FA", "target": "LI", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"]}, {"source": "JV", "target": "MI", "chapters": ["2.8.8"]}, {"source": "GI", "target": "MG", "chapters": ["5.5.4", "3.5.6", "3.3.1", "5.6.2", "3.3.5", "3.3.8", "3.2.8", "4.8.7"]}, {"source": "EN", "target": "GA", "chapters": ["4.12.4", "4.12.3", "5.1.7", "5.1.11", "4.14.1", "4.14.5"]}, {"source": "SP", "target": "SS", "chapters": ["1.8.5", "1.7.1"]}, {"source": "BB", "target": "GA", "chapters": ["4.6.3"]}, {"source": "LI", "target": "ZE", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "CR", "target": "JP", "chapters": ["4.12.6", "4.14.3", "4.12.3"]}, {"source": "BZ", "target": "TH", "chapters": ["2.2.2"]}, {"source": "JA", "target": "QU", "chapters": ["3.8.21"]}, {"source": "FT", "target": "ZE", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "CN", "target": "JU", "chapters": ["1.7.11", "1.7.10"]}, {"source": "GA", "target": "HL", "chapters": ["4.12.4"]}, {"source": "BB", "target": "GU", "chapters": ["4.6.3", "3.8.21", "3.8.20", "4.8.4"]}, {"source": "BB", "target": "MO", "chapters": ["3.8.21", "4.8.4"]}, {"source": "JA", "target": "TH", "chapters": ["2.5.10", "5.3.3", "3.8.21", "3.8.20"]}, {"source": "JL", "target": "JV", "chapters": ["1.2.1"]}, {"source": "JA", "target": "TM", "chapters": ["3.8.21"]}, {"source": "BL", "target": "FN", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "CR", "target": "EP", "chapters": ["4.11.6"]}, {"source": "CR", "target": "FE", "chapters": ["4.12.6", "4.12.3", "5.1.18", "5.1.21", "5.1.2", "4.14.1"]}, {"source": "BA", "target": "FE", "chapters": ["4.14.1", "4.12.6", "4.12.3"]}, {"source": "MY", "target": "SN", "chapters": ["1.1.8", "1.1.14"]}, {"source": "EN", "target": "JO", "chapters": ["4.14.1", "4.12.6", "4.12.3", "5.1.21", "5.1.2"]}, {"source": "GE", "target": "MY", "chapters": ["1.1.4"]}, {"source": "EP", "target": "QU", "chapters": ["4.8.4"]}, {"source": "CO", "target": "MA", "chapters": ["5.9.5", "5.9.4", "5.9.1", "5.5.4", "4.5.6", "5.5.6", "3.6.2", "4.3.6", "3.6.1", "5.7.1", "3.6.3", "5.6.2", "3.6.6", "5.6.1", "3.6.8", "4.8.3", "4.8.2", "4.8.1", "4.8.6"]}, {"source": "EN", "target": "JP", "chapters": ["4.12.6", "4.14.3", "4.12.3", "4.12.8"]}, {"source": "CR", "target": "EN", "chapters": ["3.4.3", "4.1.6", "4.12.4", "4.12.3", "5.1.18", "3.4.5", "5.1.21", "5.1.7", "4.12.5", "5.1.13", "5.1.2", "4.14.1", "4.14.3", "4.14.5", "4.12.6", "5.1.17"]}, {"source": "JA", "target": "TS", "chapters": ["4.15.1"]}, {"source": "CR", "target": "MA", "chapters": ["3.4.2", "3.4.3", "3.4.6", "3.4.5", "5.1.21", "4.14.5", "4.8.3", "4.9.2"]}, {"source": "TH", "target": "TM", "chapters": ["2.3.8", "1.4.1", "2.3.2", "3.8.18", "3.8.19", "3.8.7", "3.8.12", "3.8.21", "3.8.20", "3.8.16", "3.8.17"]}, {"source": "FT", "target": "LI", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"]}, {"source": "MB", "target": "ME", "chapters": ["1.1.2", "1.1.5", "1.1.7", "1.2.4", "1.2.2", "1.2.3"]}, {"source": "CR", "target": "MM", "chapters": ["4.14.1", "4.11.5"]}, {"source": "BA", "target": "BO", "chapters": ["4.14.1", "4.12.6", "4.14.3", "4.12.3"]}, {"source": "JV", "target": "TM", "chapters": ["2.3.8", "2.3.9", "3.8.18", "3.8.20", "3.8.19"]}, {"source": "JV", "target": "TH", "chapters": ["2.3.8", "2.3.9", "5.3.8", "3.8.18", "3.8.19", "2.3.10", "3.8.8", "3.8.9", "3.8.20"]}, {"source": "CO", "target": "TS", "chapters": ["4.5.3", "4.15.1"]}, {"source": "MA", "target": "TG", "chapters": ["3.3.7"]}, {"source": "JA", "target": "LL", "chapters": ["2.5.10"]}, {"source": "JV", "target": "LL", "chapters": ["2.4.3", "2.4.5", "2.4.4"]}, {"source": "BJ", "target": "MO", "chapters": ["4.8.4"]}, {"source": "BO", "target": "CM", "chapters": ["4.12.6", "5.1.18", "5.1.21", "5.1.7", "5.1.2", "4.14.1", "4.14.3", "4.14.5"]}, {"source": "CO", "target": "TM", "chapters": ["2.3.8", "2.3.3", "2.3.4"]}, {"source": "BA", "target": "CM", "chapters": ["4.14.1", "4.12.6", "4.14.3", "4.11.4", "4.11.5"]}, {"source": "GI", "target": "MA", "chapters": ["5.5.3", "5.3.12", "5.5.6", "3.3.1", "5.6.2", "3.3.5", "3.3.4", "5.6.1", "3.3.8", "3.2.8", "4.8.7", "5.5.4"]}, {"source": "BO", "target": "MA", "chapters": ["3.4.2", "5.1.21", "4.14.3", "4.14.5"]}, {"source": "GA", "target": "TH", "chapters": ["4.6.3"]}, {"source": "FN", "target": "LI", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "EP", "target": "MM", "chapters": ["4.2.3"]}, {"source": "MB", "target": "MY", "chapters": ["1.1.1", "1.1.5", "1.1.4", "1.1.7", "1.2.4", "1.2.2", "1.2.3"]}, {"source": "GA", "target": "MA", "chapters": ["4.14.3", "4.14.5", "5.1.8", "4.14.7"]}, {"source": "BA", "target": "MA", "chapters": ["4.14.3"]}, {"source": "CO", "target": "TH", "chapters": ["3.8.8"]}, {"source": "GA", "target": "GU", "chapters": ["4.6.3"]}, {"source": "JV", "target": "TS", "chapters": ["4.15.1"]}, {"source": "CM", "target": "EN", "chapters": ["4.12.6", "4.1.6", "5.1.8", "3.4.5", "5.1.4", "5.1.7", "4.12.8", "4.14.1", "4.14.5", "5.1.21", "5.1.2", "5.1.17", "5.1.18"]}, {"source": "BM", "target": "JA", "chapters": ["1.5.12"]}, {"source": "CH", "target": "CN", "chapters": ["1.7.11", "1.7.10"]}, {"source": "EN", "target": "MA", "chapters": ["3.4.3", "5.1.19", "3.4.5", "5.1.21", "4.14.5", "5.1.4"]}, {"source": "BL", "target": "DA", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "FN", "target": "FV", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.4"]}, {"source": "BO", "target": "GT", "chapters": ["4.12.3", "4.12.2", "3.4.4"]}, {"source": "FN", "target": "FT", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "GI", "target": "MN", "chapters": ["3.2.6"]}, {"source": "JU", "target": "JV", "chapters": ["1.7.11", "1.7.9", "1.7.10"]}, {"source": "BM", "target": "JU", "chapters": ["1.7.9", "1.7.10"]}, {"source": "JA", "target": "JV", "chapters": ["5.1.6", "5.1.19", "5.1.18", "5.3.11", "5.3.10", "1.5.6", "1.5.13", "1.6.2", "1.8.4", "5.3.9", "2.5.10", "3.8.21", "2.4.5", "1.8.3"]}, {"source": "JA", "target": "SS", "chapters": ["1.8.5"]}, {"source": "JV", "target": "MR", "chapters": ["1.2.1"]}, {"source": "FN", "target": "MT", "chapters": ["1.5.9", "1.5.10"]}, {"source": "FA", "target": "FN", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "JV", "target": "MT", "chapters": ["1.2.1"]}, {"source": "BB", "target": "JA", "chapters": ["3.8.21"]}, {"source": "JV", "target": "MY", "chapters": ["1.2.12", "1.2.4", "1.2.5", "1.2.3"]}, {"source": "FV", "target": "ZE", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.4"]}, {"source": "CM", "target": "FE", "chapters": ["4.14.1", "4.12.6", "5.1.21", "5.1.18", "5.1.2"]}, {"source": "JV", "target": "MB", "chapters": ["1.2.4", "1.2.3"]}, {"source": "MM", "target": "PL", "chapters": ["4.9.3", "3.5.4", "4.4.2"]}, {"source": "BM", "target": "CC", "chapters": ["1.7.10"]}, {"source": "JV", "target": "MG", "chapters": ["5.6.2", "5.5.4"]}, {"source": "MC", "target": "MY", "chapters": ["1.1.4"]}, {"source": "BM", "target": "CH", "chapters": ["1.7.9", "1.7.10"]}, {"source": "DA", "target": "LI", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "CM", "target": "GA", "chapters": ["4.14.1", "4.11.4", "4.14.3", "4.14.5", "5.1.7"]}, {"source": "JV", "target": "MO", "chapters": ["4.4.2"]}, {"source": "FA", "target": "FV", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "BM", "target": "CN", "chapters": ["1.7.10"]}, {"source": "FA", "target": "FT", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"]}, {"source": "MO", "target": "QU", "chapters": ["3.8.21", "4.8.4"]}, {"source": "BO", "target": "MM", "chapters": ["4.14.1"]}, {"source": "FE", "target": "GA", "chapters": ["4.14.1", "4.12.3"]}, {"source": "CR", "target": "GT", "chapters": ["4.1.6", "4.12.3"]}, {"source": "IS", "target": "JV", "chapters": ["1.2.6"]}, {"source": "GT", "target": "JO", "chapters": ["4.12.3", "4.12.2"]}, {"source": "EN", "target": "HL", "chapters": ["4.12.4"]}, {"source": "GT", "target": "JP", "chapters": ["4.12.3"]}, {"source": "BA", "target": "CR", "chapters": ["4.12.6", "4.12.4", "4.12.3", "4.14.1", "4.11.4", "4.11.5"]}, {"source": "CL", "target": "MY", "chapters": ["1.1.4"]}, {"source": "BO", "target": "JO", "chapters": ["4.12.6", "4.12.3", "4.12.2", "5.1.21", "5.1.2", "4.14.1", "4.14.3"]}, {"source": "CR", "target": "JO", "chapters": ["4.14.1", "4.12.6", "4.12.3", "5.1.21", "5.1.2"]}, {"source": "FT", "target": "FV", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "MG", "target": "TG", "chapters": ["3.2.8", "3.3.7"]}, {"source": "EN", "target": "MM", "chapters": ["4.14.1"]}, {"source": "FN", "target": "JA", "chapters": ["1.8.4", "1.5.12", "1.5.13", "1.8.3"]}, {"source": "BB", "target": "JV", "chapters": ["3.8.20"]}, {"source": "CO", "target": "TG", "chapters": ["4.5.1"]}, {"source": "BO", "target": "JV", "chapters": ["5.1.11"]}, {"source": "BB", "target": "BJ", "chapters": ["4.6.3", "4.8.4"]}, {"source": "BM", "target": "FN", "chapters": ["1.5.12"]}, {"source": "JA", "target": "MO", "chapters": ["3.8.21"]}, {"source": "FN", "target": "JV", "chapters": ["1.5.13", "1.6.1", "1.8.2", "1.8.4", "1.8.1", "1.7.1", "1.8.3"]}, {"source": "FA", "target": "ZE", "chapters": ["1.3.3", "1.3.8", "1.3.4"]}, {"source": "CM", "target": "CR", "chapters": ["4.12.6", "4.1.6", "5.1.18", "3.4.5", "5.1.21", "5.1.7", "5.1.2", "4.14.1", "4.11.4", "4.11.5", "4.14.5", "5.1.17"]}, {"source": "BR", "target": "JV", "chapters": ["1.7.11", "1.7.10"]}, {"source": "BR", "target": "JU", "chapters": ["1.7.11", "1.7.10"]}, {"source": "FN", "target": "SP", "chapters": ["1.8.5"]}, {"source": "FN", "target": "SS", "chapters": ["1.7.6", "1.8.5"]}, {"source": "CN", "target": "JV", "chapters": ["1.7.11", "1.7.10"]}, {"source": "CM", "target": "MM", "chapters": ["4.14.1", "4.11.5"]}, {"source": "CC", "target": "CH", "chapters": ["1.7.11", "1.7.10"]}, {"source": "JO", "target": "MA", "chapters": ["5.1.21", "4.14.3"]}, {"source": "CC", "target": "CN", "chapters": ["1.7.11", "1.7.10"]}, {"source": "FE", "target": "GT", "chapters": ["4.12.3"]}, {"source": "FF", "target": "GR", "chapters": ["2.8.7", "2.8.5"]}, {"source": "DA", "target": "ZE", "chapters": ["1.3.3", "1.3.9", "1.3.8", "1.3.4"]}, {"source": "CO", "target": "GI", "chapters": ["5.6.2", "5.5.4", "5.5.6"]}, {"source": "BL", "target": "FV", "chapters": ["1.3.3", "1.3.8", "1.3.6", "1.3.4"]}, {"source": "BT", "target": "MA", "chapters": ["3.3.3"]}, {"source": "CO", "target": "JV", "chapters": ["2.5.6", "2.4.2", "2.4.1", "5.5.4", "4.3.7", "4.3.4", "5.7.1", "5.8.1", "5.8.2", "2.4.4", "5.9.5", "2.3.6", "2.3.7", "3.8.8", "2.4.3", "2.5.7", "2.5.4", "2.5.5", "2.5.2", "2.5.3", "2.4.5", "2.5.1", "4.5.2", "5.8.3", "2.8.4", "4.4.1", "3.6.1", "3.6.2", "4.3.5", "5.6.2", "4.3.8"]}, {"source": "BR", "target": "CC", "chapters": ["1.7.11", "1.7.10"]}, {"source": "BL", "target": "FA", "chapters": ["1.3.3", "1.3.2", "1.3.8", "1.3.4"]}, {"source": "CO", "target": "LL", "chapters": ["2.4.4"]}, {"source": "BR", "target": "CN", "chapters": ["1.7.11", "1.7.10"]}, {"source": "BO", "target": "GA", "chapters": ["4.14.1", "4.12.3", "4.14.3", "4.14.5", "5.1.7"]}, {"source": "BR", "target": "CH", "chapters": ["1.7.11", "1.7.10"]}, {"source": "BO", "target": "JP", "chapters": ["4.12.6", "4.12.3"]}, {"source": "JV", "target": "SC", "chapters": ["1.7.2"]}, {"source": "BB", "target": "TH", "chapters": ["4.6.3", "3.8.21", "3.8.20", "4.8.4"]}, {"source": "CC", "target": "JU", "chapters": ["1.7.11", "1.7.10"]}, {"source": "CC", "target": "JV", "chapters": ["1.7.11", "1.7.10"]}, {"source": "BB", "target": "TM", "chapters": ["3.8.20"]}, {"source": "FN", "target": "TH", "chapters": ["1.4.1"]}, {"source": "GU", "target": "TM", "chapters": ["3.8.20"]}, {"source": "JV", "target": "SS", "chapters": ["1.8.5", "1.8.1", "1.7.1"]}, {"source": "QU", "target": "TM", "chapters": ["3.8.20"]}, {"source": "GU", "target": "TH", "chapters": ["4.6.3", "3.8.20", "4.8.4"]}, {"source": "FN", "target": "TM", "chapters": ["1.4.1"]}, {"source": "XA", "target": "XB", "chapters": ["5.1.16", "4.6.2"]}, {"source": "FT", "target": "MA", "chapters": ["3.6.6"]}, {"source": "AZ", "target": "TM", "chapters": ["3.8.16"]}, {"source": "BO", "target": "EN", "chapters": ["4.12.6", "4.12.3", "5.1.18", "5.1.14", "5.1.7", "5.1.2", "4.14.1", "4.14.5", "5.1.21"]}, {"source": "AZ", "target": "TH", "chapters": ["3.8.16", "5.6.1"]}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment