diff --git a/server/src/main.cpp b/server/src/main.cpp
index 22ebf1d..763d32a 100644
--- a/server/src/main.cpp
+++ b/server/src/main.cpp
@@ -245,7 +245,7 @@ void CMain::JSONUpdateThread(void *pUser)
 		char aFileBuf[2048*NET_MAX_CLIENTS];
 		char *pBuf = aFileBuf;
 
-		str_format(pBuf, sizeof(aFileBuf), "{\n\"servers\": [\n");
+		str_format(pBuf, sizeof(aFileBuf), "{\n\"servers\": {\n");
 		pBuf += strlen(pBuf);
 
 		for(int i = 0; i < NET_MAX_CLIENTS; i++)
@@ -278,7 +278,8 @@ void CMain::JSONUpdateThread(void *pUser)
                 }
 
 				str_format(pBuf, sizeof(aFileBuf) - (pBuf - aFileBuf),
-				 "{ \"name\": \"%s\",\"type\": \"%s\",\"host\": \"%s\",\"location\": \"%s\",\"online4\": %s, \"online6\": %s, \"uptime\": \"%s\",\"load_1\": %.2f, \"load_5\": %.2f, \"load_15\": %.2f,\"ping_10010\": %.2f, \"ping_189\": %.2f, \"ping_10086\": %.2f,\"time_10010\": %" PRId64 ", \"time_189\": %" PRId64 ", \"time_10086\": %" PRId64 ", \"tcp_count\": %" PRId64 ", \"udp_count\": %" PRId64 ", \"process_count\": %" PRId64 ", \"thread_count\": %" PRId64 ", \"network_rx\": %" PRId64 ", \"network_tx\": %" PRId64 ", \"network_in\": %" PRId64 ", \"network_out\": %" PRId64 ", \"cpu\": %d, \"memory_total\": %" PRId64 ", \"memory_used\": %" PRId64 ", \"swap_total\": %" PRId64 ", \"swap_used\": %" PRId64 ", \"hdd_total\": %" PRId64 ", \"hdd_used\": %" PRId64 ", \"last_network_in\": %" PRId64 ", \"last_network_out\": %" PRId64 ",\"io_read\": %" PRId64 ", \"io_write\": %" PRId64 ",\"custom\": \"%s\" },\n",
+				 "\"%s\":{ \"name\": \"%s\",\"type\": \"%s\",\"host\": \"%s\",\"location\": \"%s\",\"online4\": %s, \"online6\": %s, \"uptime\": \"%s\",\"load_1\": %.2f, \"load_5\": %.2f, \"load_15\": %.2f,\"ping_10010\": %.2f, \"ping_189\": %.2f, \"ping_10086\": %.2f,\"time_10010\": %" PRId64 ", \"time_189\": %" PRId64 ", \"time_10086\": %" PRId64 ", \"tcp_count\": %" PRId64 ", \"udp_count\": %" PRId64 ", \"process_count\": %" PRId64 ", \"thread_count\": %" PRId64 ", \"network_rx\": %" PRId64 ", \"network_tx\": %" PRId64 ", \"network_in\": %" PRId64 ", \"network_out\": %" PRId64 ", \"cpu\": %d, \"memory_total\": %" PRId64 ", \"memory_used\": %" PRId64 ", \"swap_total\": %" PRId64 ", \"swap_used\": %" PRId64 ", \"hdd_total\": %" PRId64 ", \"hdd_used\": %" PRId64 ", \"last_network_in\": %" PRId64 ", \"last_network_out\": %" PRId64 ",\"io_read\": %" PRId64 ", \"io_write\": %" PRId64 ",\"custom\": \"%s\" },\n",
+				    pClients[i].m_aUsername,
 					pClients[i].m_aName,pClients[i].m_aType,pClients[i].m_aHost,pClients[i].m_aLocation,
 					pClients[i].m_Stats.m_Online4 ? "true" : "false",pClients[i].m_Stats.m_Online6 ? "true" : "false",
 					aUptime, pClients[i].m_Stats.m_Load_1, pClients[i].m_Stats.m_Load_5, pClients[i].m_Stats.m_Load_15, pClients[i].m_Stats.m_ping_10010, pClients[i].m_Stats.m_ping_189, pClients[i].m_Stats.m_ping_10086,
@@ -295,16 +296,16 @@ void CMain::JSONUpdateThread(void *pUser)
 			{
 			    // sava network traffic record to json when close client
 			    // last_network_in == last network in record, last_network_out == last network out record
-				str_format(pBuf, sizeof(aFileBuf) - (pBuf - aFileBuf), "{ \"name\": \"%s\", \"type\": \"%s\", \"host\": \"%s\", \"location\": \"%s\", \"online4\": false, \"online6\": false, \"last_network_in\": %" PRId64 ", \"last_network_out\": %" PRId64 " },\n",
+				str_format(pBuf, sizeof(aFileBuf) - (pBuf - aFileBuf), "\"%s\":{ \"name\": \"%s\", \"type\": \"%s\", \"host\": \"%s\", \"location\": \"%s\", \"online4\": false, \"online6\": false, \"last_network_in\": %" PRId64 ", \"last_network_out\": %" PRId64 " },\n",pClients[i].m_aUsername,
 					pClients[i].m_aName, pClients[i].m_aType, pClients[i].m_aHost, pClients[i].m_aLocation, pClients[i].m_LastNetworkIN, pClients[i].m_LastNetworkOUT);
 				pBuf += strlen(pBuf);
 			}
 		}
 		if(!m_pJSONUpdateThreadData->m_ReloadRequired)
-			str_format(pBuf - 2, sizeof(aFileBuf) - (pBuf - aFileBuf), "\n],\n\"updated\": \"%lld\"\n}", (long long)time(/*ago*/0));
+			str_format(pBuf - 2, sizeof(aFileBuf) - (pBuf - aFileBuf), "\n},\n\"updated\": \"%lld\"\n}", (long long)time(/*ago*/0));
 		else
 		{
-			str_format(pBuf - 2, sizeof(aFileBuf) - (pBuf - aFileBuf), "\n],\n\"updated\": \"%lld\",\n\"reload\": true\n}", (long long)time(/*ago*/0));
+			str_format(pBuf - 2, sizeof(aFileBuf) - (pBuf - aFileBuf), "\n},\n\"updated\": \"%lld\",\n\"reload\": true\n}", (long long)time(/*ago*/0));
 			m_pJSONUpdateThreadData->m_ReloadRequired--;
 		}
 		pBuf += strlen(pBuf);
@@ -442,17 +443,11 @@ int CMain::ReadConfig()
                 {
                     if(ID < 0 || ID >= NET_MAX_CLIENTS)
                         continue;
-                    for(unsigned j = 0; j < cStart.u.array.length; j++)
+                    char *uName = rStart[i]["username"].u.string.ptr;
+                    if(strlen(cStart[uName]["name"]) != 0)
                     {
-                        if(strcmp(Client(ID)->m_aName, cStart[j]["name"].u.string.ptr)==0 &&
-                            strcmp(Client(ID)->m_aType, cStart[j]["type"].u.string.ptr)==0 &&
-                            strcmp(Client(ID)->m_aHost, cStart[j]["host"].u.string.ptr)==0 &&
-                            strcmp(Client(ID)->m_aLocation, cStart[j]["location"].u.string.ptr)==0)
-                        {
-                            Client(ID)->m_LastNetworkIN = cStart[j]["last_network_in"].u.integer;
-                            Client(ID)->m_LastNetworkOUT = cStart[j]["last_network_out"].u.integer;
-                            break;
-                        }
+                        Client(ID)->m_LastNetworkIN = cStart[uName]["last_network_in"].u.integer;
+                        Client(ID)->m_LastNetworkOUT = cStart[uName]["last_network_out"].u.integer;
                     }
                     ID++;
                 }
diff --git a/web/js/serverstatus.js b/web/js/serverstatus.js
index 9b34d96..0fc9e27 100644
--- a/web/js/serverstatus.js
+++ b/web/js/serverstatus.js
@@ -4,7 +4,7 @@ var d = 0;
 var server_status = new Array();
 
 function timeSince(date) {
-	if(date == 0)
+	if (date == 0)
 		return "从未.";
 
 	var seconds = Math.floor((new Date() - date) / 1000);
@@ -15,11 +15,10 @@ function timeSince(date) {
 		return "几秒前.";
 }
 
-function bytesToSize(bytes, precision, si)
-{
+function bytesToSize(bytes, precision, si) {
 	var ret;
 	si = typeof si !== 'undefined' ? si : 0;
-	if(si != 0) {
+	if (si != 0) {
 		var megabyte = 1000 * 1000;
 		var gigabyte = megabyte * 1000;
 		var terabyte = gigabyte * 1000;
@@ -50,40 +49,41 @@ function bytesToSize(bytes, precision, si)
 }
 
 function uptime() {
-	$.getJSON("json/stats.json", function(result) {
+	$.getJSON("json/stats.json", function (result) {
 		$("#loading-notice").remove();
-		if(result.reload)
-			setTimeout(function() { location.reload() }, 1000);
+		if (result.reload)
+			setTimeout(function () { location.reload() }, 1000);
 
-		for (var i = 0, rlen=result.servers.length; i < rlen; i++) {
+		let i = 0;
+		for (let key in result.servers) {
 			var TableRow = $("#servers tr#r" + i);
 			var ExpandRow = $("#servers #rt" + i);
 			var hack; // fuck CSS for making me do this
-			if(i%2) hack="odd"; else hack="even";
+			if (i % 2) hack = "odd"; else hack = "even";
 			if (!TableRow.length) {
 				$("#servers").append(
 					"<tr id=\"r" + i + "\" data-toggle=\"collapse\" data-target=\"#rt" + i + "\" class=\"accordion-toggle " + hack + "\">" +
-						"<td id=\"online_status\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"month_traffic\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"name\">加载中</td>" +
-						"<td id=\"type\">加载中</td>" +
-						"<td id=\"location\">加载中</td>" +
-						"<td id=\"uptime\">加载中</td>" +
-						"<td id=\"load\">加载中</td>" +
-						"<td id=\"network\">加载中</td>" +
-						"<td id=\"traffic\">加载中</td>" +
-						"<td id=\"cpu\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"memory\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"hdd\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
-						"<td id=\"ping\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
+					"<td id=\"online_status\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
+					"<td id=\"month_traffic\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
+					"<td id=\"name\">加载中</td>" +
+					"<td id=\"type\">加载中</td>" +
+					"<td id=\"location\">加载中</td>" +
+					"<td id=\"uptime\">加载中</td>" +
+					"<td id=\"load\">加载中</td>" +
+					"<td id=\"network\">加载中</td>" +
+					"<td id=\"traffic\">加载中</td>" +
+					"<td id=\"cpu\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
+					"<td id=\"memory\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
+					"<td id=\"hdd\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
+					"<td id=\"ping\"><div class=\"progress\"><div style=\"width: 100%;\" class=\"progress-bar progress-bar-warning\"><small>加载中</small></div></div></td>" +
 					"</tr>" +
 					"<tr class=\"expandRow " + hack + "\"><td colspan=\"16\"><div class=\"accordian-body collapse\" id=\"rt" + i + "\">" +
-						"<div id=\"expand_mem\">加载中</div>" +
-						"<div id=\"expand_swap\">加载中</div>" +
-						"<div id=\"expand_hdd\">加载中</div>" +
-						"<div id=\"expand_tupd\">加载中</div>" +
-						"<div id=\"expand_ping\">加载中</div>" +
-						"<div id=\"expand_custom\">加载中</div>" +
+					"<div id=\"expand_mem\">加载中</div>" +
+					"<div id=\"expand_swap\">加载中</div>" +
+					"<div id=\"expand_hdd\">加载中</div>" +
+					"<div id=\"expand_tupd\">加载中</div>" +
+					"<div id=\"expand_ping\">加载中</div>" +
+					"<div id=\"expand_custom\">加载中</div>" +
 					"</div></td></tr>"
 				);
 				TableRow = $("#servers tr#r" + i);
@@ -91,20 +91,20 @@ function uptime() {
 				server_status[i] = true;
 			}
 			TableRow = TableRow[0];
-			if(error) {
+			if (error) {
 				TableRow.setAttribute("data-target", "#rt" + i);
 				server_status[i] = true;
 			}
 
 			// online_status
-			if (result.servers[i].online4 && !result.servers[i].online6) {
+			if (result.servers[key].online4 && !result.servers[key].online6) {
 				TableRow.children["online_status"].children[0].children[0].className = "progress-bar progress-bar-success";
 				TableRow.children["online_status"].children[0].children[0].innerHTML = "<small>IPv4</small>";
-			} else if (result.servers[i].online4 && result.servers[i].online6) {
+			} else if (result.servers[key].online4 && result.servers[key].online6) {
 				TableRow.children["online_status"].children[0].children[0].className = "progress-bar progress-bar-success";
 				TableRow.children["online_status"].children[0].children[0].innerHTML = "<small>双栈</small>";
-			} else if (!result.servers[i].online4 && result.servers[i].online6) {
-			    TableRow.children["online_status"].children[0].children[0].className = "progress-bar progress-bar-success";
+			} else if (!result.servers[key].online4 && result.servers[key].online6) {
+				TableRow.children["online_status"].children[0].children[0].className = "progress-bar progress-bar-success";
 				TableRow.children["online_status"].children[0].children[0].innerHTML = "<small>IPv6</small>";
 			} else {
 				TableRow.children["online_status"].children[0].children[0].className = "progress-bar progress-bar-danger";
@@ -112,20 +112,20 @@ function uptime() {
 			}
 
 			// Name
-			TableRow.children["name"].innerHTML = result.servers[i].name;
+			TableRow.children["name"].innerHTML = result.servers[key].name;
 
 			// Type
-			TableRow.children["type"].innerHTML = result.servers[i].type;
+			TableRow.children["type"].innerHTML = result.servers[key].type;
 
 			// Location
-			TableRow.children["location"].innerHTML = result.servers[i].location;
-			if (!result.servers[i].online4 && !result.servers[i].online6) {
+			TableRow.children["location"].innerHTML = result.servers[key].location;
+			if (!result.servers[key].online4 && !result.servers[key].online6) {
 				if (server_status[i]) {
 					TableRow.children["uptime"].innerHTML = "–";
 					TableRow.children["load"].innerHTML = "–";
 					TableRow.children["network"].innerHTML = "–";
 					TableRow.children["traffic"].innerHTML = "–";
-					TableRow.children["month_traffic"].children[0].children[0].className = "progress-bar progress-bar-warning";
+					TableRow.children["month_traffic"].children[0].children[0].className = "progress-bar progress-bar-danger";
 					TableRow.children["month_traffic"].children[0].children[0].innerHTML = "<small>关闭</small>";
 					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
 					TableRow.children["cpu"].children[0].children[0].style.width = "100%";
@@ -139,7 +139,7 @@ function uptime() {
 					TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-danger";
 					TableRow.children["ping"].children[0].children[0].style.width = "100%";
 					TableRow.children["ping"].children[0].children[0].innerHTML = "<small>关闭</small>";
-					if(ExpandRow.hasClass("in")) {
+					if (ExpandRow.hasClass("in")) {
 						ExpandRow.collapse("hide");
 					}
 					TableRow.setAttribute("data-target", "");
@@ -153,68 +153,68 @@ function uptime() {
 
 				// month traffic
 				var monthtraffic = "";
-				var trafficdiff_in = result.servers[i].network_in - result.servers[i].last_network_in;
-				var trafficdiff_out = result.servers[i].network_out - result.servers[i].last_network_out;
-				if(trafficdiff_in < 1024*1024*1024*1024)
-					monthtraffic += (trafficdiff_in/1024/1024/1024).toFixed(1) + "G";
+				var trafficdiff_in = result.servers[key].network_in - result.servers[key].last_network_in;
+				var trafficdiff_out = result.servers[key].network_out - result.servers[key].last_network_out;
+				if (trafficdiff_in < 1024 * 1024 * 1024 * 1024)
+					monthtraffic += (trafficdiff_in / 1024 / 1024 / 1024).toFixed(1) + "G";
 				else
-					monthtraffic += (trafficdiff_in/1024/1024/1024/1024).toFixed(1) + "T";
+					monthtraffic += (trafficdiff_in / 1024 / 1024 / 1024 / 1024).toFixed(1) + "T";
 				monthtraffic += " | "
-				if(trafficdiff_out < 1024*1024*1024*1024)
-					monthtraffic += (trafficdiff_out/1024/1024/1024).toFixed(1) + "G";
+				if (trafficdiff_out < 1024 * 1024 * 1024 * 1024)
+					monthtraffic += (trafficdiff_out / 1024 / 1024 / 1024).toFixed(1) + "G";
 				else
-					monthtraffic += (trafficdiff_out/1024/1024/1024/1024).toFixed(1) + "T";
+					monthtraffic += (trafficdiff_out / 1024 / 1024 / 1024 / 1024).toFixed(1) + "T";
 				TableRow.children["month_traffic"].children[0].children[0].className = "progress-bar progress-bar-success";
-				TableRow.children["month_traffic"].children[0].children[0].innerHTML = "<small>"+monthtraffic+"</small>";
+				TableRow.children["month_traffic"].children[0].children[0].innerHTML = "<small>" + monthtraffic + "</small>";
 
 				// Uptime
-				TableRow.children["uptime"].innerHTML = result.servers[i].uptime;
+				TableRow.children["uptime"].innerHTML = result.servers[key].uptime;
 
 				// Load: default load_1, you can change show: load_1, load_5, load_15
-				if(result.servers[i].load == -1) {
-				    TableRow.children["load"].innerHTML = "–";
+				if (result.servers[key].load == -1) {
+					TableRow.children["load"].innerHTML = "–";
 				} else {
-				    TableRow.children["load"].innerHTML = result.servers[i].load_1.toFixed(2);
+					TableRow.children["load"].innerHTML = result.servers[key].load_1.toFixed(2);
 				}
 
 				// Network
 				var netstr = "";
-				if(result.servers[i].network_rx < 1024*1024)
-					netstr += (result.servers[i].network_rx/1024).toFixed(1) + "K";
+				if (result.servers[key].network_rx < 1024 * 1024)
+					netstr += (result.servers[key].network_rx / 1024).toFixed(1) + "K";
 				else
-					netstr += (result.servers[i].network_rx/1024/1024).toFixed(1) + "M";
+					netstr += (result.servers[key].network_rx / 1024 / 1024).toFixed(1) + "M";
 				netstr += " | "
-				if(result.servers[i].network_tx < 1024*1024)
-					netstr += (result.servers[i].network_tx/1024).toFixed(1) + "K";
+				if (result.servers[key].network_tx < 1024 * 1024)
+					netstr += (result.servers[key].network_tx / 1024).toFixed(1) + "K";
 				else
-					netstr += (result.servers[i].network_tx/1024/1024).toFixed(1) + "M";
+					netstr += (result.servers[key].network_tx / 1024 / 1024).toFixed(1) + "M";
 				TableRow.children["network"].innerHTML = netstr;
 
 				//Traffic
 				var trafficstr = "";
-				if(result.servers[i].network_in < 1024*1024*1024*1024)
-					trafficstr += (result.servers[i].network_in/1024/1024/1024).toFixed(1) + "G";
-                else
-                    trafficstr += (result.servers[i].network_in/1024/1024/1024/1024).toFixed(1) + "T";
-				trafficstr += " | "
-				if(result.servers[i].network_out < 1024*1024*1024*1024)
-				    trafficstr += (result.servers[i].network_out/1024/1024/1024).toFixed(1) + "G";
+				if (result.servers[key].network_in < 1024 * 1024 * 1024 * 1024)
+					trafficstr += (result.servers[key].network_in / 1024 / 1024 / 1024).toFixed(1) + "G";
 				else
-					trafficstr += (result.servers[i].network_out/1024/1024/1024/1024).toFixed(1) + "T";
+					trafficstr += (result.servers[key].network_in / 1024 / 1024 / 1024 / 1024).toFixed(1) + "T";
+				trafficstr += " | "
+				if (result.servers[key].network_out < 1024 * 1024 * 1024 * 1024)
+					trafficstr += (result.servers[key].network_out / 1024 / 1024 / 1024).toFixed(1) + "G";
+				else
+					trafficstr += (result.servers[key].network_out / 1024 / 1024 / 1024 / 1024).toFixed(1) + "T";
 				TableRow.children["traffic"].innerHTML = trafficstr;
 
 				// CPU
-				if (result.servers[i].cpu >= 90)
+				if (result.servers[key].cpu >= 90)
 					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-danger";
-				else if (result.servers[i].cpu >= 80)
+				else if (result.servers[key].cpu >= 80)
 					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-warning";
 				else
 					TableRow.children["cpu"].children[0].children[0].className = "progress-bar progress-bar-success";
-				TableRow.children["cpu"].children[0].children[0].style.width = result.servers[i].cpu + "%";
-				TableRow.children["cpu"].children[0].children[0].innerHTML = result.servers[i].cpu + "%";
+				TableRow.children["cpu"].children[0].children[0].style.width = result.servers[key].cpu + "%";
+				TableRow.children["cpu"].children[0].children[0].innerHTML = result.servers[key].cpu + "%";
 
 				// Memory
-				var Mem = ((result.servers[i].memory_used/result.servers[i].memory_total)*100.0).toFixed(0);
+				var Mem = ((result.servers[key].memory_used / result.servers[key].memory_total) * 100.0).toFixed(0);
 				if (Mem >= 90)
 					TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-danger";
 				else if (Mem >= 80)
@@ -223,12 +223,12 @@ function uptime() {
 					TableRow.children["memory"].children[0].children[0].className = "progress-bar progress-bar-success";
 				TableRow.children["memory"].children[0].children[0].style.width = Mem + "%";
 				TableRow.children["memory"].children[0].children[0].innerHTML = Mem + "%";
-				ExpandRow[0].children["expand_mem"].innerHTML = "内存: " + bytesToSize(result.servers[i].memory_used*1024, 2) + " / " + bytesToSize(result.servers[i].memory_total*1024, 2);
+				ExpandRow[0].children["expand_mem"].innerHTML = "内存: " + bytesToSize(result.servers[key].memory_used * 1024, 2) + " / " + bytesToSize(result.servers[key].memory_total * 1024, 2);
 				// Swap
-				ExpandRow[0].children["expand_swap"].innerHTML = "交换分区: " + bytesToSize(result.servers[i].swap_used*1024, 2) + " / " + bytesToSize(result.servers[i].swap_total*1024, 2);
+				ExpandRow[0].children["expand_swap"].innerHTML = "交换分区: " + bytesToSize(result.servers[key].swap_used * 1024, 2) + " / " + bytesToSize(result.servers[key].swap_total * 1024, 2);
 
 				// HDD
-				var HDD = ((result.servers[i].hdd_used/result.servers[i].hdd_total)*100.0).toFixed(0);
+				var HDD = ((result.servers[key].hdd_used / result.servers[key].hdd_total) * 100.0).toFixed(0);
 				if (HDD >= 90)
 					TableRow.children["hdd"].children[0].children[0].className = "progress-bar progress-bar-danger";
 				else if (HDD >= 80)
@@ -240,48 +240,49 @@ function uptime() {
 				// IO Speed for HDD.
 				// IO, 过小的B字节单位没有意义
 				var io = "";
-				if(result.servers[i].io_read < 1024*1024)
-					io += parseInt(result.servers[i].io_read/1024) + "K";
+				if (result.servers[key].io_read < 1024 * 1024)
+					io += parseInt(result.servers[key].io_read / 1024) + "K";
 				else
-					io += parseInt(result.servers[i].io_read/1024/1024) + "M";
+					io += parseInt(result.servers[key].io_read / 1024 / 1024) + "M";
 				io += " / "
-				if(result.servers[i].io_write < 1024*1024)
-					io += parseInt(result.servers[i].io_write/1024) + "K";
+				if (result.servers[key].io_write < 1024 * 1024)
+					io += parseInt(result.servers[key].io_write / 1024) + "K";
 				else
-					io += parseInt(result.servers[i].io_write/1024/1024) + "M";
+					io += parseInt(result.servers[key].io_write / 1024 / 1024) + "M";
 				// Expand for HDD.
-				ExpandRow[0].children["expand_hdd"].innerHTML = "硬盘|读写: " + bytesToSize(result.servers[i].hdd_used*1024*1024, 2) + " / " + bytesToSize(result.servers[i].hdd_total*1024*1024, 2) + " | " + io;
+				ExpandRow[0].children["expand_hdd"].innerHTML = "硬盘|读写: " + bytesToSize(result.servers[key].hdd_used * 1024 * 1024, 2) + " / " + bytesToSize(result.servers[key].hdd_total * 1024 * 1024, 2) + " | " + io;
 
-                // delay time
+				// delay time
 
 				// tcp, udp, process, thread count
-				ExpandRow[0].children["expand_tupd"].innerHTML = "TCP/UDP/进/线: " + result.servers[i].tcp_count + " / " + result.servers[i].udp_count + " / " + result.servers[i].process_count+ " / " + result.servers[i].thread_count;
-				ExpandRow[0].children["expand_ping"].innerHTML = "联通/电信/移动: " + result.servers[i].time_10010 + "ms / " + result.servers[i].time_189 + "ms / " + result.servers[i].time_10086 + "ms"
+				ExpandRow[0].children["expand_tupd"].innerHTML = "TCP/UDP/进/线: " + result.servers[key].tcp_count + " / " + result.servers[key].udp_count + " / " + result.servers[key].process_count + " / " + result.servers[key].thread_count;
+				ExpandRow[0].children["expand_ping"].innerHTML = "联通/电信/移动: " + result.servers[key].time_10010 + "ms / " + result.servers[key].time_189 + "ms / " + result.servers[key].time_10086 + "ms"
 
-                // ping
-                var PING_10010 = result.servers[i].ping_10010.toFixed(0);
-                var PING_189 = result.servers[i].ping_189.toFixed(0);
-                var PING_10086 = result.servers[i].ping_10086.toFixed(0);
-                if (PING_10010 >= 20 || PING_189 >= 20 || PING_10086 >= 20)
-                    TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-warning";
-                else
-                    TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-success";
-	            TableRow.children["ping"].children[0].children[0].innerHTML = PING_10010 + "%💻" + PING_189 + "%💻" + PING_10086 + "%";
+				// ping
+				var PING_10010 = result.servers[key].ping_10010.toFixed(0);
+				var PING_189 = result.servers[key].ping_189.toFixed(0);
+				var PING_10086 = result.servers[key].ping_10086.toFixed(0);
+				if (PING_10010 >= 70 || PING_189 >= 70 || PING_10086 >= 70)
+					TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-warning";
+				else
+					TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-success";
+				TableRow.children["ping"].children[0].children[0].innerHTML = PING_10010 + "-" + PING_189 + "-" + PING_10086 + "";
 
 				// Custom
-				if (result.servers[i].custom) {
-					ExpandRow[0].children["expand_custom"].innerHTML = result.servers[i].custom
+				if (result.servers[key].custom) {
+					ExpandRow[0].children["expand_custom"].innerHTML = result.servers[key].custom
 				} else {
 					ExpandRow[0].children["expand_custom"].innerHTML = ""
 				}
 			}
+			i++;
 		};
 
-		d = new Date(result.updated*1000);
+		d = new Date(result.updated * 1000);
 		error = 0;
-	}).fail(function(update_error) {
+	}).fail(function (update_error) {
 		if (!error) {
-			$("#servers > tr.accordion-toggle").each(function(i) {
+			$("#servers > tr.accordion-toggle").each(function (i) {
 				var TableRow = $("#servers tr#r" + i)[0];
 				var ExpandRow = $("#servers #rt" + i);
 				TableRow.children["online_status"].children[0].children[0].className = "progress-bar progress-bar-error";
@@ -308,7 +309,7 @@ function uptime() {
 				TableRow.children["ping"].children[0].children[0].className = "progress-bar progress-bar-error";
 				TableRow.children["ping"].children[0].children[0].style.width = "100%";
 				TableRow.children["ping"].children[0].children[0].innerHTML = "<small>错误</small>";
-				if(ExpandRow.hasClass("in")) {
+				if (ExpandRow.hasClass("in")) {
 					ExpandRow.collapse("hide");
 				}
 				TableRow.setAttribute("data-target", "");
@@ -332,65 +333,65 @@ setInterval(updateTime, 2000);
 
 
 // styleswitcher.js
-function setActiveStyleSheet(title, cookie=false) {
-        var i, a, main;
-        for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
-                if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
-                        a.disabled = true;
-                        if(a.getAttribute("title") == title) a.disabled = false;
-                }
-        }
-        if (true==cookie) {
-                createCookie("style", title, 365);
-        }
+function setActiveStyleSheet(title, cookie = false) {
+	var i, a, main;
+	for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
+		if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
+			a.disabled = true;
+			if (a.getAttribute("title") == title) a.disabled = false;
+		}
+	}
+	if (true == cookie) {
+		createCookie("style", title, 365);
+	}
 }
 
 function getActiveStyleSheet() {
 	var i, a;
-	for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
-		if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled)
+	for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
+		if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled)
 			return a.getAttribute("title");
 	}
 	return null;
 }
 
-function createCookie(name,value,days) {
+function createCookie(name, value, days) {
 	if (days) {
 		var date = new Date();
-		date.setTime(date.getTime()+(days*24*60*60*1000));
-		var expires = "; expires="+date.toGMTString();
+		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+		var expires = "; expires=" + date.toGMTString();
 	}
 	else expires = "";
-	document.cookie = name+"="+value+expires+"; path=/";
+	document.cookie = name + "=" + value + expires + "; path=/";
 }
 
 function readCookie(name) {
 	var nameEQ = name + "=";
 	var ca = document.cookie.split(';');
-	for(var i=0;i < ca.length;i++) {
+	for (var i = 0; i < ca.length; i++) {
 		var c = ca[i];
-		while (c.charAt(0)==' ')
-			c = c.substring(1,c.length);
+		while (c.charAt(0) == ' ')
+			c = c.substring(1, c.length);
 		if (c.indexOf(nameEQ) == 0)
-			return c.substring(nameEQ.length,c.length);
+			return c.substring(nameEQ.length, c.length);
 	}
 	return null;
 }
 
-window.onload = function(e) {
-        var cookie = readCookie("style");
-        if (cookie && cookie != 'null' ) {
-                setActiveStyleSheet(cookie);
-        } else {
-                function handleChange (mediaQueryListEvent) {
-                        if (mediaQueryListEvent.matches) {
-                                setActiveStyleSheet('dark');
-                        } else {
-                                setActiveStyleSheet('light');
-                        }
-                }
-                const mediaQueryListDark = window.matchMedia('(prefers-color-scheme: dark)');
-                setActiveStyleSheet(mediaQueryListDark.matches ? 'dark' : 'light');
-                mediaQueryListDark.addEventListener("change",handleChange);
-        }
+window.onload = function (e) {
+	var cookie = readCookie("style");
+	if (cookie && cookie != 'null') {
+		setActiveStyleSheet(cookie);
+	} else {
+		function handleChange(mediaQueryListEvent) {
+			if (mediaQueryListEvent.matches) {
+				setActiveStyleSheet('dark');
+			} else {
+				setActiveStyleSheet('light');
+			}
+		}
+		const mediaQueryListDark = window.matchMedia('(prefers-color-scheme: dark)');
+		setActiveStyleSheet(mediaQueryListDark.matches ? 'dark' : 'light');
+		mediaQueryListDark.addEventListener("change", handleChange);
+	}
 }