+
+var nos_oignons_group_colors = [
+ "#DB4782", "#DAA03B", "#62A4B7", "#A58585",
+ "#9DCEB8", "#8077DE", "#DE5C48"
+];
+
+var nos_oignons_groups = (function() {
+ var groups = [];
+ var seen = {};
+ nos_oignons_relays.forEach(function(r) {
+ var name = r.name.replace(/\d+$/, '');
+ if (!seen[name]) {
+ seen[name] = { name: name, fingerprints: [] };
+ groups.push(seen[name]);
+ }
+ seen[name].fingerprints.push(r.fingerprint);
+ });
+ groups.forEach(function(g, i) {
+ g.color = nos_oignons_group_colors[i % nos_oignons_group_colors.length];
+ });
+ return groups;
+})();
+
+function buildRelayIndex(raw_relays) {
+ var index = {};
+ raw_relays.forEach(function(r) { index[r.fingerprint] = r; });
+ return index;
+}
+
+function sumGroupRelayValues(group, relayIndex, extractFn) {
+ var result = null;
+ group.fingerprints.forEach(function(fp) {
+ var relay = relayIndex[fp];
+ if (!relay) return;
+ var values = extractFn(relay);
+ if (!result) {
+ result = values.map(function(d) { return { date: d.date, y: d.y }; });
+ } else {
+ values.forEach(function(d, i) { result[i].y += d.y; });
+ }
+ });
+ return result || [];
+}