This repository has been archived by the owner on Mar 18, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathgraph.html
179 lines (140 loc) · 24 KB
/
graph.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.links line {
stroke: #999;
stroke-opacity: 0.6;
}
.nodes circle {
stroke: #fff;
stroke-width: 1.5px;
}
.legend {
font-family: "Arial", sans-serif;
font-size: 11px;
}
</style>
<svg width="960" height="600"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
const data = {"QmRY32nDa1ea38nsF19dFD2a8VV2VyrR8fe3235yGoz6T3":{"peers":"Cannot read property 'ping' of undefined"},"QmZ4zsUcqePYBE8dSzNeDvHnDAXYPSrTDscJFUNggL6zNz":{"peers":"Cannot read property 'ping' of undefined"},"QmQBAzz4za56ATK6CxbNo1a827WVi5hqs4ZbPVHViJsyfJ":{"peers":"Cannot read property 'ping' of undefined"},"QmbXrT85yCvZ4bxB6XWiiRR6sgixz6BRVTP9WD6BqzyrCC":{"peers":"Cannot read property 'ping' of undefined"},"QmZUXGqmKAywkFWdGza2yFmd6qMEhq25Z5Ket35Z5zrv82":{"peers":"Cannot read property 'ping' of undefined"},"QmRLMgvsC5np77B1NqXpCeTbM6HHX8XJQUeFP4h4BywJgG":{"peers":{}},"Qmevp9vzSWoVir5E8gdByGg2p12iqxMtLGrL7M9dUHT4MG":{"peers":"Cannot read property 'ping' of undefined"},"QmaTgB3EdYtCa6TiqsEEUe1kwaMtCgtKmApa52eog2R7NF":{"peers":"Cannot read property 'ping' of undefined"},"QmZ3Pqb1gxsVDRt6Lx8k31cw1ufdVhdzhPWjiid3nwQ1mi":{"peers":"Cannot read property 'ping' of undefined"},"Qmef3EqyYdMkTcjkXmDuQLNNjWktLzGdin4rT7CVKBFgSy":{"peers":"Cannot read property 'ping' of undefined"},"QmSVfxvHXkXhzRZVH8MaDrX8GaYs4paAiQTn7cmHzUN7ZU":{"peers":"Cannot read property 'ping' of undefined"},"QmcRzCbX5VHELnuSNHY62wBFdr4NRPANcw7ZKG7NiyZmPU":{"peers":"Cannot read property 'ping' of undefined"},"QmZ56jywxf6Tk1nFTYP1Zr1dzoCaKcoR55PuAVmXuaMPHQ":{"peers":"Cannot read property 'ping' of undefined"},"Qmc7RzxjefKNupwR9Zx4UNtBSZxeq3HfY2rkPx5RfypWkz":{"peers":"Cannot read property 'ping' of undefined"},"QmZMBMxLbHJDWouSGvMndmCUh1chkQ8vNJ2ug4e61MjbQ6":{"peers":"Cannot read property 'ping' of undefined"},"QmUXuQFuBpcMgjqd7pP6MgQtp6x6LW2vzTjx5b7K7URpnb":{"peers":"Cannot read property 'ping' of undefined"},"QmPfV5LyaxZUVKm3ep3FEKX6a4fBjo3SZ21Qaef3XC5nbE":{"peers":"Cannot read property 'ping' of undefined"},"QmRStPfnrmJkvwdup5eNhCGox5w7YbBzuZSRPai15cMwLU":{"peers":"Cannot read property 'ping' of undefined"},"QmS61KcAaNU6KAkJgwcKMELkLHjR3uMo4oh1a3sYNoG6wm":{"peers":"Cannot read property 'ping' of undefined"},"QmYLtYNU9C3ppky4qwC63dkyqtoYcmcJKaoSqaRre9FLWa":{"peers":"Cannot read property 'ping' of undefined"},"QmNrWgkjXLJqhdwmRRkN89Y6krDMBRGZ4jspmgzJL69piX":{"peers":"Cannot read property 'ping' of undefined"},"Qmf5u8j1vUbcYTtDvA8MkJdzeji3L8ifsunto8hc5MU1GV":{"peers":"Cannot read property 'ping' of undefined"},"QmNifBdjABYjCrKBbDXCZ7MBzS9eSgDbUo3QRBRZXaxtbr":{"peers":"Cannot read property 'ping' of undefined"},"QmbX8FzcsbEPjJ5bUuzAZQA4gYmNg6xACHTh6hQX3tMhX5":{"peers":"Cannot read property 'ping' of undefined"},"QmdvTacVeaG5Yuhv2UTYZHZgjv8EM91aBRFkXQj6a61Gr2":{"peers":{"QmdPAffmCZg5pAGQn2ij5N8HYnpCb1YEjtELjXnfyZXubq":353,"QmS52N82BMT6iETRgSW7mMShpk8RCpvPox1aZ6QJKr7yXi":352,"QmYbgzdCvovaXny3vTtKDqYDod96h3muNzCLGA4bHpc1tb":397,"Qmc7RzxjefKNupwR9Zx4UNtBSZxeq3HfY2rkPx5RfypWkz":396}},"QmYbgzdCvovaXny3vTtKDqYDod96h3muNzCLGA4bHpc1tb":{"peers":{"QmaTgB3EdYtCa6TiqsEEUe1kwaMtCgtKmApa52eog2R7NF":389,"QmdvTacVeaG5Yuhv2UTYZHZgjv8EM91aBRFkXQj6a61Gr2":389,"Qmc7RzxjefKNupwR9Zx4UNtBSZxeq3HfY2rkPx5RfypWkz":395,"QmdPAffmCZg5pAGQn2ij5N8HYnpCb1YEjtELjXnfyZXubq":432}},"QmNtANHe4khpm9aCYVR1uxo3VfvLeJA5C4GPhw79zbxssc":{"peers":{"QmNrWgkjXLJqhdwmRRkN89Y6krDMBRGZ4jspmgzJL69piX":344,"QmWijWCPh7y6QCAWKnVM37ht4FjSt3XcBGrtgMvYT6QbhD":469,"QmUNWsidFW9FHtzusxJuanMXavxMdJMee19BmbubACTM57":468,"Qmevp9vzSWoVir5E8gdByGg2p12iqxMtLGrL7M9dUHT4MG":470,"Qmf5u8j1vUbcYTtDvA8MkJdzeji3L8ifsunto8hc5MU1GV":470}},"QmQ9tV2asQUaM6XZVsvHVh1pFdBtvtz7zRH6wmcdU6iM1Q":{"peers":{"Qmdt7sbStWvs8uA8NumR1F9J4JoQJnBQjtkMPjHX54sE8F":261,"QmYf9yPuYDTFVUSpvbiQswKjE9mJsjGQVhPkZE8K28YzDX":262,"QmPfV5LyaxZUVKm3ep3FEKX6a4fBjo3SZ21Qaef3XC5nbE":300,"QmZ3Pqb1gxsVDRt6Lx8k31cw1ufdVhdzhPWjiid3nwQ1mi":330,"QmZUXGqmKAywkFWdGza2yFmd6qMEhq25Z5Ket35Z5zrv82":334}},"QmRvMqipExRSg7BirF6krSxdTU3B2CCoyS3rYysUkNQLET":{"peers":{"Qmdj5Npvtt6GuPuxXWEwvVb3B8WyB94wqbD53uX9Gdp7A4":346,"QmZXut71J5MGyuBi6DZ3SVPnbXVic44BysVzdf3xuUUQsS":348,"QmRSUK8XNmutm5d6zoAKmzbUmE1zX6GR91QPxwYfW466eg":428,"QmdFZrQ2EHSy5rJz5z9tAQb4ARZ1kLan3xzXhny22zKy2W":429}},"QmSujkwtBMdfF1Wp24RKB2U3wVaEfMGsbPp6pgc9xyHkix":{"peers":{"QmZWcrcArcG5bLBRUwy8RRE9KYdunAg9SjNWLbS7RTTwoY":300,"QmNrWgkjXLJqhdwmRRkN89Y6krDMBRGZ4jspmgzJL69piX":326,"QmUNWsidFW9FHtzusxJuanMXavxMdJMee19BmbubACTM57":327,"Qmevp9vzSWoVir5E8gdByGg2p12iqxMtLGrL7M9dUHT4MG":338}},"QmULGnzXvmiMUkh1cBKvuSpFKHHTnoznESR3ogiULsWxm8":{"peers":{"QmUZqQAajjUPmeLB7r4RBGP57sAgbfHMdjJ989vLxXgPw2":391,"QmUXuQFuBpcMgjqd7pP6MgQtp6x6LW2vzTjx5b7K7URpnb":430,"QmRY32nDa1ea38nsF19dFD2a8VV2VyrR8fe3235yGoz6T3":431,"QmcRzCbX5VHELnuSNHY62wBFdr4NRPANcw7ZKG7NiyZmPU":434,"QmQBAzz4za56ATK6CxbNo1a827WVi5hqs4ZbPVHViJsyfJ":462,"QmU1QVYZjJfVeXJbwCoG4ZobXH72fApznenFZnKhmoiHVX":527}},"QmUNWsidFW9FHtzusxJuanMXavxMdJMee19BmbubACTM57":{"peers":{"QmSujkwtBMdfF1Wp24RKB2U3wVaEfMGsbPp6pgc9xyHkix":323,"QmNrWgkjXLJqhdwmRRkN89Y6krDMBRGZ4jspmgzJL69piX":324,"Qmevp9vzSWoVir5E8gdByGg2p12iqxMtLGrL7M9dUHT4MG":359,"QmNtANHe4khpm9aCYVR1uxo3VfvLeJA5C4GPhw79zbxssc":359}},"Qmd7wsNZrmq4CsGUXuavT7H3TeWhjrfPABigqajQoYBNL2":{"peers":{"QmPkX5wuS1hpFoDsLpTeXoHWjguWMGtebvfNvetNDmcCou":383,"QmUJqkKBqTkQSu29qmCATVg8XnQjPwiouNdrXex892k93x":500,"QmVHzz2nNFezhUMs3W4RSsr26tj4hARinAUFzqf7WDYoKP":500,"QmRo3qwqWgXG6XF1koy2HLvXUxfEJ2puuEYUPbD48qFJ4z":543}},"QmdPAffmCZg5pAGQn2ij5N8HYnpCb1YEjtELjXnfyZXubq":{"peers":{"QmPkX5wuS1hpFoDsLpTeXoHWjguWMGtebvfNvetNDmcCou":436,"QmUDhYVp1dDJWHqiCyGaayF8kLRFg2bfCbYnQbS8q1453i":436,"QmdvTacVeaG5Yuhv2UTYZHZgjv8EM91aBRFkXQj6a61Gr2":460,"QmS52N82BMT6iETRgSW7mMShpk8RCpvPox1aZ6QJKr7yXi":528,"QmYbgzdCvovaXny3vTtKDqYDod96h3muNzCLGA4bHpc1tb":527}},"QmS52N82BMT6iETRgSW7mMShpk8RCpvPox1aZ6QJKr7yXi":{"peers":{"QmPkX5wuS1hpFoDsLpTeXoHWjguWMGtebvfNvetNDmcCou":323,"QmUJqkKBqTkQSu29qmCATVg8XnQjPwiouNdrXex892k93x":406,"QmUDhYVp1dDJWHqiCyGaayF8kLRFg2bfCbYnQbS8q1453i":417,"QmdvTacVeaG5Yuhv2UTYZHZgjv8EM91aBRFkXQj6a61Gr2":417,"QmdPAffmCZg5pAGQn2ij5N8HYnpCb1YEjtELjXnfyZXubq":531}},"QmTaPg53bn1tNUD6wuPP5vAQsfqPgFJwjCMTu6tEpm1vyu":{"peers":{"QmRLmTLkDNCEURKuopnpTYzKEzqvjT7ES2t5uEnq8oPoub":337,"QmYLtYNU9C3ppky4qwC63dkyqtoYcmcJKaoSqaRre9FLWa":336,"QmbXrT85yCvZ4bxB6XWiiRR6sgixz6BRVTP9WD6BqzyrCC":424,"QmQHhCVkSMm5tSNt1XKjzMhYXKqwUDhtAogbHsqjUmAtM7":476,"QmUockMJrdX2g4G4WWCZyTrFj81kCx1Y6gpZNdJo9f15zi":573}},"QmUDhYVp1dDJWHqiCyGaayF8kLRFg2bfCbYnQbS8q1453i":{"peers":{"QmPkX5wuS1hpFoDsLpTeXoHWjguWMGtebvfNvetNDmcCou":266,"QmUJqkKBqTkQSu29qmCATVg8XnQjPwiouNdrXex892k93x":281,"QmS52N82BMT6iETRgSW7mMShpk8RCpvPox1aZ6QJKr7yXi":289,"QmdPAffmCZg5pAGQn2ij5N8HYnpCb1YEjtELjXnfyZXubq":458}},"QmZWcrcArcG5bLBRUwy8RRE9KYdunAg9SjNWLbS7RTTwoY":{"peers":{"QmRLmTLkDNCEURKuopnpTYzKEzqvjT7ES2t5uEnq8oPoub":309,"QmSujkwtBMdfF1Wp24RKB2U3wVaEfMGsbPp6pgc9xyHkix":308,"QmbuVAaCvdzjaUZ7XyoRNtagPowGX43yFv9j46pwpzqja7":325,"QmSgrKptqWw8h8Gk6PcAHkD9oD6LTV7bWEjz8fsqWjkrwZ":461}},"QmdFZrQ2EHSy5rJz5z9tAQb4ARZ1kLan3xzXhny22zKy2W":{"peers":{"QmZXut71J5MGyuBi6DZ3SVPnbXVic44BysVzdf3xuUUQsS":316,"QmRSUK8XNmutm5d6zoAKmzbUmE1zX6GR91QPxwYfW466eg":322,"QmZ4zsUcqePYBE8dSzNeDvHnDAXYPSrTDscJFUNggL6zNz":445,"QmRvMqipExRSg7BirF6krSxdTU3B2CCoyS3rYysUkNQLET":445}},"QmZXut71J5MGyuBi6DZ3SVPnbXVic44BysVzdf3xuUUQsS":{"peers":{"Qmdj5Npvtt6GuPuxXWEwvVb3B8WyB94wqbD53uX9Gdp7A4":318,"QmPMiKvoTueLXVLkh3cf5PCa9Loo8veLD3skB2N3LVtyLP":326,"QmRvMqipExRSg7BirF6krSxdTU3B2CCoyS3rYysUkNQLET":357,"QmdFZrQ2EHSy5rJz5z9tAQb4ARZ1kLan3xzXhny22zKy2W":356,"QmTBckLdsNjf4irrRSLoRrR5DgjKe4a8HdT4R36Txjxn7y":465}},"QmPkX5wuS1hpFoDsLpTeXoHWjguWMGtebvfNvetNDmcCou":{"peers":{"QmUDhYVp1dDJWHqiCyGaayF8kLRFg2bfCbYnQbS8q1453i":309,"QmUJqkKBqTkQSu29qmCATVg8XnQjPwiouNdrXex892k93x":320,"QmS52N82BMT6iETRgSW7mMShpk8RCpvPox1aZ6QJKr7yXi":336,"Qmd7wsNZrmq4CsGUXuavT7H3TeWhjrfPABigqajQoYBNL2":436,"QmdPAffmCZg5pAGQn2ij5N8HYnpCb1YEjtELjXnfyZXubq":455}},"QmUZqQAajjUPmeLB7r4RBGP57sAgbfHMdjJ989vLxXgPw2":{"peers":{"QmULGnzXvmiMUkh1cBKvuSpFKHHTnoznESR3ogiULsWxm8":305,"QmQBAzz4za56ATK6CxbNo1a827WVi5hqs4ZbPVHViJsyfJ":328,"QmX8FTicrfyYbkBG6C86asyG6YE5cLb9AUq9ctkdQUG4M9":359,"QmcRzCbX5VHELnuSNHY62wBFdr4NRPANcw7ZKG7NiyZmPU":483}},"QmNZbcFJ8SsqksS4eizfhQhjqUf24fgxHnKp6aMETrhJzV":{"peers":{"QmSTv18pGNNmBit7A5rmRPYz8gqcEPZTJGdPFmUikg7Z79":321,"QmacezByD1yjtvX1ppP3mE8c6zKReCoJsDoqnkKQ9MezR5":466,"Qmf5u8j1vUbcYTtDvA8MkJdzeji3L8ifsunto8hc5MU1GV":466,"QmU9YtWESEyvA74UHFbcV5XnrcR5JAvM8MBPLLmq83MgH4":482}},"QmYKYRyTNCdkEqGQkimNqcRAGiKJZFv9kqh988aSfLqwM2":{"peers":{"QmSnkW6LLqevxNQFieM5BDqmXU8N4toyQv4RgX6NzoQUTD":415,"QmQj8przDc5fJGJEUtNwN9xfvGD79RDBz1kvWsyfMaR54S":418,"QmUzXqUnemMULWMxEFFP1yyDWVaWnct71neZ1jGdY83thj":530,"QmbHPAJ8SZZcVDG5M6FHgpqbJTXCahZyvj4RXzvVY1QFdy":576}},"QmPJYMUDxePyTgMFdTi5zHiMwW1XCLizjQxq9bzBub9qVo":{"peers":{"QmP6rsAhe58cjiq8FC6LZtGXAynfUyx69DEn26tjibufvZ":315,"QmbXcHNBz48yV7Zf1iKmF1mrWGD3THxBoFYHy3A1NUFTvs":347,"QmZ56jywxf6Tk1nFTYP1Zr1dzoCaKcoR55PuAVmXuaMPHQ":449,"QmS61KcAaNU6KAkJgwcKMELkLHjR3uMo4oh1a3sYNoG6wm":480}},"QmfBRYYTB1udH6gT29qPzEbJ8G4LbuQHGNHTvWykK2pabC":{"peers":{"QmdemCtfGxmjZnsafnnNU95YrAYgmaUY4Ay8JxZHSCBttE":271,"QmccYYXMSfgpFCEZTeCRfGeBPE9eeiBWpsr5SsY79jNsxp":303,"QmRo3qwqWgXG6XF1koy2HLvXUxfEJ2puuEYUPbD48qFJ4z":389,"QmVHzz2nNFezhUMs3W4RSsr26tj4hARinAUFzqf7WDYoKP":414}},"QmaM2zoeV7jGo6Zg9N291VwFg9GsGjypLwryhirs8RUUkX":{"peers":{"QmZSKMmEgCa92uvN7GmVeoxobtwM7RuzSVaf2ffigzCZ4D":434,"QmQ3qYnCSKSS3yWcQHmyuH2fr65WZotPWignfz4LGA8qR8":437,"QmT4kKtZvdU2S6CwPeZTCXZzPC9LFuL4PRPJSJYwZ1wHvA":466,"QmYox5W6GQGxJwXsD3LF1Cv175EQMznX7EhaNushFyMDGF":495}},"QmTBckLdsNjf4irrRSLoRrR5DgjKe4a8HdT4R36Txjxn7y":{"peers":{"Qmdj5Npvtt6GuPuxXWEwvVb3B8WyB94wqbD53uX9Gdp7A4":477,"QmZXut71J5MGyuBi6DZ3SVPnbXVic44BysVzdf3xuUUQsS":530,"QmPMiKvoTueLXVLkh3cf5PCa9Loo8veLD3skB2N3LVtyLP":532,"QmPfV5LyaxZUVKm3ep3FEKX6a4fBjo3SZ21Qaef3XC5nbE":534,"QmSnkQpLf56nAja8qQ6FPn9ZB2dRqZcsiUohR3GXio23Rc":677}},"Qmdj5Npvtt6GuPuxXWEwvVb3B8WyB94wqbD53uX9Gdp7A4":{"peers":{"QmPMiKvoTueLXVLkh3cf5PCa9Loo8veLD3skB2N3LVtyLP":321,"QmZXut71J5MGyuBi6DZ3SVPnbXVic44BysVzdf3xuUUQsS":322,"QmRvMqipExRSg7BirF6krSxdTU3B2CCoyS3rYysUkNQLET":347,"QmTBckLdsNjf4irrRSLoRrR5DgjKe4a8HdT4R36Txjxn7y":469,"QmSnkQpLf56nAja8qQ6FPn9ZB2dRqZcsiUohR3GXio23Rc":527}},"QmPMiKvoTueLXVLkh3cf5PCa9Loo8veLD3skB2N3LVtyLP":{"peers":{"Qmdj5Npvtt6GuPuxXWEwvVb3B8WyB94wqbD53uX9Gdp7A4":316,"QmZXut71J5MGyuBi6DZ3SVPnbXVic44BysVzdf3xuUUQsS":315,"QmTBckLdsNjf4irrRSLoRrR5DgjKe4a8HdT4R36Txjxn7y":461,"QmSnkQpLf56nAja8qQ6FPn9ZB2dRqZcsiUohR3GXio23Rc":519}},"QmYf9yPuYDTFVUSpvbiQswKjE9mJsjGQVhPkZE8K28YzDX":{"peers":{"QmQ9tV2asQUaM6XZVsvHVh1pFdBtvtz7zRH6wmcdU6iM1Q":325,"QmPfV5LyaxZUVKm3ep3FEKX6a4fBjo3SZ21Qaef3XC5nbE":340,"QmZUXGqmKAywkFWdGza2yFmd6qMEhq25Z5Ket35Z5zrv82":455,"QmSnkQpLf56nAja8qQ6FPn9ZB2dRqZcsiUohR3GXio23Rc":533}},"QmU9YtWESEyvA74UHFbcV5XnrcR5JAvM8MBPLLmq83MgH4":{"peers":{"QmNZbcFJ8SsqksS4eizfhQhjqUf24fgxHnKp6aMETrhJzV":414,"QmSTv18pGNNmBit7A5rmRPYz8gqcEPZTJGdPFmUikg7Z79":418,"QmacezByD1yjtvX1ppP3mE8c6zKReCoJsDoqnkKQ9MezR5":438,"QmQdve1PJCYMrVRmhShcFWT4Xuk3dYsYBQSzHqPHh6yttY":541,"QmVu1XsV1pixfWJj29xbmTeZypfMcwa5bNtedAkSRTUs53":630}},"QmXEVM4S7TbGEYAsVzpqtjvBgXviwenetiGLJP6R9YJ3a2":{"peers":{"QmVWodYv4A79nQzaZ81ytJT3Tp7CbYaUcun96qRrRcv26C":349,"QmbX8FzcsbEPjJ5bUuzAZQA4gYmNg6xACHTh6hQX3tMhX5":359,"QmeHycYH4Dmdnn7H9WZhjo8c84sbrT9Kmh4MBoWQAoBocd":442,"QmSVfxvHXkXhzRZVH8MaDrX8GaYs4paAiQTn7cmHzUN7ZU":441,"QmT4kKtZvdU2S6CwPeZTCXZzPC9LFuL4PRPJSJYwZ1wHvA":641}},"QmUJqkKBqTkQSu29qmCATVg8XnQjPwiouNdrXex892k93x":{"peers":{"QmPkX5wuS1hpFoDsLpTeXoHWjguWMGtebvfNvetNDmcCou":320,"QmUDhYVp1dDJWHqiCyGaayF8kLRFg2bfCbYnQbS8q1453i":320,"QmS52N82BMT6iETRgSW7mMShpk8RCpvPox1aZ6QJKr7yXi":347,"QmRo3qwqWgXG6XF1koy2HLvXUxfEJ2puuEYUPbD48qFJ4z":447,"Qmd7wsNZrmq4CsGUXuavT7H3TeWhjrfPABigqajQoYBNL2":526}},"QmVWodYv4A79nQzaZ81ytJT3Tp7CbYaUcun96qRrRcv26C":{"peers":{"QmbX8FzcsbEPjJ5bUuzAZQA4gYmNg6xACHTh6hQX3tMhX5":313,"QmbP8Tsr113KHyk2v81pXe7kBpG66rRGtFtNTQhNkq6SQQ":332,"QmXEVM4S7TbGEYAsVzpqtjvBgXviwenetiGLJP6R9YJ3a2":359,"QmSVfxvHXkXhzRZVH8MaDrX8GaYs4paAiQTn7cmHzUN7ZU":435,"QmNiuZNb3GgqW28rJAaMVLUxVHW8uKsERGeBRPR9oBjoCM":561}},"QmSnkQpLf56nAja8qQ6FPn9ZB2dRqZcsiUohR3GXio23Rc":{"peers":{"Qmdj5Npvtt6GuPuxXWEwvVb3B8WyB94wqbD53uX9Gdp7A4":493,"QmPMiKvoTueLXVLkh3cf5PCa9Loo8veLD3skB2N3LVtyLP":491,"QmYf9yPuYDTFVUSpvbiQswKjE9mJsjGQVhPkZE8K28YzDX":503,"QmPfV5LyaxZUVKm3ep3FEKX6a4fBjo3SZ21Qaef3XC5nbE":604,"QmZUXGqmKAywkFWdGza2yFmd6qMEhq25Z5Ket35Z5zrv82":637,"QmTBckLdsNjf4irrRSLoRrR5DgjKe4a8HdT4R36Txjxn7y":640}},"Qmdt7sbStWvs8uA8NumR1F9J4JoQJnBQjtkMPjHX54sE8F":{"peers":{"QmQ9tV2asQUaM6XZVsvHVh1pFdBtvtz7zRH6wmcdU6iM1Q":272,"Qmef3EqyYdMkTcjkXmDuQLNNjWktLzGdin4rT7CVKBFgSy":308,"QmZ3Pqb1gxsVDRt6Lx8k31cw1ufdVhdzhPWjiid3nwQ1mi":336,"QmP4bb5GfuEiwbVyZvtdBk2L82JhTuZB4fRYzp9CgDawds":595}},"QmRLmTLkDNCEURKuopnpTYzKEzqvjT7ES2t5uEnq8oPoub":{"peers":{"QmZWcrcArcG5bLBRUwy8RRE9KYdunAg9SjNWLbS7RTTwoY":304,"QmTaPg53bn1tNUD6wuPP5vAQsfqPgFJwjCMTu6tEpm1vyu":342,"QmbuVAaCvdzjaUZ7XyoRNtagPowGX43yFv9j46pwpzqja7":348,"QmSgrKptqWw8h8Gk6PcAHkD9oD6LTV7bWEjz8fsqWjkrwZ":581}},"QmT4kKtZvdU2S6CwPeZTCXZzPC9LFuL4PRPJSJYwZ1wHvA":{"peers":{"QmbX8FzcsbEPjJ5bUuzAZQA4gYmNg6xACHTh6hQX3tMhX5":499,"QmaM2zoeV7jGo6Zg9N291VwFg9GsGjypLwryhirs8RUUkX":594,"QmXEVM4S7TbGEYAsVzpqtjvBgXviwenetiGLJP6R9YJ3a2":632,"QmSVfxvHXkXhzRZVH8MaDrX8GaYs4paAiQTn7cmHzUN7ZU":638,"QmeHycYH4Dmdnn7H9WZhjo8c84sbrT9Kmh4MBoWQAoBocd":681}},"QmRSUK8XNmutm5d6zoAKmzbUmE1zX6GR91QPxwYfW466eg":{"peers":{"QmdFZrQ2EHSy5rJz5z9tAQb4ARZ1kLan3xzXhny22zKy2W":370,"QmZ4zsUcqePYBE8dSzNeDvHnDAXYPSrTDscJFUNggL6zNz":397,"QmaTgB3EdYtCa6TiqsEEUe1kwaMtCgtKmApa52eog2R7NF":460,"QmZMBMxLbHJDWouSGvMndmCUh1chkQ8vNJ2ug4e61MjbQ6":461,"QmRvMqipExRSg7BirF6krSxdTU3B2CCoyS3rYysUkNQLET":643}},"QmQ3qYnCSKSS3yWcQHmyuH2fr65WZotPWignfz4LGA8qR8":{"peers":{"QmaM2zoeV7jGo6Zg9N291VwFg9GsGjypLwryhirs8RUUkX":507,"QmbXcHNBz48yV7Zf1iKmF1mrWGD3THxBoFYHy3A1NUFTvs":544,"QmYox5W6GQGxJwXsD3LF1Cv175EQMznX7EhaNushFyMDGF":571,"QmZSKMmEgCa92uvN7GmVeoxobtwM7RuzSVaf2ffigzCZ4D":667}},"QmYox5W6GQGxJwXsD3LF1Cv175EQMznX7EhaNushFyMDGF":{"peers":{"QmaM2zoeV7jGo6Zg9N291VwFg9GsGjypLwryhirs8RUUkX":593,"QmQ3qYnCSKSS3yWcQHmyuH2fr65WZotPWignfz4LGA8qR8":631,"QmbXcHNBz48yV7Zf1iKmF1mrWGD3THxBoFYHy3A1NUFTvs":630,"QmZSKMmEgCa92uvN7GmVeoxobtwM7RuzSVaf2ffigzCZ4D":754}},"QmfBgxpg3ynZqhN3drCuF4aWDuNBRij6dAgRFFpPkYpEHy":{"peers":{"QmQj8przDc5fJGJEUtNwN9xfvGD79RDBz1kvWsyfMaR54S":600,"QmZ56jywxf6Tk1nFTYP1Zr1dzoCaKcoR55PuAVmXuaMPHQ":617,"QmUbh4vTFsCabh4qmsPxBQ5o7vym38ZjBwZH4tqrMqr1Qd":653,"QmbHPAJ8SZZcVDG5M6FHgpqbJTXCahZyvj4RXzvVY1QFdy":712,"QmS61KcAaNU6KAkJgwcKMELkLHjR3uMo4oh1a3sYNoG6wm":745}},"QmacezByD1yjtvX1ppP3mE8c6zKReCoJsDoqnkKQ9MezR5":{"peers":{"QmNZbcFJ8SsqksS4eizfhQhjqUf24fgxHnKp6aMETrhJzV":463,"QmSTv18pGNNmBit7A5rmRPYz8gqcEPZTJGdPFmUikg7Z79":464,"QmU9YtWESEyvA74UHFbcV5XnrcR5JAvM8MBPLLmq83MgH4":486,"QmQdve1PJCYMrVRmhShcFWT4Xuk3dYsYBQSzHqPHh6yttY":810}},"QmSTv18pGNNmBit7A5rmRPYz8gqcEPZTJGdPFmUikg7Z79":{"peers":{"QmNZbcFJ8SsqksS4eizfhQhjqUf24fgxHnKp6aMETrhJzV":309,"QmacezByD1yjtvX1ppP3mE8c6zKReCoJsDoqnkKQ9MezR5":467,"QmU9YtWESEyvA74UHFbcV5XnrcR5JAvM8MBPLLmq83MgH4":471,"QmQdve1PJCYMrVRmhShcFWT4Xuk3dYsYBQSzHqPHh6yttY":769}},"QmZSKMmEgCa92uvN7GmVeoxobtwM7RuzSVaf2ffigzCZ4D":{"peers":{"QmaM2zoeV7jGo6Zg9N291VwFg9GsGjypLwryhirs8RUUkX":432,"QmQ3qYnCSKSS3yWcQHmyuH2fr65WZotPWignfz4LGA8qR8":469,"QmbXcHNBz48yV7Zf1iKmF1mrWGD3THxBoFYHy3A1NUFTvs":579,"QmYox5W6GQGxJwXsD3LF1Cv175EQMznX7EhaNushFyMDGF":580,"QmS61KcAaNU6KAkJgwcKMELkLHjR3uMo4oh1a3sYNoG6wm":625}},"QmbzC1BMvHwhXWNFEbDNM6AvfQ2jKCRYoMLqWUuZqgA6wp":{"peers":{"QmNxNQU19BH5Buvwcvp1uGZk2qeptbRPw6vAAdZEyxpEnA":398,"QmNifBdjABYjCrKBbDXCZ7MBzS9eSgDbUo3QRBRZXaxtbr":415,"QmRStPfnrmJkvwdup5eNhCGox5w7YbBzuZSRPai15cMwLU":439,"QmTdoGdWjP1VJsKtB6HGtUr9HxZtYapquwRC9hi5GpRPcm":718,"QmVSr1iEKbc3ZgL9S3izoWMVW6zDLYqTJN8i4xYJM4graH":914}},"QmUockMJrdX2g4G4WWCZyTrFj81kCx1Y6gpZNdJo9f15zi":{"peers":{"QmYLtYNU9C3ppky4qwC63dkyqtoYcmcJKaoSqaRre9FLWa":856,"QmTaPg53bn1tNUD6wuPP5vAQsfqPgFJwjCMTu6tEpm1vyu":856,"QmbXrT85yCvZ4bxB6XWiiRR6sgixz6BRVTP9WD6BqzyrCC":997,"QmQHhCVkSMm5tSNt1XKjzMhYXKqwUDhtAogbHsqjUmAtM7":997}},"QmQdve1PJCYMrVRmhShcFWT4Xuk3dYsYBQSzHqPHh6yttY":{"peers":{"QmU9YtWESEyvA74UHFbcV5XnrcR5JAvM8MBPLLmq83MgH4":597,"QmSTv18pGNNmBit7A5rmRPYz8gqcEPZTJGdPFmUikg7Z79":599,"QmacezByD1yjtvX1ppP3mE8c6zKReCoJsDoqnkKQ9MezR5":617,"QmVu1XsV1pixfWJj29xbmTeZypfMcwa5bNtedAkSRTUs53":738,"QmTdoGdWjP1VJsKtB6HGtUr9HxZtYapquwRC9hi5GpRPcm":862}},"QmbP8Tsr113KHyk2v81pXe7kBpG66rRGtFtNTQhNkq6SQQ":{"peers":{"QmVWodYv4A79nQzaZ81ytJT3Tp7CbYaUcun96qRrRcv26C":311,"QmNxNQU19BH5Buvwcvp1uGZk2qeptbRPw6vAAdZEyxpEnA":379,"QmNifBdjABYjCrKBbDXCZ7MBzS9eSgDbUo3QRBRZXaxtbr":512,"QmQN2KwQLn7X7UWytWagoCHD3AACEfe5WSRJaYoDE8EA7u":570,"QmNiuZNb3GgqW28rJAaMVLUxVHW8uKsERGeBRPR9oBjoCM":633}},"QmVu1XsV1pixfWJj29xbmTeZypfMcwa5bNtedAkSRTUs53":{"peers":{"QmU9YtWESEyvA74UHFbcV5XnrcR5JAvM8MBPLLmq83MgH4":623,"QmTdoGdWjP1VJsKtB6HGtUr9HxZtYapquwRC9hi5GpRPcm":1007,"QmQdve1PJCYMrVRmhShcFWT4Xuk3dYsYBQSzHqPHh6yttY":1010,"QmVSr1iEKbc3ZgL9S3izoWMVW6zDLYqTJN8i4xYJM4graH":1007}},"QmTdoGdWjP1VJsKtB6HGtUr9HxZtYapquwRC9hi5GpRPcm":{"peers":{"QmRStPfnrmJkvwdup5eNhCGox5w7YbBzuZSRPai15cMwLU":597,"QmbzC1BMvHwhXWNFEbDNM6AvfQ2jKCRYoMLqWUuZqgA6wp":612,"QmVu1XsV1pixfWJj29xbmTeZypfMcwa5bNtedAkSRTUs53":712,"QmQdve1PJCYMrVRmhShcFWT4Xuk3dYsYBQSzHqPHh6yttY":924,"QmVSr1iEKbc3ZgL9S3izoWMVW6zDLYqTJN8i4xYJM4graH":987}},"QmWr1DBaRozjQFWhwVjQ5rdZo4QVfhWPEQBjqRAxMVvRqr":{"peers":{"QmcoQs8suoTG9qVGvwswporFoyT9K843tHwq9D3CZVDXav":377,"QmRR8QugZqTJy6VaExiEbKQspfZFSkkMWgoTugaFUvLJW2":376,"Qmf5Av4qGppUVcy2eZYMy8hcsovuyUQhV6T4oj3FKiqS4S":508,"QmezmYFKMiRMYymHE3Da1fCZa7pPy7a9VYyMSFQnb6hMBr":1090}},"QmUzXqUnemMULWMxEFFP1yyDWVaWnct71neZ1jGdY83thj":{"peers":{"QmSnkW6LLqevxNQFieM5BDqmXU8N4toyQv4RgX6NzoQUTD":485,"QmYKYRyTNCdkEqGQkimNqcRAGiKJZFv9kqh988aSfLqwM2":515,"QmbHPAJ8SZZcVDG5M6FHgpqbJTXCahZyvj4RXzvVY1QFdy":620,"QmeXLbFnUJVTk2gRSEfv9KD1ocYBT7PrBATV4rXAuh73ie":651,"QmezmYFKMiRMYymHE3Da1fCZa7pPy7a9VYyMSFQnb6hMBr":1160}},"QmNxNQU19BH5Buvwcvp1uGZk2qeptbRPw6vAAdZEyxpEnA":{"peers":{"QmbzC1BMvHwhXWNFEbDNM6AvfQ2jKCRYoMLqWUuZqgA6wp":266,"QmbP8Tsr113KHyk2v81pXe7kBpG66rRGtFtNTQhNkq6SQQ":277,"QmNifBdjABYjCrKBbDXCZ7MBzS9eSgDbUo3QRBRZXaxtbr":384,"QmQN2KwQLn7X7UWytWagoCHD3AACEfe5WSRJaYoDE8EA7u":674,"QmNiuZNb3GgqW28rJAaMVLUxVHW8uKsERGeBRPR9oBjoCM":1039}},"QmVSr1iEKbc3ZgL9S3izoWMVW6zDLYqTJN8i4xYJM4graH":{"peers":{"QmRStPfnrmJkvwdup5eNhCGox5w7YbBzuZSRPai15cMwLU":589,"QmTdoGdWjP1VJsKtB6HGtUr9HxZtYapquwRC9hi5GpRPcm":773,"QmNifBdjABYjCrKBbDXCZ7MBzS9eSgDbUo3QRBRZXaxtbr":1025,"QmbzC1BMvHwhXWNFEbDNM6AvfQ2jKCRYoMLqWUuZqgA6wp":1068,"QmVu1XsV1pixfWJj29xbmTeZypfMcwa5bNtedAkSRTUs53":1153}},"QmNiuZNb3GgqW28rJAaMVLUxVHW8uKsERGeBRPR9oBjoCM":{"peers":{"QmVWodYv4A79nQzaZ81ytJT3Tp7CbYaUcun96qRrRcv26C":440,"QmNxNQU19BH5Buvwcvp1uGZk2qeptbRPw6vAAdZEyxpEnA":564,"QmQN2KwQLn7X7UWytWagoCHD3AACEfe5WSRJaYoDE8EA7u":838,"QmbP8Tsr113KHyk2v81pXe7kBpG66rRGtFtNTQhNkq6SQQ":1135}},"QmezmYFKMiRMYymHE3Da1fCZa7pPy7a9VYyMSFQnb6hMBr":{"peers":{"QmeXLbFnUJVTk2gRSEfv9KD1ocYBT7PrBATV4rXAuh73ie":940,"QmWr1DBaRozjQFWhwVjQ5rdZo4QVfhWPEQBjqRAxMVvRqr":981,"QmUzXqUnemMULWMxEFFP1yyDWVaWnct71neZ1jGdY83thj":1225,"QmbHPAJ8SZZcVDG5M6FHgpqbJTXCahZyvj4RXzvVY1QFdy":1224,"QmcoQs8suoTG9qVGvwswporFoyT9K843tHwq9D3CZVDXav":1319}},"QmTviqG5GdwC4cWg5Pxj2u6eJ1ayt8w5N4h2Tg8hoM63AB":{"peers":{"QmccYYXMSfgpFCEZTeCRfGeBPE9eeiBWpsr5SsY79jNsxp":579,"QmYLtYNU9C3ppky4qwC63dkyqtoYcmcJKaoSqaRre9FLWa":580,"QmdoyKpjskdUaKoLYunw259WwgvmavcBZTMSLnN4zYWYLV":581,"QmdemCtfGxmjZnsafnnNU95YrAYgmaUY4Ay8JxZHSCBttE":581,"Qma1V2bzxN9oGCzFmoztAckEVEYgdWdog4cfZ5EtwowmEh":1459}},"QmdemCtfGxmjZnsafnnNU95YrAYgmaUY4Ay8JxZHSCBttE":{"peers":{"QmccYYXMSfgpFCEZTeCRfGeBPE9eeiBWpsr5SsY79jNsxp":296,"QmfBRYYTB1udH6gT29qPzEbJ8G4LbuQHGNHTvWykK2pabC":339,"QmVHzz2nNFezhUMs3W4RSsr26tj4hARinAUFzqf7WDYoKP":431,"QmTviqG5GdwC4cWg5Pxj2u6eJ1ayt8w5N4h2Tg8hoM63AB":585,"Qma1V2bzxN9oGCzFmoztAckEVEYgdWdog4cfZ5EtwowmEh":1375}},"QmccYYXMSfgpFCEZTeCRfGeBPE9eeiBWpsr5SsY79jNsxp":{"peers":{"QmdemCtfGxmjZnsafnnNU95YrAYgmaUY4Ay8JxZHSCBttE":320,"QmfBRYYTB1udH6gT29qPzEbJ8G4LbuQHGNHTvWykK2pabC":330,"QmVHzz2nNFezhUMs3W4RSsr26tj4hARinAUFzqf7WDYoKP":455,"QmTviqG5GdwC4cWg5Pxj2u6eJ1ayt8w5N4h2Tg8hoM63AB":468,"Qma1V2bzxN9oGCzFmoztAckEVEYgdWdog4cfZ5EtwowmEh":1396}},"QmVHzz2nNFezhUMs3W4RSsr26tj4hARinAUFzqf7WDYoKP":{"peers":{"QmccYYXMSfgpFCEZTeCRfGeBPE9eeiBWpsr5SsY79jNsxp":444,"QmdemCtfGxmjZnsafnnNU95YrAYgmaUY4Ay8JxZHSCBttE":444,"QmfBRYYTB1udH6gT29qPzEbJ8G4LbuQHGNHTvWykK2pabC":503,"Qmd7wsNZrmq4CsGUXuavT7H3TeWhjrfPABigqajQoYBNL2":651,"Qma1V2bzxN9oGCzFmoztAckEVEYgdWdog4cfZ5EtwowmEh":1526}},"Qma1V2bzxN9oGCzFmoztAckEVEYgdWdog4cfZ5EtwowmEh":{"peers":{"QmdemCtfGxmjZnsafnnNU95YrAYgmaUY4Ay8JxZHSCBttE":101,"QmccYYXMSfgpFCEZTeCRfGeBPE9eeiBWpsr5SsY79jNsxp":117,"QmdoyKpjskdUaKoLYunw259WwgvmavcBZTMSLnN4zYWYLV":138,"QmTviqG5GdwC4cWg5Pxj2u6eJ1ayt8w5N4h2Tg8hoM63AB":187,"QmVHzz2nNFezhUMs3W4RSsr26tj4hARinAUFzqf7WDYoKP":255}}}
function buildGraph(data) {
const GOOD = '#1f77b4'
const BAD = '#aec7e8'
const MISSING = '#ff7f0e'
const graph = { nodes: [], links: [] }
// first add kitsunet nodes
Object.keys(data).forEach((clientId) => {
const peerData = data[clientId].peers
const badResponse = (typeof peerData !== 'object')
graph.nodes.push({ id: clientId, color: badResponse ? BAD : GOOD })
})
// then links
Object.keys(data).forEach((clientId) => {
const peerData = data[clientId].peers
if (typeof peerData !== 'object') return
Object.keys(peerData).forEach((peerId) => {
// if connected to a missing node, create node
const alreadyExists = !!graph.nodes.find(item => item.id === peerId)
if (!alreadyExists) {
graph.nodes.push({ id: peerId, color: MISSING })
}
graph.links.push({ source: clientId, target: peerId, value: 1 })
})
})
return graph
}
const graph = buildGraph(data)
drawGraph(graph)
function drawGraph(graph) {
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height");
// var color = d3.scaleOrdinal(d3.schemeCategory20);
var simulation = d3.forceSimulation()
.force("link", d3.forceLink().id(function(d) { return d.id; }))
.force("charge", d3.forceManyBody())
.force("center", d3.forceCenter(width / 2, height / 2))
.force("x", d3.forceX(width / 2).strength(.05))
.force("y", d3.forceY(height / 2).strength(.05))
var link = svg.append("g")
.attr("class", "links")
.selectAll("line")
.data(graph.links)
.enter().append("line")
.attr("stroke-width", function(d) { return Math.sqrt(d.value); });
var node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(graph.nodes)
.enter().append("circle")
.attr("r", 5)
.attr("fill", function(d) { return d.color })
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
node.append("title")
.text(function(d) { return d.id; });
simulation
.nodes(graph.nodes)
.on("tick", ticked);
simulation.force("link")
.links(graph.links);
addLegend()
function ticked() {
link
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}
function dragstarted(d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(d) {
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function dragended(d) {
if (!d3.event.active) simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
function addLegend() {
var legendData = d3.scaleOrdinal()
.domain(["GOOD - connected to Command N Control (CNC) node", "BAD - bad response", "MISSING - not connected to CNC but known to peers via libp2p"])
.range([ '#1f77b4', '#aec7e8', '#ff7f0e' ]);
var svg = d3.select("svg");
var legend = svg.append("g")
.attr("class", "legend")
.attr("transform", "translate(20,20)")
var legendRect = legend
.selectAll('g')
.data(legendData.domain());
var legendRectE = legendRect.enter()
.append("g")
.attr("transform", function(d,i){
return 'translate(0, ' + (i * 20) + ')';
});
legendRectE
.append('path')
.attr("d", d3.symbol().type(d3.symbolCircle))
.style("fill", function (d,i) {
return legendData(i);
});
legendRectE
.append("text")
.attr("x", 10)
.attr("y", 5)
.text(function (d) {
return d;
});
} // end addLegend()
}
</script>