iostatus
Version:
197 lines (195 loc) • 26.9 kB
JavaScript
var _ = require("lodash");
var Promise = require("bluebird");
var rpj = require('request-promise-json');
function mconnection(user, password, db, serial, bool) {
return new Promise(function (resolve, reject) {
rpj.get(db + '/connection_' + serial).then(function (doc) {
doc.connected = bool;
doc.updatedAt = new Date().getTime();
rpj.put(db + '/connection_' + serial, doc).then(function (d) {
resolve(true);
}).catch(function (err) {
console.log(err);
reject(err);
});
}).catch(function (err) {
console.log(err);
if (bool == true && err.statusCode == 404) {
var doc = {
_id: 'connection_' + serial,
connected: true,
updatedAt: new Date().getTime()
};
rpj.post(db, doc).then(function (doc) {
resolve(true);
}).catch(function (err) {
reject({ error: 'wrong credentials' });
});
}
else {
console.log(err);
reject(err);
}
});
});
}
function pushtodb(user, password, db, serial, doc) {
return new Promise(function (resolve, reject) {
rpj.get(db + '/' + doc._id).then(function (d) {
doc._rev = d._rev;
rpj.put(db + '/' + doc._id, doc).then(function () {
resolve(doc);
}).catch(function (err) {
reject(err);
});
}).catch(function (err) {
if (err.statusCode == 404) {
rpj.post(db + '/', doc).then(function () {
resolve(doc);
}).catch(function (err) {
reject(err);
});
}
else {
console.log(err);
reject(err);
}
});
});
}
function exists(all, serial, sid) {
var serialexists = false;
var socketexists = false;
_.map(all, function (client) {
if (client.serial) {
serialexists = true;
_.map(client.sockets, function (s) {
if (s.id == sid) {
socketexists = true;
}
});
}
});
return { serial: serialexists, socket: socketexists };
}
module.exports = (function () {
function MaClients(db) {
this.couchdb = db;
this.all = [];
}
MaClients.prototype.add = function (user, password, db, serial, socket) {
var exist = exists(this.all, serial, socket.id);
if (!exist.serial) {
this.all.push({
serial: serial,
user: user,
password: password,
db: this.couchdb.protocol + '://' + user + ':' + password + '@' + this.couchdb.host + '/' + db,
sockets: [{ id: socket.id, socket: socket }]
});
return mconnection(user, password, this.couchdb.protocol + '://' + user + ':' + password + '@' + this.couchdb.host + '/' + db, serial, true);
}
else if (!exist.socket) {
_.map(this.all, function (client) {
if (client.serial) {
client.sockets.push({ id: socket.id, socket: socket });
}
});
console.log('new socket for ' + serial);
}
};
;
MaClients.prototype.pushdata = function (serial, type, data) {
return new Promise(function (resolve, reject) {
reject('todo');
});
};
;
MaClients.prototype.remove = function (serial, sid) {
var remaning = [];
for (var soc = 0; soc < this.all.length; soc++) {
var client = this.all[soc];
if (client.serial == serial) {
if (client.sockets.length == 1 && client.sockets[0].id == sid) {
mconnection(client.user, client.password, client.db, client.serial, false).then(function () {
console.log('switched offline');
}).catch(function (err) {
console.log('switched offline error');
console.log(err);
});
_.map(this.all, function (el) {
if (el.serial != client.serial) {
remaning.push(el);
}
});
this.all = remaning;
}
else {
console.log('todo');
}
}
}
};
;
MaClients.prototype.list = function (serial) {
var serials = [];
if (serial) {
_.map(this.all, function (client) {
if (client.serial == serial) {
serials.push(client.serial);
}
});
}
else {
_.map(this.all, function (client) {
serials.push(client.serial);
});
}
return serials;
};
;
MaClients.prototype.ios = function (serial) {
var sockets = [];
if (serial) {
_.map(this.all, function (client) {
if (client.serial == serial) {
_.map(client.sockets, function (s) {
sockets.push(s.socket);
});
}
});
}
else {
_.map(this.all, function (client) {
_.map(client.sockets, function (s) {
sockets.push(s.socket);
});
});
}
return sockets;
};
;
MaClients.prototype.sockets = function (serial) {
var ids;
if (serial) {
_.map(this.all, function (client) {
if (client.serial == serial) {
ids = _.pluck(client.sockets, "id");
}
});
return ids;
}
else {
ids = [];
_.map(this.all, function (client) {
_.map(client.sockets, function (s) {
ids.push(s.id);
});
});
return ids;
}
};
;
return MaClients;
})();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1vZHVsZXMvbWFjaENsaWVudHMudHMiXSwibmFtZXMiOlsibWNvbm5lY3Rpb24iLCJwdXNodG9kYiIsImV4aXN0cyIsImNvbnN0cnVjdG9yIiwiYWRkIiwicHVzaGRhdGEiLCJyZW1vdmUiLCJsaXN0IiwiaW9zIiwic29ja2V0cyJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBWSxDQUFDLFdBQU0sUUFBUSxDQUFDLENBQUE7QUFDNUIsSUFBWSxPQUFPLFdBQU0sVUFBVSxDQUFDLENBQUE7QUFDcEMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFMUMscUJBQXFCLElBQVksRUFBRSxRQUFnQixFQUFFLEVBQVUsRUFBRSxNQUFjLEVBQUUsSUFBYztJQUMzRkEsTUFBTUEsQ0FBQ0EsSUFBSUEsT0FBT0EsQ0FBQ0EsVUFBU0EsT0FBT0EsRUFBRUEsTUFBTUE7UUFDdkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFTLEdBQUc7WUFDbkQsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDckIsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ3BDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVMsQ0FBQztnQkFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2pCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFTLEdBQUc7Z0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNmLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVMsR0FBRztZQUNqQixPQUFPLENBQUMs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RUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDVEEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUEsVUFBU0EsTUFBTUE7Z0JBQzNCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDMUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDdkMsQ0FBQztZQUNMLENBQUMsQ0FBQ0EsQ0FBQUE7WUFDRkEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQUE7UUFDZEEsQ0FBQ0E7UUFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDSkEsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0E7WUFFVEEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUEsVUFBU0EsTUFBTUE7Z0JBQzNCLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFTLENBQUM7b0JBQzVCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUNsQixDQUFDLENBQUMsQ0FBQTtZQUNOLENBQUMsQ0FBQ0EsQ0FBQUE7WUFFRkEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQUE7UUFDZEEsQ0FBQ0E7SUFFTEEsQ0FBQ0E7O0lBS0wsZ0JBQUM7QUFBRCxDQWhLUSxBQWdLUCxHQUFBLENBQUMiLCJmaWxlIjoibW9kdWxlcy9tYWNoQ2xpZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0ICogYXMgUHJvbWlzZSBmcm9tIFwiYmx1ZWJpcmRcIjtcbmxldCBycGogPSByZXF1aXJlKCdyZXF1ZXN0LXByb21pc2UtanNvbicpO1xuXG5mdW5jdGlvbiBtY29ubmVjdGlvbih1c2VyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGRiOiBzdHJpbmcsIHNlcmlhbDogc3RyaW5nLCBib29sPzogYm9vbGVhbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcnBqLmdldChkYiArICcvY29ubmVjdGlvbl8nICsgc2VyaWFsKS50aGVuKGZ1bmN0aW9uKGRvYykge1xuICAgICAgICAgICAgZG9jLmNvbm5lY3RlZCA9IGJvb2w7XG4gICAgICAgICAgICBkb2MudXBkYXRlZEF0ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICAgIHJwai5wdXQoZGIgKyAnL2Nvbm5lY3Rpb25fJyArIHNlcmlhbCwgZG9jKS50aGVuKGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxuXG4gICAgICAgICAgICBpZiAoYm9vbCA9PSB0cnVlICYmIGVyci5zdGF0dXNDb2RlID09IDQwNCkgeyAgLy8gaWYgZG9jbm90IGV4aXQgZSBib29sIHRydWUgYmxhIGJsYSBibGFcblxuICAgICAgICAgICAgICAgIGxldCBkb2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIF9pZDogJ2Nvbm5lY3Rpb25fJyArIHNlcmlhbCxcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcnBqLnBvc3QoZGIsIGRvYykudGhlbihmdW5jdGlvbihkb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHsgZXJyb3I6ICd3cm9uZyBjcmVkZW50aWFscycgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KTtcbn1cblxuXG5mdW5jdGlvbiBwdXNodG9kYih1c2VyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGRiOiBzdHJpbmcsIHNlcmlhbDogc3RyaW5nLCBkb2M6IHsgX2lkOiBzdHJpbmcsIF9yZXY/OiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcnBqLmdldChkYiArICcvJyArIGRvYy5faWQpLnRoZW4oZnVuY3Rpb24oZCkge1xuICAgICAgICAgICAgZG9jLl9yZXYgPSBkLl9yZXZcbiAgICAgICAgICAgIHJwai5wdXQoZGIgKyAnLycgKyBkb2MuX2lkLCBkb2MpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkb2MpXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5zdGF0dXNDb2RlID09IDQwNCkge1xuICAgICAgICAgICAgICAgIHJwai5wb3N0KGRiICsgJy8nLCBkb2MpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZG9jKVxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gZXhpc3RzKGFsbDogSUNsaWVudFtdLCBzZXJpYWwsIHNpZCk6IHsgc2VyaWFsOiBib29sZWFuLCBzb2NrZXQ6IGJvb2xlYW4gfSB7XG4gICAgbGV0IHNlcmlhbGV4aXN0cyA9IGZhbHNlXG4gICAgbGV0IHNvY2tldGV4aXN0cyA9IGZhbHNlXG5cbiAgICBfLm1hcChhbGwsIGZ1bmN0aW9uKGNsaWVudCkge1xuICAgICAgICBpZiAoY2xpZW50LnNlcmlhbCkge1xuICAgICAgICAgICAgc2VyaWFsZXhpc3RzID0gdHJ1ZVxuXG4gICAgICAgICAgICBfLm1hcChjbGllbnQuc29ja2V0cywgZnVuY3Rpb24ocykge1xuICAgICAgICAgICAgICAgIGlmIChzLmlkID09IHNpZCkge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXRleGlzdHMgPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHsgc2VyaWFsOiBzZXJpYWxleGlzdHMsIHNvY2tldDogc29ja2V0ZXhpc3RzIH1cbn1cblxuXG5pbnRlcmZhY2UgSVNvY2tldEFycmF5IHtcblxuICAgIGlkOiBzdHJpbmc7XG4gICAgc29ja2V0OiBJU29ja2V0XG59XG5cbmludGVyZmFjZSBJU29ja2V0IHtcbiAgICAgICAgICAgICAgICBvbjpGdW5jdGlvbjtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZW1pdDpGdW5jdGlvbjtcbiAgICBkZWNvZGVkX3Rva2VuOntcbiAgICAgICAgZGI6c3RyaW5nO1xuICAgICAgICB1c2VyOnN0cmluZztcbiAgICAgICAgcGFzc3dvcmQ6c3RyaW5nO1xuICAgICAgICBzZXJpYWw6c3RyaW5nO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIElDbGllbnQge1xuICAgIHNlcmlhbDogc3RyaW5nO1xuICAgIHNvY2tldHM6IElTb2NrZXRBcnJheVtdO1xuICAgIHVzZXI6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIGRiOiBzdHJpbmc7XG59XG5cblxuaW50ZXJmYWNlIElDb3VjaGRiIHtcbiAgICBwcm90b2NvbDogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgICBob3N0OiBzdHJpbmc7XG59XG5cblxuZXhwb3J0ID1jbGFzcyBNYUNsaWVudHMge1xuICAgIGFsbDogSUNsaWVudFtdO1xuICAgIGNvdWNoZGI6IElDb3VjaGRiO1xuXG4gICAgY29uc3RydWN0b3IoZGI6IElDb3VjaGRiKSB7XG4gICAgICAgIHRoaXMuY291Y2hkYiA9IGRiXG4gICAgICAgIHRoaXMuYWxsPSBbXTtcbiAgICB9XG5cbiAgICBhZGQodXNlcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBkYjogc3RyaW5nLCBzZXJpYWw6IHN0cmluZywgc29ja2V0OiBJU29ja2V0KSB7XG5cbiAgICAgICAgbGV0IGV4aXN0ID0gZXhpc3RzKHRoaXMuYWxsLCBzZXJpYWwsIHNvY2tldC5pZClcbiAgICAgICAgaWYgKCFleGlzdC5zZXJpYWwpIHtcblxuICAgICAgICAgICAgdGhpcy5hbGwucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VyaWFsOiBzZXJpYWwsXG4gICAgICAgICAgICAgICAgdXNlcjogdXNlcixcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgZGI6IHRoaXMuY291Y2hkYi5wcm90b2NvbCArICc6Ly8nICsgdXNlciArICc6JyArIHBhc3N3b3JkICsgJ0AnICsgdGhpcy5jb3VjaGRiLmhvc3QgKyAnLycgKyBkYixcbiAgICAgICAgICAgICAgICBzb2NrZXRzOiBbeyBpZDogc29ja2V0LmlkLCBzb2NrZXQ6IHNvY2tldCB9XVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmV0dXJuIG1jb25uZWN0aW9uKHVzZXIsIHBhc3N3b3JkLCB0aGlzLmNvdWNoZGIucHJvdG9jb2wgKyAnOi8vJyArIHVzZXIgKyAnOicgKyBwYXNzd29yZCArICdAJyArIHRoaXMuY291Y2hkYi5ob3N0ICsgJy8nICsgZGIsIHNlcmlhbCwgdHJ1ZSlcblxuICAgICAgICB9IGVsc2UgaWYgKCFleGlzdC5zb2NrZXQpIHtcbiAgICAgICAgICAgIF8ubWFwKHRoaXMuYWxsLCBmdW5jdGlvbihjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnNlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGllbnQuc29ja2V0cy5wdXNoKHsgaWQ6IHNvY2tldC5pZCwgc29ja2V0OiBzb2NrZXQgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ25ldyBzb2NrZXQgZm9yICcgKyBzZXJpYWwpXG4gICAgICAgIH1cblxuXG4gICAgfTtcbiAgICBwdXNoZGF0YShzZXJpYWw6c3RyaW5nLHR5cGU6c3RyaW5nLGRhdGE6YW55KSB7XG4gICAgXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBcbiAgICAgICAgcmVqZWN0KCd0b2RvJylcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgfSkgXG4gICAgICAgIFxuICAgICAgICBcbn07XG4gICAgcmVtb3ZlKHNlcmlhbDogc3RyaW5nLCBzaWQ6IHN0cmluZykge1xuXG4gICAgICAgIGxldCByZW1hbmluZzogSUNsaWVudFtdPVtdO1xuXG4gICAgICAgIGZvciAobGV0IHNvYyA9IDA7IHNvYyA8IHRoaXMuYWxsLmxlbmd0aDsgc29jKyspIHtcblxuICAgICAgICAgICAgdmFyIGNsaWVudCA9IHRoaXMuYWxsW3NvY107XG5cblxuXG4gICAgICAgICAgICBpZiAoY2xpZW50LnNlcmlhbCA9PSBzZXJpYWwpIHtcblxuICAgICAgICAgICAgICAgIGlmIChjbGllbnQuc29ja2V0cy5sZW5ndGggPT0gMSAmJiBjbGllbnQuc29ja2V0c1swXS5pZCA9PSBzaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWNvbm5lY3Rpb24oY2xpZW50LnVzZXIsIGNsaWVudC5wYXNzd29yZCwgY2xpZW50LmRiLCBjbGllbnQuc2VyaWFsLCBmYWxzZSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzd2l0Y2hlZCBvZmZsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3dpdGNoZWQgb2ZmbGluZSBlcnJvcicpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgXy5tYXAodGhpcy5hbGwsIGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwuc2VyaWFsICE9IGNsaWVudC5zZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1hbmluZy5wdXNoKGVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsID0gcmVtYW5pbmc7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndG9kbycpXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuYWxsPV8ucmVqZWN0KHRoaXMuYWxsLCBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgIHJldHVybiBlbC5zZXJpYWwgPT09IGNsaWVudC5zZXJpYWw7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pXG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbGlzdChzZXJpYWw/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBzZXJpYWxzOiBzdHJpbmdbXT1bXTtcbiAgICAgICAgaWYgKHNlcmlhbCkge1xuXG4gICAgICAgICAgICBfLm1hcCh0aGlzLmFsbCwgZnVuY3Rpb24oY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5zZXJpYWwgPT0gc2VyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbHMucHVzaChjbGllbnQuc2VyaWFsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgXy5tYXAodGhpcy5hbGwsIGZ1bmN0aW9uKGNsaWVudCkge1xuICAgICAgICAgICAgICAgIHNlcmlhbHMucHVzaChjbGllbnQuc2VyaWFsKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlcmlhbHNcblxuICAgIH07XG4gICAgaW9zKHNlcmlhbD86IHN0cmluZyk6IElTb2NrZXRbXSB7XG4gICAgICAgIGxldCBzb2NrZXRzOiBJU29ja2V0W109W107XG5cbiAgICAgICAgaWYgKHNlcmlhbCkge1xuICAgICAgICAgICAgXy5tYXAodGhpcy5hbGwsIGZ1bmN0aW9uKGNsaWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjbGllbnQuc2VyaWFsID09IHNlcmlhbCkge1xuXG4gICAgICAgICAgICAgICAgICAgIF8ubWFwKGNsaWVudC5zb2NrZXRzLCBmdW5jdGlvbihzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRzLnB1c2gocy5zb2NrZXQpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9IGVsc2Uge1xuXG5cbiAgICAgICAgICAgIF8ubWFwKHRoaXMuYWxsLCBmdW5jdGlvbihjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBfLm1hcChjbGllbnQuc29ja2V0cywgZnVuY3Rpb24ocykge1xuXG4gICAgICAgICAgICAgICAgICAgIHNvY2tldHMucHVzaChzLnNvY2tldClcblxuXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXRzXG4gICAgfTtcbiAgICBzb2NrZXRzKHNlcmlhbD86IHN0cmluZykge1xuICAgICAgICBsZXQgaWRzO1xuICAgICAgICBpZiAoc2VyaWFsKSB7XG4gICAgICAgICAgICBfLm1hcCh0aGlzLmFsbCwgZnVuY3Rpb24oY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5zZXJpYWwgPT0gc2VyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkcyA9IF8ucGx1Y2soY2xpZW50LnNvY2tldHMsIFwiaWRcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIGlkc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRzID0gW107XG5cbiAgICAgICAgICAgIF8ubWFwKHRoaXMuYWxsLCBmdW5jdGlvbihjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBfLm1hcChjbGllbnQuc29ja2V0cywgZnVuY3Rpb24ocykge1xuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChzLmlkKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gaWRzXG4gICAgICAgIH1cblxuICAgIH07XG4gICAgXG4gICAgXG4gICAgXG4gICAgXG59O1xuIl0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9