From 2f439ac7168c7b9e4b5d78cba81254375ea4b456 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Fri, 9 Aug 2019 18:20:40 -0700 Subject: [PATCH] 1. Added comments to agentcore.c 2. Updated user-sessions to use getent passwd instead of /etc/passwd 3. Added user-sessions.getHomeFolder() for linux 4. Added gnome helper to fetch proxy settings from gnome --- meshcore/agentcore.c | 14 ++++++++--- microscript/ILibDuktape_Polyfills.c | 15 ++++++------ modules/linux-gnome-helpers.js | 38 +++++++++++++++++++++++++++++ modules/user-sessions.js | 26 +++++++++++++++++--- 4 files changed, 78 insertions(+), 15 deletions(-) create mode 100644 modules/linux-gnome-helpers.js diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 7ee114c..830754d 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -379,6 +379,7 @@ int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *buffer, size_t #ifdef _POSIX #ifndef __APPLE__ + // Linux and FreeBSD for (char **env = environ; *env; ++env) { int envLen = (int)strnlen_s(*env, INT_MAX); @@ -409,7 +410,8 @@ int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *buffer, size_t if (retVal == 0) { // Check /etc/environment just in case it wasn't exported -#ifdef _FREEBSD + #ifdef _FREEBSD + // FreeBSD Only char getProxy[] = "(function getProxies(){\ var child = require('child_process').execFile('/bin/sh', ['sh']);\ child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });\ @@ -417,7 +419,8 @@ int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *buffer, size_t child.waitExit();\ return(child.stdout.str.trim().split('\\n')[0].split('//')[1]);\ })();"; -#else + #else + // Linux Only char getProxy[] = "(function getProxies(){\ if(require('fs').existsSync('/etc/environment'))\ {\ @@ -443,7 +446,8 @@ int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *buffer, size_t }\ throw('No Proxy set');\ })();"; -#endif + #endif + // Linux and FreeBSD if (duk_peval_string(agent->meshCoreCtx, getProxy) == 0) { duk_size_t proxyLen; @@ -454,7 +458,8 @@ int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *buffer, size_t duk_pop(agent->meshCoreCtx); } return(retVal); - #else +#else + // MacOS Only char getProxyies[] = "(function getProxies(){\ var ret = {};\ var child = require('child_process').execFile('/bin/sh', ['sh']);\ @@ -520,6 +525,7 @@ int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *buffer, size_t } #endif #else + // Windows Only char getProxy[] = "(function () {\ var isroot = false;\ var servers = [];\ diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 1109f78..eacfd0c 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1959,6 +1959,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('process-manager', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgp2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKCi8vIFVzZWQgb24gV2luZG93cyBhbmQgTGludXggdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHJ1bm5pbmcgcHJvY2Vzc2VzCmZ1bmN0aW9uIHByb2Nlc3NNYW5hZ2VyKCkgewogICAgdGhpcy5fT2JqZWN0SUQgPSAncHJvY2Vzcy1tYW5hZ2VyJzsgLy8gVXNlZCBmb3IgZGVidWdnaW5nLCBhbGxvd3MgeW91IHRvIGdldCB0aGUgb2JqZWN0IHR5cGUgYXQgcnVudGltZS4KICAgIAogICAgLy8gU2V0dXAgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGNhbGxzLgogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgewogICAgICAgIGNhc2UgJ3dpbjMyJzoKICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2V0TGFzdEVycm9yJyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnQ3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90Jyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2VzczMyRmlyc3RXJyk7CiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2VzczMyTmV4dFcnKTsKICAgICAgICAgICAgYnJlYWs7CgljYXNlICdmcmVlYnNkJzoKICAgICAgICBjYXNlICdsaW51eCc6CiAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgdGhpcy5fY2hpbGRQcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyAocHJvY2Vzcy5wbGF0Zm9ybSArICcgbm90IHN1cHBvcnRlZCcpOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHRoaXMuZW51bWVyYXRlUHJvY2Vzc2VzID0gZnVuY3Rpb24gZW51bWVyYXRlUHJvY2Vzc2VzKCkKICAgIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgICAgICByZXQuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhwcykKICAgICAgICB7DQogICAgICAgICAgICBjYWxsYmFjay5wcm9tLl9yZXMocHMpOw0KICAgICAgICB9CiAgICAgICAgcmV0LmNhbGxiYWNrLnByb20gPSByZXQ7CiAgICAgICAgdGhpcy5nZXRQcm9jZXNzZXMocmV0LmNhbGxiYWNrKTsKICAgICAgICByZXR1cm4gKHJldCk7CiAgICB9CiAgICAvLyBSZXR1cm4gYSBvYmplY3Qgb2Y6IHBpZCAtPiBwcm9jZXNzIGluZm9ybWF0aW9uLgogICAgdGhpcy5nZXRQcm9jZXNzZXMgPSBmdW5jdGlvbiBnZXRQcm9jZXNzZXMoY2FsbGJhY2spCiAgICB7CiAgICAgICAgc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pCiAgICAgICAgewogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgKCdFbnVtZXJhdGluZyBwcm9jZXNzZXMgb24gJyArIHByb2Nlc3MucGxhdGZvcm0gKyAnIG5vdCBzdXBwb3J0ZWQnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd3aW4zMic6IC8vIFdpbmRvd3MgcHJvY2Vzc2VzCiAgICAgICAgICAgICAgICB2YXIgcmV0VmFsID0ge307CiAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXMuX2tlcm5lbDMyLkNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCgyLCAwKTsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0gR00uQ3JlYXRlVmFyaWFibGUoR00uUG9pbnRlclNpemU9PTggPyA1NjggOiA1NTYpOwogICAgICAgICAgICAgICAgaW5mby50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoaW5mby5fc2l6ZSwgMCk7CiAgICAgICAgICAgICAgICB2YXIgbmV4dFByb2Nlc3MgPSB0aGlzLl9rZXJuZWwzMi5Qcm9jZXNzMzJGaXJzdFcoaCwgaW5mbyk7CiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dFByb2Nlc3MuVmFsKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5EZXJlZig4LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgwKSA9PSAxNjkxMikgeyBfZGVidWcoKTsgfQogICAgICAgICAgICAgICAgICAgIHJldFZhbFtpbmZvLkRlcmVmKDgsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApXSA9IHsgcGlkOiBpbmZvLkRlcmVmKDgsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKDApLCBjbWQ6IGluZm8uRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDM2IDogNDQsIDI2MCkuV2lkZTJVVEY4IH07CiAgICAgICAgICAgICAgICAgICAgbmV4dFByb2Nlc3MgPSB0aGlzLl9rZXJuZWwzMi5Qcm9jZXNzMzJOZXh0VyhoLCBpbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5hcHBseSh0aGlzLCBbcmV0VmFsXSk7IH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdsaW51eCc6IC8vIExpbnV4IHByb2Nlc3NlcwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9wc3ApIHsgdGhpcy5fcHNwID0ge307IH0KICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy5fY2hpbGRQcm9jZXNzLmV4ZWNGaWxlKCIvYmluL3BzIiwgWyJwcyIsICItdXhhIl0sIHsgdHlwZTogdGhpcy5fY2hpbGRQcm9jZXNzLlNwYXduVHlwZXMuVEVSTSB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX3BzcFtwLnBpZF0gPSBwOwogICAgICAgICAgICAgICAgcC5QYXJlbnQgPSB0aGlzOwogICAgICAgICAgICAgICAgcC5wcyA9ICcnOwogICAgICAgICAgICAgICAgcC5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgcC5hcmdzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeyBwLmFyZ3MucHVzaChhcmd1bWVudHNbaV0pOyB9CiAgICAgICAgICAgICAgICBwLm9uKCdleGl0JywgZnVuY3Rpb24gb25HZXRQcm9jZXNzZXMoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLlBhcmVudC5fcHNwW3RoaXMucGlkXTsgCiAgICAgICAgICAgICAgICAgICAgdmFyIHJldFZhbCA9IHt9LCBsaW5lcyA9IHRoaXMucHMuc3BsaXQoJ1x4MERceDBBJyksIGtleSA9IHt9LCBrZXlpID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGxpbmVzKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbkxpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciB4IGluIHRva2VucykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiB0b2tlbnNbeF0pIHsga2V5W3Rva2Vuc1t4XV0gPSBrZXlpKys7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiB0b2tlbnNbeF0pIHsgdG9rZW5MaXN0LnB1c2godG9rZW5zW3hdKTt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5MaXN0W2tleS5QSURdKSB7IHJldFZhbFt0b2tlbkxpc3Rba2V5LlBJRF1dID0geyBwaWQ6IGtleS5QSUQsIHVzZXI6IHRva2VuTGlzdFtrZXkuVVNFUl0sIGNtZDogdG9rZW5MaXN0W2tleS5DT01NQU5EXSB9OyB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFyZ3MudW5zaGlmdChyZXRWYWwpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrLmFwcGx5KHRoaXMucGFyZW50LCB0aGlzLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5wYXJlbnQucHMgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoKICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwogICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOwogICAgICAgICAgICAgICAgcC5wbSA9IHRoaXM7CiAgICAgICAgICAgICAgICBwLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBwLmFyZ3MgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7IHAuYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7IH0KICAgICAgICAgICAgICAgIHAuY2hpbGQgPSB0aGlzLl9jaGlsZFByb2Nlc3MuZXhlY0ZpbGUoIi9iaW4vcHMiLCBbInBzIiwgIi14YSJdKTsKICAgICAgICAgICAgICAgIHAuY2hpbGQucHJvbWlzZSA9IHA7CiAgICAgICAgICAgICAgICBwLmNoaWxkLnN0ZG91dC5wcyA9ICcnOwogICAgICAgICAgICAgICAgcC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5wcyArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIHAuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IHRoaXMuc3Rkb3V0LnBzLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgICAgIHZhciBwaWRYID0gbGluZXNbMF0uc3BsaXQoJ1BJRCcpWzBdLmxlbmd0aCArIDM7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNtZFggPSBsaW5lc1swXS5zcGxpdCgnQ01EJylbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVzW2ldLmxlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFtsaW5lc1tpXS5zdWJzdHJpbmcoMCwgcGlkWCkudHJpbSgpXSA9IHsgcGlkOiBsaW5lc1tpXS5zdWJzdHJpbmcoMCwgcGlkWCkudHJpbSgpLCBjbWQ6IGxpbmVzW2ldLnN1YnN0cmluZyhjbWRYKSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fcmVzKHJldCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHAudGhlbihmdW5jdGlvbiAocHMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmdzLnVuc2hpZnQocHMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2suYXBwbHkodGhpcy5wbSwgdGhpcy5hcmdzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgkgICAgY2FzZSAnZnJlZWJzZCc6CiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwoJCWNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7dGhpcy5zdHIgKz0gYy50b1N0cmluZygpO30pOwoJCWNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHMgLXhhIHwgYXdrICd7IHByaW50ZiBcIiVzXCIsICQxOyAkMT1cIlwiOyAkMj1cIlwiOyAkMz1cIlwiOyAkND1cIlwiOyBwcmludGYgXCIlc1xcblwiLCAkMDsgfScgfCBhd2sgJ3sgcHJpbnRmIFwiJXNcIiwgJDE7ICQxPVwiXCI7IHByaW50ZiBcIiVzXFxuXCIsICQwOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoJCQoJCXZhciB0bXA7CgkJdmFyIHJldCA9IFtdOwoJCXZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCdcbicpOwoJCWZvcih2YXIgaSBpbiBsaW5lcykKCQl7CgkJCXRtcCA9IHtwaWQ6IGxpbmVzW2ldLnNwbGl0KCcgJykuc2hpZnQoKX07CgkJCXRtcFsnY21kJ10gPSBsaW5lc1tpXS5zdWJzdHJpbmcodG1wLnBpZC5sZW5ndGggKyAxKTsKCQkJdG1wWydwaWQnXSA9IHBhcnNlSW50KHRtcFsncGlkJ10pOwoJCQlpZighaXNOYU4odG1wWydwaWQnXSkpCgkJCXsKCQkJCXJldC5wdXNoKHRtcCk7CgkJCX0KCQl9CgkJaWYoY2FsbGJhY2spIHsgY2FsbGJhY2suYXBwbHkodGhpcywgW3JldF0pOyB9CgkJYnJlYWs7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIG9uIExpbnV4CiAgICB0aGlzLmdldFByb2Nlc3NJbmZvID0gZnVuY3Rpb24gZ2V0UHJvY2Vzc0luZm8ocGlkKQogICAgewogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQogICAgICAgIHsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93ICgnZ2V0UHJvY2Vzc0luZm8oKSBub3Qgc3VwcG9ydGVkIGZvciAnICsgcHJvY2Vzcy5wbGF0Zm9ybSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbGludXgnOgogICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgcGlkICsgJy9zdGF0dXMnKTsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0ge307CiAgICAgICAgICAgICAgICB2YXIgbGluZXMgPSBzdGF0dXMudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiBsaW5lcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHsgdG9rZW5zWzFdID0gdG9rZW5zWzFdLnRyaW0oKTsgfQogICAgICAgICAgICAgICAgICAgIGluZm9bdG9rZW5zWzBdXSA9IHRva2Vuc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAoaW5mbyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IG5ldyBwcm9jZXNzTWFuYWdlcigpOwo=', 'base64').toString());"); #if defined(_POSIX) && !defined(__APPLE__) && !defined(_FREEBSD) duk_peval_string_noresult(ctx, "addModule('linux-dbus', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnRyeSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICJwZWVrIiwgeyB2YWx1ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHRoaXMubGVuZ3RoID4gMCA/IHRoaXNbdGhpcy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZCk7IH0gfSk7IH0gY2F0Y2ggKGUpIHsgfQoKCgpmdW5jdGlvbiBkYnVzKGFkZHJlc3MsIHVpZCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAnbGludXgtZGJ1cyc7CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnc2lnbmFsJyk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgInVpZCIsIHsgdmFsdWU6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCIvYmluL3NoIiwgWyJzaCJdLCB7IHR5cGU6IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlRFUk0sIHVpZDogdWlkID09IG51bGwgPyAtMSA6IHVpZCB9KTsKICAgIHRoaXMuX2NoaWxkLnN0ZGluLndyaXRlKCdkYnVzLW1vbml0b3IgLS1zZXNzaW9uICJ0eXBlPVwnc2lnbmFsXCcsIGludGVyZmFjZT1cJycgKyBhZGRyZXNzICsgJ1wnIiB8ICggd2hpbGUgcmVhZCBYOyBkbyBlY2hvICIkWCI7IGRvbmUgKVxuJyk7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQuZGJ1cyA9IHRoaXM7CiAgICB0aGlzLl9jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspCiAgICB7CiAgICAgICAgLy8gUGFyc2UgREJVUyBEYXRhCiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KSB7IHRoaXMucmVhZHkgPSB0cnVlOyByZXR1cm47IH0KCiAgICAgICAgdmFyIGxpbmVzID0gW107CiAgICAgICAgdmFyIHRva2VucyA9IGNodW5rLnRvU3RyaW5nKCkuc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHZhciBpIGluIHRva2VucykKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0b2tlbnNbaV0gPT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIEVuZCBvZiByZWNvcmQKICAgICAgICAgICAgICAgIHRoaXMuZGJ1cy5wcmVQYXJzZVJlY29yZHMobGluZXMpOwogICAgICAgICAgICAgICAgbGluZXMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxpbmVzLnB1c2godG9rZW5zW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgdGhpcy5wcmVQYXJzZVJlY29yZHMgPSBmdW5jdGlvbiAobGluZXMpCiAgICB7CiAgICAgICAgdmFyIHJlY29yZCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgaW4gbGluZXMpCiAgICAgICAgewogICAgICAgICAgICBpZihsaW5lc1tpXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKHJlY29yZC5sZW5ndGg+MCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVjb3JkID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVjb3JkLnB1c2gobGluZXNbaV0pOwogICAgICAgIH0KICAgICAgICBpZiAocmVjb3JkLmxlbmd0aCA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcnNlUmVjb3JkcyhyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMucGFyc2VSZWNvcmRzID0gZnVuY3Rpb24gKGxpbmVzKQogICAgewogICAgICAgIGlmIChsaW5lc1swXS5zdGFydHNXaXRoKCdzaWduYWwgJykpCiAgICAgICAgewogICAgICAgICAgICB2YXIgc2lnbmFsID0ge307CiAgICAgICAgICAgIHZhciBzaWd0b2tlbnMgPSBsaW5lc1swXS5zcGxpdCgnICcpOwogICAgICAgICAgICBzaWd0b2tlbnMuc2hpZnQoKTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc2lndG9rZW5zKSB7CiAgICAgICAgICAgICAgICB2YXIgc2lnaXRlbXMgPSBzaWd0b2tlbnNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgIGlmIChzaWdpdGVtcy5sZW5ndGggPT0gMikgewogICAgICAgICAgICAgICAgICAgIHNpZ25hbFtzaWdpdGVtc1swXV0gPSBzaWdpdGVtc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGluZXMuc2hpZnQoKTsKICAgICAgICAgICAgc2lnbmFsLmRhdGEgPSBsaW5lczsKCiAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwoc2lnbmFsKTsKICAgICAgICB9CiAgICB9CiAgICB0aGlzLnBhcnNlU2lnbmFsID0gZnVuY3Rpb24oc2lnbmFsKQogICAgewogICAgICAgIHZhciBkYXRhID0gc2lnbmFsLmRhdGE7CiAgICAgICAgc2lnbmFsLmRhdGEgPSBbXTsKCiAgICAgICAgZm9yKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkYXRhW2ldLnN0YXJ0c1dpdGgoJ2FycmF5ICcpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzaWduYWwuZGF0YS5wdXNoKFtdKTsKICAgICAgICAgICAgICAgIGZvcihpPWkrMTsgaTxkYXRhLmxlbmd0aDsgKytpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VTaWduYWwyKGRhdGFbaV0sIHNpZ25hbC5kYXRhLnBlZWsoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU2lnbmFsMihkYXRhW2ldLCBzaWduYWwuZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuZW1pdCgnc2lnbmFsJywgc2lnbmFsKTsKICAgIH0KICAgIHRoaXMucGFyc2VTaWduYWwyID0gZnVuY3Rpb24gKGlucHV0U3RyLCBvdXRBcnJheSkKICAgIHsKICAgICAgICBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdzdHJpbmcgJykpCiAgICAgICAgewogICAgICAgICAgICBvdXRBcnJheS5wdXNoKEpTT04ucGFyc2UoaW5wdXRTdHIuc2xpY2UoNykpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihpbnB1dFN0ci5zdGFydHNXaXRoKCdib29sZWFuICcpKQogICAgICAgIHsKICAgICAgICAgICAgb3V0QXJyYXkucHVzaChKU09OLnBhcnNlKGlucHV0U3RyLnNsaWNlKDgpKSk7CiAgICAgICAgfQogICAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IGRidXM7Cv==', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('linux-gnome-helpers', Buffer.from('DQoNCmZ1bmN0aW9uIGdub21lX2dldFByb3h5U2V0dGluZ3ModWlkKQ0Kew0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSwgeyBlbnY6IHsgSE9NRTogcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldEhvbWVGb2xkZXIodWlkKSB9fSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQoNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZ3NldHRpbmdzIGxpc3QtcmVjdXJzaXZlbHkgb3JnLmdub21lLnN5c3RlbS5wcm94eSB8IHRyICJcXG4iICJcXHwiIHwgdHIgIlxcXCciICJcXGAiIHwgYXdrIFwneyBjb3VudD1zcGxpdCgkMCwgcmVzLCAifCIpOycpDQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2ZvcihhPTA7YTxjb3VudDsrK2EpJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3snKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3BsaXQocmVzW2FdLCBtb2RlY2hlY2ssICIgIik7Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lmKG1vZGVjaGVja1syXSA9PSAibW9kZSIpJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3snKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnc3BsaXQobW9kZWNoZWNrWzNdLCBwcngsICJgIik7IG1vZGUgPSBwcnhbMl07Jyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ30nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaWYobW9kZWNoZWNrWzFdPT0ib3JnLmdub21lLnN5c3RlbS5wcm94eS5odHRwIiAmJiBtb2RlY2hlY2tbMl09PSJob3N0IikgeyBzcGxpdChtb2RlY2hlY2tbM10sIGhzdCwgImAiKTsgaG9zdCA9IGhzdFsyXTsgfScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpZihtb2RlY2hlY2tbMV09PSJvcmcuZ25vbWUuc3lzdGVtLnByb3h5Lmh0dHAiICYmIG1vZGVjaGVja1syXT09InBvcnQiKSB7IHBvcnQgPSBtb2RlY2hlY2tbM107IH0nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnfScpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdwcmludGYgIntcXCJtb2RlXFwiOiBcXCIlc1xcIiwgXFwiaG9zdFxcIjogXFwiJXNcXCIsIFxcInBvcnRcXCI6ICVzfSIsIG1vZGUsIGhvc3QsIHBvcnQ7IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICANCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJldHVybiAoSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOw0KICAgIH0NCiAgICBjYXRjaChlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICh7fSk7DQogICAgfQ0KfQ0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBnZXRQcm94eVNldHRpbmdzOiBnbm9tZV9nZXRQcm94eVNldHRpbmdzIH0NCiAgICAgICAgYnJlYWs7DQp9', 'base64').toString());"); #endif char *_servicemanager = ILibMemory_Allocate(236775, 0, NULL, NULL); memcpy_s(_servicemanager + 0, 135300, "LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7DQoNCg0KZnVuY3Rpb24gZXh0cmFjdEZpbGVOYW1lKGZpbGVQYXRoKQ0Kew0KICAgIGlmICh0eXBlb2YgKGZpbGVQYXRoKSA9PSAnc3RyaW5nJykNCiAgICB7DQogICAgICAgIHZhciB0b2tlbnMgPSBmaWxlUGF0aC5zcGxpdCgnXFwnKS5qb2luKCcvJykuc3BsaXQoJy8nKTsNCiAgICAgICAgdmFyIG5hbWU7DQoNCiAgICAgICAgd2hpbGUgKChuYW1lID0gdG9rZW5zLnBvcCgpKSA9PSAnJyk7DQogICAgICAgIHJldHVybiAobmFtZSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldHVybihmaWxlUGF0aC5uZXdOYW1lKQ0KICAgIH0NCn0NCmZ1bmN0aW9uIGV4dHJhY3RGaWxlU291cmNlKGZpbGVQYXRoKQ0Kew0KICAgIHJldHVybiAodHlwZW9mIChmaWxlUGF0aCkgPT0gJ3N0cmluZycgPyBmaWxlUGF0aCA6IGZpbGVQYXRoLnNvdXJjZSk7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlU2VydmljZVN0YXR1cyh0b2tlbikNCnsNCiAgICB2YXIgaiA9IHt9Ow0KICAgIHZhciBzZXJ2aWNlVHlwZSA9IHRva2VuLkRlcmVmKDAsIDQpLkludFZhbDsNCiAgICBqLmlzRmlsZVN5c3RlbURyaXZlciA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKTsNCiAgICBqLmlzS2VybmVsRHJpdmVyID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMDEpID09IDB4MDAwMDAwMDEpOw0KICAgIGouaXNTaGFyZWRQcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMjApID09IDB4MDAwMDAwMjApOw0KICAgIGouaXNPd25Qcm9jZXNzID0gKChzZXJ2aWNlVHlwZSAmIDB4MDAwMDAwMTApID09IDB4MDAwMDAwMTApOw0KICAgIGouaXNJbnRlcmFjdGl2ZSA9ICgoc2VydmljZVR5cGUgJiAweDAwMDAwMTAwKSA9PSAweDAwMDAwMTAwKTsNCiAgICBqLndhaXRIaW50ID0gdG9rZW4uRGVyZWYoKDYgKiA0KSwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICBzd2l0Y2ggKHRva2VuLkRlcmVmKCgxICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkpDQogICAgew0KICAgICAgICBjYXNlIDB4MDAwMDAwMDU6DQogICAgICAgICAgICBqLnN0YXRlID0gJ0NPTlRJTlVFX1BFTkRJTkcnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMHgwMDAwMDAwNjoNCiAgICAgICAgICAgIGouc3RhdGUgPSAnUEFVU0VfUEVORElORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDA3Og0KICAgICAgICAgICAgai5zdGF0ZSA9ICdQQVVTRUQnOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgMHgwMDAwMDAwNDoNCiAgICAgICAgICAgIGouc3RhdGUgPSAnUlVOTklORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDAyOg0KICAgICAgICAgICAgai5zdGF0ZSA9ICdTVEFSVF9QRU5ESU5HJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlIDB4MDAwMDAwMDM6DQogICAgICAgICAgICBqLnN0YXRlID0gJ1NUT1BfUEVORElORyc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAweDAwMDAwMDAxOg0KICAgICAgICAgICAgai5zdGF0ZSA9ICdTVE9QUEVEJzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICB2YXIgY29udHJvbHNBY2NlcHRlZCA9IHRva2VuLkRlcmVmKCgyICogNCksIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCk7DQogICAgai5jb250cm9sc0FjY2VwdGVkID0gW107DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAxMCkgPT0gMHgwMDAwMDAxMCkNCiAgICB7DQogICAgICAgIGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfTkVUQklOREFERCcpOw0KICAgICAgICBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX05FVEJJTkRSRU1PVkUnKTsNCiAgICAgICAgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9ORVRCSU5ERU5BQkxFJyk7DQogICAgICAgIGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfTkVUQklORERJU0FCTEUnKTsNCiAgICB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDAwOCkgPT0gMHgwMDAwMDAwOCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BBUkFNQ0hBTkdFJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDAyKSA9PSAweDAwMDAwMDAyKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUEFVU0UnKTsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9DT05USU5VRScpOyB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDEwMCkgPT0gMHgwMDAwMDEwMCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1BSRVNIVVRET1dOJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDA0KSA9PSAweDAwMDAwMDA0KSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfU0hVVERPV04nKTsgfQ0KICAgIGlmICgoY29udHJvbHNBY2NlcHRlZCAmIDB4MDAwMDAwMDEpID09IDB4MDAwMDAwMDEpIHsgai5jb250cm9sc0FjY2VwdGVkLnB1c2goJ1NFUlZJQ0VfQ09OVFJPTF9TVE9QJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDIwKSA9PSAweDAwMDAwMDIwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfSEFSRFdBUkVQUk9GSUxFQ0hBTkdFJyk7IH0NCiAgICBpZiAoKGNvbnRyb2xzQWNjZXB0ZWQgJiAweDAwMDAwMDQwKSA9PSAweDAwMDAwMDQwKSB7IGouY29udHJvbHNBY2NlcHRlZC5wdXNoKCdTRVJWSUNFX0NPTlRST0xfUE9XRVJFVkVOVCcpOyB9DQogICAgaWYgKChjb250cm9sc0FjY2VwdGVkICYgMHgwMDAwMDA4MCkgPT0gMHgwMDAwMDA4MCkgeyBqLmNvbnRyb2xzQWNjZXB0ZWQucHVzaCgnU0VSVklDRV9DT05UUk9MX1NFU1NJT05DSEFOR0UnKTsgfQ0KICAgIGoucGlkID0gdG9rZW4uRGVyZWYoKDcgKiA0KSwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKTsNCiAgICByZXR1cm4gKGopOw0KfQ0KDQppZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCnsNCiAgICBmdW5jdGlvbiBnZXRPU1ZlcnNpb24oKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJzd192ZXJzIHwgZ3JlcCBQcm9kdWN0VmVyc2lvbiB8IGF3ayAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7DQogICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgLy9jaGlsZC5zdGRvdXQuc3RyID0gJzEwLjknOw0KDQogICAgICAgIHZhciByZXQgPSB7IHJhdzogY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkuc3BsaXQoJy4nKSwgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLnJhdy5qb2luKCcuJykpOyB9IH07DQogICAgICAgIHJldC5jb21wYXJlVG8gPSBmdW5jdGlvbiBjb21wYXJlVG8odmFsKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcmF3ID0gKHR5cGVvZiAodmFsKSA9PSAnc3RyaW5nJykgPyB2YWwuc3BsaXQoJy4nKSA6IHZhbC5yYXc7IGlmICghcmF3KSB7IHRocm93ICgnSW52YWxpZCBwYXJhbWV0ZXInKTsgfQ0KICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLnJhdy5qb2luKCcuJykuc3BsaXQoJy4nKTsNCg0KICAgICAgICAgICAgdmFyIHIgPSBudWxsLCBzID0gbnVsbDsNCiAgICAgICAgICAgIHdoaWxlIChzZWxmLmxlbmd0aCA+IDAgJiYgcmF3Lmxlbmd0aCA+IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcyA9IHBhcnNlSW50KHNlbGYuc2hpZnQoKSk7IHIgPSBwYXJzZUludChyYXcuc2hpZnQoKSk7DQogICAgICAgICAgICAgICAgaWYgKHMgPCByKSB7IHJldHVybiAoLTEpOyB9DQogICAgICAgICAgICAgICAgaWYgKHMgPiByKSB7IHJldHVybiAoMSk7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzZWxmLmxlbmd0aCA9PSByYXcubGVuZ3RoKSB7IHJldHVybiAoMCk7IH0NCiAgICAgICAgICAgIGlmIChzZWxmLmxlbmd0aCA8IHJhdy5sZW5ndGgpIHsgcmV0dXJuICgtMSk7IH0gZWxzZSB7IHJldHVybiAoMSk7IH0gICAgDQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH07DQoNCg0KICAgIGZ1bmN0aW9uIGZldGNoUGxpc3QoZm9sZGVyLCBuYW1lLCB1c2VyaWQpDQogICAgew0KICAgICAgICBpZiAoZm9sZGVyLmVuZHNXaXRoKCcvJykpIHsgZm9sZGVyID0gZm9sZGVyLnN1YnN0cmluZygwLCBmb2xkZXIubGVuZ3RoIC0gMSk7IH0NCiAgICAgICAgdmFyIHJldCA9IHsgbmFtZTogbmFtZSwgY2xvc2U6IGZ1bmN0aW9uICgpIHsgfSwgX3VpZDogdXNlcmlkIH07DQogICAgICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKGZvbGRlciArICcvJyArIG5hbWUgKyAnLnBsaXN0JykpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSB0aHJvdyBpbiB0aGUgdG93ZWwsIGxldCdzIGVudW1lcmF0ZSBhbGwgdGhlIHBsaXN0IGZpbGVzLCBhbmQgc2VlIGlmIG9uZSBoYXMgYSBtYXRjaGluZyBsYWJlbA0KICAgICAgICAgICAgdmFyIGZpbGVzID0gcmVxdWlyZSgnZnMnKS5yZWFkZGlyU3luYyhmb2xkZXIpOw0KICAgICAgICAgICAgZm9yICh2YXIgZmlsZSBpbiBmaWxlcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgZm9sZGVyICsgJy8nICsgZmlsZXNbZmlsZV0gKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+TGFiZWw8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPC9zdHJpbmc+XCIpOyBzcGxpdChiWzFdLCBjLCBcIjxzdHJpbmc+XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gbmFtZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldC5uYW1lID0gZmlsZXNbZmlsZV0uZW5kc1dpdGgoJy5wbGlzdCcpID8gZmlsZXNbZmlsZV0uc3Vic3RyaW5nKDAsIGZpbGVzW2ZpbGVdLmxlbmd0aCAtIDYpIDogZmlsZXNbZmlsZV07DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdhbGlhcycsIHsgdmFsdWU6IG5hbWUgfSk7DQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICdwbGlzdCcsIHsgdmFsdWU6IGZvbGRlciArICcvJyArIGZpbGVzW2ZpbGVdIH0pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocmV0Lm5hbWUgPT0gbmFtZSkgeyB0aHJvdyAoJyAnICsgKGZvbGRlci5zcGxpdCgnTGF1bmNoRGFlbW9uJykubGVuZ3RoPjEgPyAnTGF1bmNoRGFlbW9uJyA6ICdMYXVuY2hBZ2VudCcpICsgJyAoJyArIG5hbWUgKyAnKSBOT1QgRk9VTkQnKTsgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ3BsaXN0JywgeyB2YWx1ZTogZm9sZGVyICsgJy8nICsgbmFtZSArICcucGxpc3QnIH0pOw0KICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2FsaWFzJywNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PkxhYmVsPC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ2RhZW1vbicsIHsgdmFsdWU6IHJldC5wbGlzdC5zcGxpdCgnL0xhdW5jaERhZW1vbnMvJykubGVuZ3RoID4gMSA/IHRydWUgOiBmYWxzZSB9KTsNCg0KICAgICAgICByZXQuYXBwV29ya2luZ0RpcmVjdG9yeSA9IGZ1bmN0aW9uIGFwcFdvcmtpbmdEaXJlY3RvcnkoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgdGhpcy5wbGlzdCArICIgfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgc3BsaXQoJDAsIGEsIFwiPGtleT5Xb3JraW5nRGlyZWN0b3J5PC9rZXk+XCIpOyBzcGxpdChhWzJdLCBiLCBcIjwvc3RyaW5nPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8c3RyaW5nPlwiKTsgcHJpbnQgY1syXTsgfSdcbmV4aXRcbiIpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLmVuZHNXaXRoKCcvJykgPyBjaGlsZC5zdGRvdXQuc3RyLnN1YnN0cmluZygwLCBjaGlsZC5zdGRvdXQuc3RyLmxlbmd0aCAtIDEpIDogY2hpbGQuc3Rkb3V0LnN0cik7DQogICAgICAgIH07DQogICAgICAgIHJldC5hcHBMb2NhdGlvbiA9IGZ1bmN0aW9uIGFwcExvY2F0aW9uKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgIiArIHRoaXMucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHNwbGl0KCQwLCBhLCBcIjxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCI8L3N0cmluZz5cIik7IHNwbGl0KGJbMV0sIGMsIFwiPHN0cmluZz5cIik7IHByaW50IGNbMl07IH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgfTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwgJ19ydW5BdExvYWQnLA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2VlIGlmIHRoaXMgaXMgYW4gQXV0by1TdGFydGluZyBzZXJ2aWNlLCBpbiBvcmRlciB0byBmaWd1cmUgb3V0IGhvdyB0byBpbXBsZW1lbnQgJ3N0YXJ0Jw0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAiICsgcmV0LnBsaXN0ICsgIiB8IHRyICdcbicgJ1wuJyB8IGF3ayAneyBzcGxpdCgkMCwgYSwgXCI8a2V5PlJ1bkF0TG9hZDwva2V5PlwiKTsgc3BsaXQoYVsyXSwgYiwgXCIvPlwiKTsgc3BsaXQoYlsxXSwgYywgXCI8XCIpOyBwcmludCBjWzJdOyB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkudG9VcHBlckNhc2UoKSA9PSAiVFJVRSIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAiX2tlZXBBbGl2ZSIsDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSANCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0ICIgKyByZXQucGxpc3QgKyAiIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7c3BsaXQoJDAsIGEsIFwiPGtleT5LZWVwQWxpdmU8L2tleT5cIik7IHNwbGl0KGFbMl0sIGIsIFwiPFwiKTsgc3BsaXQoYlsyXSwgYywgXCI+XCIpOyAiKTsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIiBpZihjWzFdPT1cImRpY3RcIil7IHNwbGl0KGFbMl0sIGQsIFwiPC9kaWN0PlwiKTsgaWYoc3BsaXQoZFsxXSwgdHJ1dmFsLCBcIjx0cnVlLz5cIik+MSkgeyBzcGxpdCh0cnV2YWxbMV0sIGtuMSwgXCI8a2V5PlwiKTsgc3BsaXQoa24xWzJdLCBrbjIsIFwiPC9rZXk+XCIpOyBwcmludCBrbjJbMV07IH0gfSIpOw0KICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiIGVsc2UgeyBzcGxpdChjWzFdLCBrYSwgXCIvXCIpOyBpZihrYVsxXT09XCJ0cnVlXCIpIHtwcmludCBcIkFMV0FZU1wiO30gfSB9J1xuZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICByZXQuZ2V0UElEID0gZnVuY3Rpb24gZ2V0UElEKHVpZCwgYXNTdHJpbmcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdW5kZWZpbmVkOw0KICAgICAgICAgICAgdmFyIGNvbW1hbmQ7DQogICAgICAgICAgICBpZiAodGhpcy5fdWlkICE9IG51bGwpIHsgdWlkID0gdGhpcy5fdWlkOyB9DQoNCiAgICAgICAgICAgIGlmIChnZXRPU1ZlcnNpb24oKS5jb21wYXJlVG8oJzEwLjEwJykgPCAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAibGF1bmNoY3RsIGxpc3QgfCBncmVwICciICsgdGhpcy5hbGlhcyArICInIHwgYXdrICd7IGlmKCQzPT1cIiIgKyB0aGlzLmFsaWFzICsgIlwiKXtwcmludCAkMTt9fSdcbmV4aXRcbiI7DQogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsgdWlkOiB1aWQgfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodWlkID09IG51bGwpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2xhdW5jaGN0bCBwcmludCBzeXN0ZW0gfCBncmVwICInICsgdGhpcy5hbGlhcyArICciIHwgYXdrIFwneyBpZihzcGxpdCgkMCwgdG1wLCAiICIpPT0zKSB7IGlmKCQzPT0iJyArIHRoaXMuYWxpYXMgKyAnIikgeyBwcmludCAkMTsgfSB9fVwnXG5leGl0XG4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gJ2xhdW5jaGN0bCBwcmludCBndWkvJyArIHVpZCArICcgfCBncmVwICInICsgdGhpcy5hbGlhcyArICciIHwgYXdrIFwneyBpZihzcGxpdCgkMCwgdG1wLCAiICIpPT0zKSB7IGlmKCQzPT0iJyArIHRoaXMuYWxpYXMgKyAnIikgeyBwcmludCAkMTsgfSB9fVwnXG5leGl0XG4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddLCBvcHRpb25zKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGNvbW1hbmQpOw0KICAgICAgICAgICAg", 16000); @@ -1975,13 +1976,13 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_pcall_method(ctx, 2); duk_pop(ctx); free(_servicemanager); - char *_usersessions = ILibMemory_Allocate(89383, 0, NULL, NULL); - memcpy_s(_usersessions + 0, 51076, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBOT1RJRllfRk9SX1RISVNfU0VTU0lPTiA9IDA7CnZhciBOT1RJRllfRk9SX0FMTF9TRVNTSU9OUyA9IDE7CnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsKdmFyIFdNX1BPV0VSQlJPQURDQVNUID0gMHgyMTg7CnZhciBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFID0gMHg4MDEzOwp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7CnZhciBQQlRfQVBNUkVTVU1FU1VTUEVORCA9IDB4NzsKdmFyIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUMgPSAweDEyOwp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOwoKdmFyIFdUU19DT05TT0xFX0NPTk5FQ1QgICAgICAgICA9ICgweDEpOwp2YXIgV1RTX0NPTlNPTEVfRElTQ09OTkVDVCAgICAgID0gKDB4Mik7CnZhciBXVFNfUkVNT1RFX0NPTk5FQ1QgICAgICAgICAgPSAoMHgzKTsKdmFyIFdUU19SRU1PVEVfRElTQ09OTkVDVCAgICAgICA9ICgweDQpOwp2YXIgV1RTX1NFU1NJT05fTE9HT04gICAgICAgICAgID0gKDB4NSk7CnZhciBXVFNfU0VTU0lPTl9MT0dPRkYgICAgICAgICAgPSAoMHg2KTsKdmFyIFdUU19TRVNTSU9OX0xPQ0sgICAgICAgICAgICA9ICgweDcpOwp2YXIgV1RTX1NFU1NJT05fVU5MT0NLICAgICAgICAgID0gKDB4OCk7CnZhciBXVFNfU0VTU0lPTl9SRU1PVEVfQ09OVFJPTCAgPSAoMHg5KTsKdmFyIFdUU19TRVNTSU9OX0NSRUFURSAgICAgICAgICA9ICgweEEpOwp2YXIgV1RTX1NFU1NJT05fVEVSTUlOQVRFICAgICAgID0gKDB4Qik7Cgp2YXIgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRTsKdmFyIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORzsKdmFyIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFOwoKZnVuY3Rpb24gY29sdW1uUGFyc2UoZGF0YSwgZGVsaW1pdGVyKQp7CiAgICB2YXIgdG9rZW5zID0gZGF0YS5zcGxpdChkZWxpbWl0ZXIpOwogICAgdmFyIHJldCA9IFtdOwogICAgZm9yKHZhciBpIGluIHRva2VucykKICAgIHsKICAgICAgICBpZiAodG9rZW5zW2ldLmxlbmd0aCA+IDApIHsgcmV0LnB1c2godG9rZW5zW2ldKTsgfQogICAgfQogICAgcmV0dXJuIChyZXQpOwp9CgoKZnVuY3Rpb24gVXNlclNlc3Npb25zKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAndXNlci1zZXNzaW9ucyc7CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2hhbmdlZCcpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdsb2NrZWQnKQogICAgICAgIC5jcmVhdGVFdmVudCgndW5sb2NrZWQnKTsKCiAgICB0aGlzLmVudW1lcmF0ZVVzZXJzID0gZnVuY3Rpb24gZW51bWVyYXRlVXNlcnMoKQogICAgewogICAgICAgIHZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwogICAgICAgIHZhciBwID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fX3Jlc29sdmVyID0gcmVzOwogICAgICAgICAgICB0aGlzLl9fcmVqZWN0b3IgPSByZWo7CiAgICAgICAgfSk7CiAgICAgICAgcC5fX2hhbmRsZXIgPSBmdW5jdGlvbiBfX2hhbmRsZXIodXNlcnMpCiAgICAgICAgewogICAgICAgICAgICBwLl9fcmVzb2x2ZXIodXNlcnMpOwogICAgICAgIH07CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aGlzLkN1cnJlbnQocC5fX2hhbmRsZXIpOwogICAgICAgIH0KICAgICAgICBjYXRjaChlKQogICAgICAgIHsKICAgICAgICAgICAgcC5fX3JlamVjdG9yKGUpOwogICAgICAgIH0KICAgICAgICBwLnBhcmVudCA9IHRoaXM7CiAgICAgICAgcmV0dXJuIChwKTsKICAgIH0KCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgewogICAgICAgIHRoaXMuX3NlcnZpY2VIb29rZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICAgICAgdGhpcy5fa2VybmVsMzIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnV1RTR2V0QWN0aXZlQ29uc29sZVNlc3Npb25JZCcpCiAgICAgICAgCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aGlzLl93dHMgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdXdHNhcGkzMi5kbGwnKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRW51bWVyYXRlU2Vzc2lvbnNBJyk7CiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uQScpOwogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOwogICAgICAgIH0KICAgICAgICBjYXRjaChleGMpCiAgICAgICAgewogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQ2hlY2tUb2tlbk1lbWJlcnNoaXAnKTsKICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7CgogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1VucmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nKTsKICAgICAgICB0aGlzLl9ycGNydCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ1JwY3J0NC5kbGwnKTsKICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOwogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCA9IGZ1bmN0aW9uIFN0cmluZ1RvVVVJRChndWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7CiAgICAgICAgICAgIGlmKFN0cmluZ1RvVVVJRC51cy5fcnBjcnQuVXVpZEZyb21TdHJpbmdBKFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShndWlkKSwgcmV0VmFsKS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdDb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVVJRCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRC51cyA9IHRoaXM7CgogICAgICAgIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJzVkM2U5YTU5LWU5RDUtNGIwMC1hNmJkLWZmMzRmZjUxNjU0OCcpOwogICAgICAgIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORyA9IHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCgnYTdhZDgwNDEtYjQ1YS00Y2FlLTg3YTMtZWVjYmI0NjhhOWUxJyk7CiAgICAgICAgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJzZmZTY5NTU2LTcwNGEtNDdhMC04ZjI0LWMyOGQ5MzZmZGE0NycpOwoKICAgICAgICB0aGlzLlNlc3Npb25TdGF0ZXMgPSBbJ0FjdGl2ZScsICdDb25uZWN0ZWQnLCAnQ29ubmVjdFF1ZXJ5JywgJ1NoYWRvdycsICdEaXNjb25uZWN0ZWQnLCAnSWRsZScsICdMaXN0ZW5pbmcnLCAnUmVzZXQnLCAnRG93bicsICdJbml0J107CiAgICAgICAgdGhpcy5JbmZvQ2xhc3MgPQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnV1RTSW5pdGlhbFByb2dyYW0nOiAwLAogICAgICAgICAgICAgICAgJ1dUU0FwcGxpY2F0aW9uTmFtZSc6IDEsCiAgICAgICAgICAgICAgICAnV1RTV29ya2luZ0RpcmVjdG9yeSc6IDIsCiAgICAgICAgICAgICAgICAnV1RTT0VNSWQnOiAzLAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JZCc6IDQsCiAgICAgICAgICAgICAgICAnV1RTVXNlck5hbWUnOiA1LAogICAgICAgICAgICAgICAgJ1dUU1dpblN0YXRpb25OYW1lJzogNiwKICAgICAgICAgICAgICAgICdXVFNEb21haW5OYW1lJzogNywKICAgICAgICAgICAgICAgICdXVFNDb25uZWN0U3RhdGUnOiA4LAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEJ1aWxkTnVtYmVyJzogOSwKICAgICAgICAgICAgICAgICdXVFNDbGllbnROYW1lJzogMTAsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlyZWN0b3J5JzogMTEsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50UHJvZHVjdElkJzogMTIsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50SGFyZHdhcmVJZCc6IDEzLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEFkZHJlc3MnOiAxNCwKICAgICAgICAgICAgICAgICdXVFNDbGllbnREaXNwbGF5JzogMTUsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50UHJvdG9jb2xUeXBlJzogMTYsCiAgICAgICAgICAgICAgICAnV1RTSWRsZVRpbWUnOiAxNywKICAgICAgICAgICAgICAgICdXVFNMb2dvblRpbWUnOiAxOCwKICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0J5dGVzJzogMTksCiAgICAgICAgICAgICAgICAnV1RTT3V0Z29pbmdCeXRlcyc6IDIwLAogICAgICAgICAgICAgICAgJ1dUU0luY29taW5nRnJhbWVzJzogMjEsCiAgICAgICAgICAgICAgICAnV1RTT3V0Z29pbmdGcmFtZXMnOiAyMiwKICAgICAgICAgICAgICAgICdXVFNDbGllbnRJbmZvJzogMjMsCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbkluZm8nOiAyNCwKICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uSW5mb0V4JzogMjUsCiAgICAgICAgICAgICAgICAnV1RTQ29uZmlnSW5mbyc6IDI2LAogICAgICAgICAgICAgICAgJ1dUU1ZhbGlkYXRpb25JbmZvJzogMjcsCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbkFkZHJlc3NWNCc6IDI4LAogICAgICAgICAgICAgICAgJ1dUU0lzUmVtb3RlU2Vzc2lvbic6IDI5CiAgICAgICAgICAgIH07CgogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBOVEF1dGhvcml0eSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNik7CiAgICAgICAgICAgIE5UQXV0aG9yaXR5LnRvQnVmZmVyKCkud3JpdGVJbnQ4KDUsIDUpOwoKICAgICAgICAgICAgdmFyIEFkbWluaXN0cmF0b3JzR3JvdXAgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGFkbWluID0gZmFsc2U7CgogICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZChOVEF1dGhvcml0eSwgMiwgMzIsIDU0NCwgMCwgMCwgMCwgMCwgMCwgMCwgQWRtaW5pc3RyYXRvcnNHcm91cCkuVmFsICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBtZW1iZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZUludGVnZXIoKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhcGkuQ2hlY2tUb2tlbk1lbWJlcnNoaXAoMCwgQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpLCBtZW1iZXIpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSAhPSAwKSB7IGFkbWluID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkZyZWVTaWQoQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWRtaW47CiAgICAgICAgfQoKICAgICAgICB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRTZXNzaW9uQXR0cmlidXRlKHNlc3Npb25JZCwgYXR0cikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGJ5dGVzUmV0dXJuZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwoKICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvbkEoMCwgc2Vzc2lvbklkLCBhdHRyLCBidWZmZXIsIGJ5dGVzUmV0dXJuZWQpLlZhbCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIGNhbGxpbmcgV1RTUXVlcnlTZXNzaW9uSW5mb3JtYXRpb246ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJldFZhbCA9IGJ1ZmZlci5EZXJlZigpLlN0cmluZzsKCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KGJ1ZmZlci5EZXJlZigpKTsKICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5jb25zb2xlVWlkID0gZnVuY3Rpb24gY29uc29sZVVpZCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLl9rZXJuZWwzMi5XVFNHZXRBY3RpdmVDb25zb2xlU2Vzc2lvbklkKCkuVmFsOwogICAgICAgICAgICBpZihpZD09MHhGRkZGRkZGRikge3Rocm93KCdOb2JvZHkgbG9nZ2VkIGluJyk7fQogICAgICAgICAgICByZXR1cm4gKGlkKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUodWlkLCB0aGlzLkluZm9DbGFzcy5XVFNVc2VyTmFtZSkpOw0KICAgICAgICB9CiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXRWYWwgPSB7fTsKICAgICAgICAgICAgdmFyIHBpbmZvID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIGlmICh0aGlzLl93dHMuV1RTRW51bWVyYXRlU2Vzc2lvbnNBKDAsIDAsIDEsIHBpbmZvLCBjb3VudCkuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNFbnVtZXJhdGVTZXNzaW9uc0E6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKS5WYWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50LnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0gcGluZm8uRGVyZWYoKS5EZXJlZihpICogKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjQpLCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KTsKICAgICAgICAgICAgICAgIHZhciBqID0geyBTZXNzaW9uSWQ6IGluZm8udG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSB9OwogICAgICAgICAgICAgICAgai5TdGF0aW9uTmFtZSA9IGluZm8uRGVyZWYodGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNCA6IDgsIHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUpLkRlcmVmKCkuU3RyaW5nOwogICAgICAgICAgICAgICAgai5TdGF0ZSA9IHRoaXMuU2Vzc2lvblN0YXRlc1tpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDggOiAxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKV07CiAgICAgICAgICAgICAgICBpZiAoai5TdGF0ZSA9PSAnQWN0aXZlJykgewogICAgICAgICAgICAgICAgICAgIGouVXNlcm5hbWUgPSB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUoai5TZXNzaW9uSWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKTsKICAgICAgICAgICAgICAgICAgICBqLkRvbWFpbiA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTRG9tYWluTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXRWYWxbai5TZXNzaW9uSWRdID0gajsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5fd3RzLldUU0ZyZWVNZW1vcnkocGluZm8uRGVyZWYoKSk7CgogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkocmV0VmFsKSB9KTsKICAgICAgICAgICAgaWYgKGNiKSB7IGNiKHJldFZhbCk7IH0KICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH07CgoKICAgICAgICAvLyBXZSBuZWVkIHRvIHNwaW4gdXAgYSBtZXNzYWdlIHB1bXAsIGFuZCBmZXRjaCBhIHdpbmRvdyBoYW5kbGUKICAgICAgICB2YXIgbWVzc2FnZV9wdW1wID0gcmVxdWlyZSgnd2luLW1lc3NhZ2UtcHVtcCcpOwogICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wID0gbmV3IG1lc3NhZ2VfcHVtcCh7IGZpbHRlcjogV01fV1RTU0VTU0lPTl9DSEFOR0UgfSk7IHRoaXMuX21lc3NhZ2VwdW1wLnBhcmVudCA9IHRoaXM7ICAgICAKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll93dHMuV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24odGhpcy5wYXJlbnQuaHduZCk7IH0pOwogICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wLm9uKCdod25kJywgZnVuY3Rpb24gKGgpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudC5od25kID0gaDsKCiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8geWllbGQsIGFuZCBkbyB0aGlzIGluIHRoZSBuZXh0IGV2ZW50IGxvb3AgcGFzcywgYmVjdWFzZSB3ZSBkb24ndCB3YW50IHRvIGNhbGwgJ1JlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uJwogICAgICAgICAgICAvLyBmcm9tIHRoZSBtZXNzYWdlcHVtcCAndGhyZWFkJywgYmVjYXVzZSB3ZSBhcmUgYWN0dWFsbHkgb24gdGhlIG1pY3Jvc3RhY2sgdGhyZWFkLCBzdWNoIHRoYXQgdGhlIG1lc3NhZ2UgcHVtcCB0aHJlYWQsIGlzIGhvbGRpbmcKICAgICAgICAgICAgLy8gb24gYSBzZW1hcGhvcmUgZm9yIHVzIHRvIHJldHVybi4gSWYgd2UgY2FsbCBub3csIHdlIG1heSBkZWFkbG9jayBvbiBXaW5kb3dzIDcsIGJlY3Vhc2UgaXQgd2lsbCB0cnkgdG8gbm90aWZ5IGltbWVkaWF0ZWx5CiAgICAgICAgICAgIHRoaXMuaW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uIChzZWxmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgd2luZG93IGhhbmRsZSwgd2UgY2FuIHJlZ2lzdGVyIGl0IHRvIHJlY2VpdmUgV2luZG93cyBNZXNzYWdlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYucGFyZW50Ll93dHMpIHsgc2VsZi5wYXJlbnQuX3d0cy5XVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgTk9USUZZX0ZPUl9BTExfU0VTU0lPTlMpOyB9CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRSwgMCk7CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkJBVFRfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9CQVRURVJZX1BFUkNFTlRBR0VfUkVNQUlOSU5HLCAwKTsKICAgICAgICAgICAgICAgIHNlbGYucGFyZW50Ll91c2VyMzIuRElTUF9IID0gc2VsZi5wYXJlbnQuX3VzZXIzMi5SZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbihzZWxmLnBhcmVudC5od25kLCBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURSwgMCk7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYucGFyZW50Ll91c2VyMzIuQUNEQ19ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0guVmFsLCBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSC5WYWwpOwogICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2gobXNnLm1lc3NhZ2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgV01fV1RTU0VTU0lPTl9DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1zZy53cGFyYW0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPQ0s6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHVzZXJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2Vyc1ttc2cubHBhcmFtXSkgeyB0aGlzLnBhcmVudC5lbWl0KCdsb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fVU5MT0NLOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1c2VycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgndW5sb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fTE9HT046CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05f", 16000); - memcpy_s(_usersessions + 16000, 35076, "TE9HT0ZGOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXTV9QT1dFUkJST0FEQ0FTVDoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobXNnLndwYXJhbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV01fUE9XRVJCUk9BRENBU1QgW1VOS05PV04gd3BhcmFtXTogJyArIG1zZy53cGFyYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVNVU1BFTkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnU0xFRVAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX05PTl9JTlRFUkFDVElWRScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVJFU1VNRVNVU1BFTkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX0lOVEVSQUNUSVZFJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUE9XRVJTVEFUVVNDSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX1BPV0VSU0VUVElOR0NIQU5HRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBscGFyYW0gPSB0aGlzLnBhcmVudC5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKEJ1ZmZlci5mcm9tKG1zZy5scGFyYW1faGV4LCAnaGV4JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBscGFyYW0uRGVyZWYoMjAsIGxwYXJhbS5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCkpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobHBhcmFtLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YS5yZWFkVUludDMyTEUoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdBQycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdhY2RjJywgJ0JBVFRFUlknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdIT1QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORy5EZXJlZigwLCAxNikudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdiYXR0ZXJ5TGV2ZWwnLCBkYXRhLnJlYWRVSW50MzJMRSgwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YS5yZWFkVUludDMyTEUoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPRkYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPTicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ0RJTU1FRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICB7CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYnVzID0gcmVxdWlyZSgnbGludXgtZGJ1cycpOwogICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS53YXRjaCkgewogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyID0gcmVxdWlyZSgnZnMnKS53YXRjaCgnL3Zhci9ydW4vdXRtcCcpOwogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXM7CiAgICAgICAgICAgICAgICB0aGlzLl9saW51eFdhdGNoZXIub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyX3Nlc3Npb24uZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikgewogICAgICAgICAgICAgICAgdmFyIHJldFZhbCA9IHt9OwogICAgICAgICAgICAgICAgcmV0VmFsLl9PYmplY3RJRCA9ICdVc2VyU2Vzc2lvbicKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdfY2FsbGJhY2snLCB7IHZhbHVlOiBjYiB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdfY2hpbGQnLCB7IHZhbHVlOiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2xhc3QnLCBbJ2xhc3QnLCAnLWYnLCAnL3Zhci9ydW4vdXRtcCddKSB9KTsKCiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLlBhcmVudCA9IHJldFZhbDsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuX3R4dCA9ICcnOwogICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5fdHh0LnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgICAgIHZhciBzZXNzaW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGxpbmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGdldFRva2VucyhsaW5lc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHsgVXNlcm5hbWU6IHRva2Vuc1swXSwgU2Vzc2lvbklkOiB0b2tlbnNbMV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1szXS5pbmNsdWRlcygnc3RpbGwgbG9nZ2VkIGluJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLlN0YXRlID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLkxhc3RBY3RpdmUgPSB0b2tlbnNbM107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMucHVzaChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucy5wb3AoKTsKCgogICAgICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzZXNzaW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnNbaV0uVXNlcm5hbWUgIT0gJ3JlYm9vdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW3Nlc3Npb25zW2ldLlNlc3Npb25JZF0gPSBzZXNzaW9uc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZXNbc2Vzc2lvbnNbaV0uVXNlcm5hbWVdID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZXNbc2Vzc2lvbnNbaV0uVXNlcm5hbWVdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5QYXJlbnQuX2NhbGxiYWNrKSB7IHRoaXMuUGFyZW50Ll9jYWxsYmFjay5jYWxsKHRoaXMuUGFyZW50LCB1c2Vycyk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB1c2VybmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX191c2VybmFtZSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fcmVzb2x2ZXIgPSByZXM7IHRoaXMuX19yZWplY3RvciA9IHJlajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJywgJy11Jywgbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLnByb21pc2UgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLnN0ZG91dC5fdHh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuX3R4dCArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5zdGRvdXQuX3R4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fX3JlamVjdG9yKCdpbnZhbGlkIHVpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBwYXJzZUludCh0aGlzLnN0ZG91dC5fdHh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX19yZXNvbHZlcihpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChwbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBEb25lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHBsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVtwbGlzdFtpXS5fX3VzZXJuYW1lXSA9IHBsaXN0W2ldLl9pbnRlcm5hbC5jb21wbGV0ZWRBcmdzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdXNlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW2ldLnVpZCA9IHRhYmxlW3VzZXJzW2ldLlVzZXJuYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuX2NhbGxiYWNrKSB7IHJldFZhbC5fY2FsbGJhY2suY2FsbChyZXRWYWwsIHVzZXJzKTsgfQogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1c2VycywgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHVzZXJzKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbC5fY2FsbGJhY2spIHsgcmV0VmFsLl9jYWxsYmFjay5jYWxsKHJldFZhbCwgdXNlcnMpOyB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuc3Rkb3V0LlBhcmVudCA9IHJldFZhbC5fY2hpbGQ7CiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLlBhcmVudC5fdHh0ICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwoKICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2VycyA9IGZ1bmN0aW9uIF9yZWNoZWNrTG9nZ2VkSW5Vc2VycygpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh1LkFjdGl2ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYSB1c2VyIGxvZ2dlZCBpbiwgc28gd2UgY2FuIG1vbml0b3IgREJVUyBmb3IgbG9jay91bmxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIgIT0gbnVsbCAmJiB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLnVpZCAhPSB1LkFjdGl2ZVswXS51aWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIgPSBuZXcgZGJ1cyhwcm9jZXNzLmVudlsnWERHX0NVUlJFTlRfREVTS1RPUCddID09ICdVbml0eScgPyAnY29tLnVidW50dS5VcHN0YXJ0MF82JyA6ICdvcmcuZ25vbWUuU2NyZWVuU2F2ZXInLCB1LkFjdGl2ZVswXS51aWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXMucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLm9uKCdzaWduYWwnLCBmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLnVzZXJfc2Vzc2lvbi5lbnVtZXJhdGVVc2VycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zaWduYWxEYXRhID0gcy5kYXRhWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNpZ25hbERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0cnVlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZXNrdG9wLWxvY2snOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnbG9ja2VkJywgdS5BY3RpdmVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2t0b3AtdW5sb2NrJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ3VubG9ja2VkJywgdS5BY3RpdmVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdldFVpZENvbmZpZyA9IGZ1bmN0aW9uIGdldFVpZENvbmZpZygpIHsKICAgICAgICAgICAgICAgIHZhciByZXQgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBjZmcgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL2V0Yy9sb2dpbi5kZWZzJykudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnM7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGNmZykgewogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGNvbHVtblBhcnNlKGNmZ1tpXSwgJ1x0Jyk7IC8vY29uc29sZS5sb2codG9rZW5zKTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdID09ICdVSURfTUlOJykgeyByZXQuTUlOID0gcGFyc2VJbnQodG9rZW5zWzFdKTsgfQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0gPT0gJ1VJRF9NQVgnKSB7IHJldC5NQVggPSBwYXJzZUludCh0b2tlbnNbMV0pOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5NSU4gIT0gbnVsbCAmJiByZXQuTUFYICE9IG51bGwpIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5vbignY2hhbmdlZCcsIHRoaXMuX3JlY2hlY2tMb2dnZWRJblVzZXJzKTsgLy8gRm9yIGxpbnV4IExvY2svVW5sb2NrIG1vbml0b3JpbmcsIHdlIG5lZWQgdG8gd2F0Y2ggZm9yIExvZ09uL0xvZ09mZiwgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIFVJRC4KCiAgICAgICAgICAgIC8vIEZpcnN0IHN0ZXAsIGlzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHVzZXIgbG9nZ2VkIGluOgogICAgICAgICAgICB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2VycygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl91c2VycyA9IGZ1bmN0aW9uIF91c2VycygpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2F3ayAtRjogXCcoJDMgPj0gMCkge3ByaW50ZiAiJXM6JXNcXG4iLCAkMSwgJDN9XCcgL2V0Yy9wYXNzd2RcbmV4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAg", 16000); - memcpy_s(_usersessions + 32000, 19076, "ICAgdmFyIHJldCA9IHt9LCB0b2tlbnM7CiAgICAgICAgICAgIGZvciAodmFyIGxuIGluIGxpbmVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tsbl0uc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgcmV0W3Rva2Vuc1swXV0gPSB0b2tlbnNbMV07IH0gICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdWlkcyA9IGZ1bmN0aW9uIF91aWRzKCkgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2F3ayAtRjogXCcoJDMgPj0gMCkge3ByaW50ZiAiJXM6JXNcXG4iLCAkMSwgJDN9XCcgL2V0Yy9wYXNzd2RcbmV4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgdmFyIHJldCA9IHt9LCB0b2tlbnM7CiAgICAgICAgICAgIGZvciAodmFyIGxuIGluIGxpbmVzKSB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tsbl0uc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgcmV0W3Rva2Vuc1sxXV0gPSB0b2tlbnNbMF07IH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnd2hvXG5leGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRlcnIuc3RyICE9ICcnKSB7IHJldHVybiAoMCk7IH0KCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciB0b2tlbnMsIGksIGo7CiAgICAgICAgICAgIGZvciAoaSBpbiBsaW5lcykgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCB0b2tlbnMubGVuZ3RoOyArK2opIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zW2pdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludCh0aGlzLl91c2VycygpW3Rva2Vuc1swXV0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgKCdub2JvZHkgbG9nZ2VkIGludG8gY29uc29sZScpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLmdldFVpZCA9IGZ1bmN0aW9uIGdldFVpZCh1c2VybmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9ldGMvcGFzc3dkIHwgYXdrIC1GOiAnKCQxPT1cIiIgKyB1c2VybmFtZSArICJcIil7cHJpbnQgJDN9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgcmV0ID0gcGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0cik7ICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeyByZXR1cm4gKHJldCk7IH0KICAgICAgICAgICAgdGhyb3cgKCd1c2VybmFtZTogJyArIHVzZXJuYW1lICsgJyBOT1QgRk9VTkQnKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImNhdCAvZXRjL3Bhc3N3ZCB8IGF3ayAtRjogJygkMz09IiArIHVpZCArICIpe3ByaW50ICQxfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci5sZW5ndGggPiAwKSB7IHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOyB9CiAgICAgICAgICAgIHRocm93ICgndWlkOiAnICsgdWlkICsgJyBOT1QgRk9VTkQnKTsKICAgICAgICB9OwogICAgICAgIHRoaXMud2hvYW1pID0gZnVuY3Rpb24gd2hvYW1pKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hvYW1pXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldEVudkZyb21QaWQgPSBmdW5jdGlvbiBnZXRFbnZGcm9tUGlkKHBpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXQgPSB7fTsKICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHBzLCBwc3gsIHYsIHZzID0gMDsKICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBzID0gcmVxdWlyZSgnZnMnKS5yZWFkRmlsZVN5bmMoJy9wcm9jLycgKyBwaWQgKyAnL2Vudmlyb24nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChwc2UpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAocHN4ID0gMDsgcHN4IDwgcHMubGVuZ3RoOyArK3BzeCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAocHNbcHN4XSA9PSAwKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHBzLnNsaWNlKHZzLCBwc3gpLnRvU3RyaW5nKCkuc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0W3ZbMF1dID0gdlsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgdnMgPSBwc3ggKyAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdmcmVlYnNkJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcm9jc3RhdCAtZSAiICsgcGlkICsgIiB8IGdyZXAgIiArIHBpZCArICIgfCBhd2sgJ3sgJDE9XCJcIjsgJDI9XCJcIjsgcHJpbnQgJDAgfScgfCB0ciBcIlxcIFwiIFwiXFxuXCJcbmV4aXRcbiIpOyAKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgkJCiAgICAgICAgICAgICAgICB2YXIgZW52OwogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIHRva2VucykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b2tlbnNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgICAgICByZXRbZW52WzBdXSA9IGVudlsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHJldCk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmZpbmRFbnYgPSBmdW5jdGlvbiBmaW5kRW52KHVpZCwgZW52KQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHVuYW1lID0gdGhpcy5nZXRVc2VybmFtZSh1aWQpOwogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBzICIgKyAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcgPyAiLWF4ICI6IiIpICsgIi1lIC1vIHBpZCAtbyB1c2VyIHwgZ3JlcCAiICsgdW5hbWUgKyAiIHwgYXdrICd7IHByaW50ICQxIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIGZvciAodmFyIG4gaW4gbGluZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBsbiA9IGxpbmVzW25dLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChsbi5sZW5ndGggPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5nZXRFbnZGcm9tUGlkKGxuKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZVtlbnZdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlW2Vudl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKG51bGwpOwogICAgICAgIH07CiAgICB9CiAgICBlbHNlIGlmKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpCiAgICB7CiAgICAgICAgdGhpcy5nZXRVaWQgPSBmdW5jdGlvbiBnZXRVaWQodXNlcm5hbWUpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImlkICIgKyB1c2VybmFtZSArICIgfCBhd2sgJ3sgc3BsaXQoJDEsIHRva2VuLCBcIj1cIik7IHNwbGl0KHRva2VuWzJdLCB1aWQsIFwiKFwiKTsgcHJpbnQgdWlkWzFdOyB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0R3JvdXBJRCA9IGZ1bmN0aW9uIGdldEdyb3VwSUQodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpZCAiICsgdWlkICsgIiB8IGF3ayAneyBzcGxpdCgkMiwgZ2lkLCBcIj1cIik7IGlmKGdpZFsxXT09XCJnaWRcIikgeyBzcGxpdChnaWRbMl0sIGdpZG51bSwgXCIoXCIpOyBwcmludCBnaWRudW1bMV07ICB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmdldFVzZXJuYW1lID0gZnVuY3Rpb24gZ2V0VXNlcm5hbWUodWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZHNjbCAuIGxpc3QgL1VzZXJzIFVuaXF1ZUlEIHwgZ3JlcCAiICsgdWlkICsgIiB8IGF3ayAneyBpZigkMj09IiArIHVpZCArICIpeyBwcmludCAkMSB9fSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZihjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ3VpZDogJyArIHVpZCArICcgbm90IGZvdW5kJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuY29uc29sZVVpZCA9IGZ1bmN0aW9uIGNvbnNvbGVVaWQoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aG8gfCB0ciAnXG4nICdcLicgfCBhd2sgJ3sgcHJpbnQgJDEgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIHJldCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOwogICAgICAgICAgICBpZiAocmV0ICE9ICcnKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0VWlkKHJldCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93ICgnbm9ib2R5IGxvZ2dlZCBpbnRvIGNvbnNvbGUnKTsgICAgIAogICAgICAgIH0KICAgICAgICB0aGlzLmdldEhvbWVGb2xkZXIgPSBmdW5jdGlvbiBnZXRIb21lRm9sZGVyKHVzZXIpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImRzY2wgLiAtcmVhZCAvVXNlcnMvIiArIHVzZXIgKyAiIHwgZ3JlcCBORlNIb21lRGlyZWN0b3J5IHwgYXdrIC1GOiAneyBwcmludCAkMiB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ3VzZXI6ICcgKyB1c2VyICsgJyBub3QgZm91bmQnKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5fdXNlcnMgPSBmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciB0b2tlbnMsIGk7CiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyB1c2Vyc1t0b2tlbnNbMF1dID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTsgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gKHVzZXJzKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdWlkcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9kc2NsJywgWydkc2NsJywgJy4nLCAnbGlzdCcsICcvVXNlcnMnLCAnVW5pcXVlSUQnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgdG9rZW5zLCBpOwogICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgdXNlcnNbdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXV0gPSB0b2tlbnNbMF07IH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICh1c2Vycyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lkVGFibGUgPSBmdW5jdGlvbigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgdGFibGUgPSB7fTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9pZCcsIFsnaWQnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKVswXS5zcGxpdCgnICcpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICB2YXIgdHlwZXMgPSBsaW5lc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHR5cGVzWzFdLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV0gPSB7fTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBqIGluIHRva2VucykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZGFyciA9IHRva2Vuc1tqXS5zcGxpdCgnKCcpOwogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkYXJyWzBdOwogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gaWRhcnJbMV0uc3Vic3RyaW5nKDAsIGlkYXJyWzFdLmxlbmd0aCAtIDEpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV1bbmFtZV0gPSBpZDsKICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlc1swXV1baWRdID0gbmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHRhYmxlKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gKGNiKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHVzZXJzID0ge307CiAgICAgICAgICAgIHZhciB0YWJsZSA9IHRoaXMuX2lkVGFibGUoKTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvdXNyL2Jpbi9sYXN0JywgWydsYXN0J10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2ldLmxlbmd0aCA+IDA7ICsraSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCF1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg", 16000); - memcpy_s(_usersessions + 48000, 3076, "ICAgICAgIHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dID0geyBVc2VybmFtZTogbGluZXNbaV0uc3BsaXQoJyAnKVswXSwgU3RhdGU6IGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxID8gJ0FjdGl2ZScgOiAnSW5hY3RpdmUnLCB1aWQ6IHRhYmxlLnVpZFtsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYodXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0uU3RhdGUgIT0gJ0FjdGl2ZScgJiYgbGluZXNbaV0uc3BsaXQoJ3N0aWxsIGxvZ2dlZCBpbicpLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXS5TdGF0ZSA9ICdBY3RpdmUnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOwogICAgICAgICAgICBpZiAoY2IpIHsgY2IuY2FsbCh0aGlzLCB1c2Vycyk7IH0KICAgICAgICB9CiAgICB9CgogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnd2luMzInKSAvLyBMaW51eCwgTWFjT1MsIEZyZWVCU0QKICAgIHsKICAgICAgICB0aGlzLlNlbGYgPSBmdW5jdGlvbiBTZWxmKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJywgJy11J10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5TZWxmKCkgPT0gMCk7CiAgICAgICAgfQogICAgfQoKCn0KZnVuY3Rpb24gc2hvd0FjdGl2ZU9ubHkoc291cmNlKQp7CiAgICB2YXIgcmV0VmFsID0gW107CiAgICB2YXIgdW5pcXVlID0ge307CiAgICB2YXIgdXNlcm5hbWVzID0gW107CiAgICB2YXIgdG1wOwoKICAgIGZvciAodmFyIGkgaW4gc291cmNlKQogICAgewogICAgICAgIGlmIChzb3VyY2VbaV0uU3RhdGUgPT0gJ0FjdGl2ZScpCiAgICAgICAgewogICAgICAgICAgICByZXRWYWwucHVzaChzb3VyY2VbaV0pOwogICAgICAgICAgICB0bXAgPSAoc291cmNlW2ldLkRvbWFpbiA/IChzb3VyY2VbaV0uRG9tYWluICsgJ1xcJykgOiAnJykgKyBzb3VyY2VbaV0uVXNlcm5hbWU7CiAgICAgICAgICAgIGlmICghdW5pcXVlW3RtcF0pIHsgdW5pcXVlW3RtcF0gPSB0bXA7fQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKHZhciBpIGluIHVuaXF1ZSkKICAgIHsKICAgICAgICB1c2VybmFtZXMucHVzaChpKTsKICAgIH0KCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAndXNlcm5hbWVzJywgeyB2YWx1ZTogdXNlcm5hbWVzIH0pOwogICAgcmV0dXJuIChyZXRWYWwpOwp9CmZ1bmN0aW9uIGdldFRva2VucyhzdHIpCnsKICAgIHZhciBjb2x1bW5zID0gW107CiAgICB2YXIgaTsKCiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZygwLCAoaT1zdHIuaW5kZXhPZignICcpKSkpOwogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7CiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZyhpLCAoaT1zdHIuc3Vic3RyaW5nKGkpLmluZGV4T2YoJyAnKSArIGkpKSk7CiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsKICAgIGNvbHVtbnMucHVzaChzdHIuc3Vic3RyaW5nKGksIChpPXN0ci5zdWJzdHJpbmcoaSkuaW5kZXhPZignICcpICsgaSkpKTsKICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOwogICAgdmFyIHN0YXR1cyA9IHN0ci5zdWJzdHJpbmcoaSkudHJpbSgpOwogICAgY29sdW1ucy5wdXNoKHN0YXR1cyk7CgogICAgcmV0dXJuIChjb2x1bW5zKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgVXNlclNlc3Npb25zKCk7Cv==", 3076); - ILibBase64DecodeEx((unsigned char*)_usersessions, 51076, (unsigned char*)_usersessions + 51076); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 51076); + char *_usersessions = ILibMemory_Allocate(91890, 0, NULL, NULL); + memcpy_s(_usersessions + 0, 52508, "LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBOT1RJRllfRk9SX1RISVNfU0VTU0lPTiA9IDA7CnZhciBOT1RJRllfRk9SX0FMTF9TRVNTSU9OUyA9IDE7CnZhciBXTV9XVFNTRVNTSU9OX0NIQU5HRSA9IDB4MDJCMTsKdmFyIFdNX1BPV0VSQlJPQURDQVNUID0gMHgyMTg7CnZhciBQQlRfUE9XRVJTRVRUSU5HQ0hBTkdFID0gMHg4MDEzOwp2YXIgUEJUX0FQTVNVU1BFTkQgPSAweDQ7CnZhciBQQlRfQVBNUkVTVU1FU1VTUEVORCA9IDB4NzsKdmFyIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUMgPSAweDEyOwp2YXIgUEJUX0FQTVBPV0VSU1RBVFVTQ0hBTkdFID0gMHhBOwoKdmFyIFdUU19DT05TT0xFX0NPTk5FQ1QgICAgICAgICA9ICgweDEpOwp2YXIgV1RTX0NPTlNPTEVfRElTQ09OTkVDVCAgICAgID0gKDB4Mik7CnZhciBXVFNfUkVNT1RFX0NPTk5FQ1QgICAgICAgICAgPSAoMHgzKTsKdmFyIFdUU19SRU1PVEVfRElTQ09OTkVDVCAgICAgICA9ICgweDQpOwp2YXIgV1RTX1NFU1NJT05fTE9HT04gICAgICAgICAgID0gKDB4NSk7CnZhciBXVFNfU0VTU0lPTl9MT0dPRkYgICAgICAgICAgPSAoMHg2KTsKdmFyIFdUU19TRVNTSU9OX0xPQ0sgICAgICAgICAgICA9ICgweDcpOwp2YXIgV1RTX1NFU1NJT05fVU5MT0NLICAgICAgICAgID0gKDB4OCk7CnZhciBXVFNfU0VTU0lPTl9SRU1PVEVfQ09OVFJPTCAgPSAoMHg5KTsKdmFyIFdUU19TRVNTSU9OX0NSRUFURSAgICAgICAgICA9ICgweEEpOwp2YXIgV1RTX1NFU1NJT05fVEVSTUlOQVRFICAgICAgID0gKDB4Qik7Cgp2YXIgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRTsKdmFyIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORzsKdmFyIEdVSURfQ09OU09MRV9ESVNQTEFZX1NUQVRFOwoKZnVuY3Rpb24gY29sdW1uUGFyc2UoZGF0YSwgZGVsaW1pdGVyKQp7CiAgICB2YXIgdG9rZW5zID0gZGF0YS5zcGxpdChkZWxpbWl0ZXIpOwogICAgdmFyIHJldCA9IFtdOwogICAgZm9yKHZhciBpIGluIHRva2VucykKICAgIHsKICAgICAgICBpZiAodG9rZW5zW2ldLmxlbmd0aCA+IDApIHsgcmV0LnB1c2godG9rZW5zW2ldKTsgfQogICAgfQogICAgcmV0dXJuIChyZXQpOwp9CgoKZnVuY3Rpb24gVXNlclNlc3Npb25zKCkKewogICAgdGhpcy5fT2JqZWN0SUQgPSAndXNlci1zZXNzaW9ucyc7CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2hhbmdlZCcpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdsb2NrZWQnKQogICAgICAgIC5jcmVhdGVFdmVudCgndW5sb2NrZWQnKTsKCiAgICB0aGlzLmVudW1lcmF0ZVVzZXJzID0gZnVuY3Rpb24gZW51bWVyYXRlVXNlcnMoKQogICAgewogICAgICAgIHZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwogICAgICAgIHZhciBwID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKQogICAgICAgIHsKICAgICAgICAgICAgdGhpcy5fX3Jlc29sdmVyID0gcmVzOwogICAgICAgICAgICB0aGlzLl9fcmVqZWN0b3IgPSByZWo7CiAgICAgICAgfSk7CiAgICAgICAgcC5fX2hhbmRsZXIgPSBmdW5jdGlvbiBfX2hhbmRsZXIodXNlcnMpCiAgICAgICAgewogICAgICAgICAgICBwLl9fcmVzb2x2ZXIodXNlcnMpOwogICAgICAgIH07CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aGlzLkN1cnJlbnQocC5fX2hhbmRsZXIpOwogICAgICAgIH0KICAgICAgICBjYXRjaChlKQogICAgICAgIHsKICAgICAgICAgICAgcC5fX3JlamVjdG9yKGUpOwogICAgICAgIH0KICAgICAgICBwLnBhcmVudCA9IHRoaXM7CiAgICAgICAgcmV0dXJuIChwKTsKICAgIH0KCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgewogICAgICAgIHRoaXMuX3NlcnZpY2VIb29rZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9tYXJzaGFsID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7CiAgICAgICAgdGhpcy5fa2VybmVsMzIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdLZXJuZWwzMi5kbGwnKTsKICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOwogICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnV1RTR2V0QWN0aXZlQ29uc29sZVNlc3Npb25JZCcpCiAgICAgICAgCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB0aGlzLl93dHMgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZU5hdGl2ZVByb3h5KCdXdHNhcGkzMi5kbGwnKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRW51bWVyYXRlU2Vzc2lvbnNBJyk7CiAgICAgICAgICAgIHRoaXMuX3d0cy5DcmVhdGVNZXRob2QoJ1dUU1F1ZXJ5U2Vzc2lvbkluZm9ybWF0aW9uQScpOwogICAgICAgICAgICB0aGlzLl93dHMuQ3JlYXRlTWV0aG9kKCdXVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24nKTsKICAgICAgICAgICAgdGhpcy5fd3RzLkNyZWF0ZU1ldGhvZCgnV1RTRnJlZU1lbW9yeScpOwogICAgICAgIH0KICAgICAgICBjYXRjaChleGMpCiAgICAgICAgewogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYWR2YXBpID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVOYXRpdmVQcm94eSgnQWR2YXBpMzIuZGxsJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkJyk7CiAgICAgICAgdGhpcy5fYWR2YXBpLkNyZWF0ZU1ldGhvZCgnQ2hlY2tUb2tlbk1lbWJlcnNoaXAnKTsKICAgICAgICB0aGlzLl9hZHZhcGkuQ3JlYXRlTWV0aG9kKCdGcmVlU2lkJyk7CgogICAgICAgIHRoaXMuX3VzZXIzMiA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKICAgICAgICB0aGlzLl91c2VyMzIuQ3JlYXRlTWV0aG9kKHsgbWV0aG9kOiAnUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nLCB0aHJlYWREaXNwYXRjaDogMX0pOwogICAgICAgIHRoaXMuX3VzZXIzMi5DcmVhdGVNZXRob2QoJ1VucmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24nKTsKICAgICAgICB0aGlzLl9ycGNydCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlTmF0aXZlUHJveHkoJ1JwY3J0NC5kbGwnKTsKICAgICAgICB0aGlzLl9ycGNydC5DcmVhdGVNZXRob2QoJ1V1aWRGcm9tU3RyaW5nQScpOwogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCA9IGZ1bmN0aW9uIFN0cmluZ1RvVVVJRChndWlkKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHJldFZhbCA9IFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZSgxNik7CiAgICAgICAgICAgIGlmKFN0cmluZ1RvVVVJRC51cy5fcnBjcnQuVXVpZEZyb21TdHJpbmdBKFN0cmluZ1RvVVVJRC51cy5fbWFyc2hhbC5DcmVhdGVWYXJpYWJsZShndWlkKSwgcmV0VmFsKS5WYWwgPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCdDb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVVJRCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRC51cyA9IHRoaXM7CgogICAgICAgIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJzVkM2U5YTU5LWU5RDUtNGIwMC1hNmJkLWZmMzRmZjUxNjU0OCcpOwogICAgICAgIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORyA9IHRoaXMuX3JwY3J0LlN0cmluZ1RvVVVJRCgnYTdhZDgwNDEtYjQ1YS00Y2FlLTg3YTMtZWVjYmI0NjhhOWUxJyk7CiAgICAgICAgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUgPSB0aGlzLl9ycGNydC5TdHJpbmdUb1VVSUQoJzZmZTY5NTU2LTcwNGEtNDdhMC04ZjI0LWMyOGQ5MzZmZGE0NycpOwoKICAgICAgICB0aGlzLlNlc3Npb25TdGF0ZXMgPSBbJ0FjdGl2ZScsICdDb25uZWN0ZWQnLCAnQ29ubmVjdFF1ZXJ5JywgJ1NoYWRvdycsICdEaXNjb25uZWN0ZWQnLCAnSWRsZScsICdMaXN0ZW5pbmcnLCAnUmVzZXQnLCAnRG93bicsICdJbml0J107CiAgICAgICAgdGhpcy5JbmZvQ2xhc3MgPQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnV1RTSW5pdGlhbFByb2dyYW0nOiAwLAogICAgICAgICAgICAgICAgJ1dUU0FwcGxpY2F0aW9uTmFtZSc6IDEsCiAgICAgICAgICAgICAgICAnV1RTV29ya2luZ0RpcmVjdG9yeSc6IDIsCiAgICAgICAgICAgICAgICAnV1RTT0VNSWQnOiAzLAogICAgICAgICAgICAgICAgJ1dUU1Nlc3Npb25JZCc6IDQsCiAgICAgICAgICAgICAgICAnV1RTVXNlck5hbWUnOiA1LAogICAgICAgICAgICAgICAgJ1dUU1dpblN0YXRpb25OYW1lJzogNiwKICAgICAgICAgICAgICAgICdXVFNEb21haW5OYW1lJzogNywKICAgICAgICAgICAgICAgICdXVFNDb25uZWN0U3RhdGUnOiA4LAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEJ1aWxkTnVtYmVyJzogOSwKICAgICAgICAgICAgICAgICdXVFNDbGllbnROYW1lJzogMTAsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50RGlyZWN0b3J5JzogMTEsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50UHJvZHVjdElkJzogMTIsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50SGFyZHdhcmVJZCc6IDEzLAogICAgICAgICAgICAgICAgJ1dUU0NsaWVudEFkZHJlc3MnOiAxNCwKICAgICAgICAgICAgICAgICdXVFNDbGllbnREaXNwbGF5JzogMTUsCiAgICAgICAgICAgICAgICAnV1RTQ2xpZW50UHJvdG9jb2xUeXBlJzogMTYsCiAgICAgICAgICAgICAgICAnV1RTSWRsZVRpbWUnOiAxNywKICAgICAgICAgICAgICAgICdXVFNMb2dvblRpbWUnOiAxOCwKICAgICAgICAgICAgICAgICdXVFNJbmNvbWluZ0J5dGVzJzogMTksCiAgICAgICAgICAgICAgICAnV1RTT3V0Z29pbmdCeXRlcyc6IDIwLAogICAgICAgICAgICAgICAgJ1dUU0luY29taW5nRnJhbWVzJzogMjEsCiAgICAgICAgICAgICAgICAnV1RTT3V0Z29pbmdGcmFtZXMnOiAyMiwKICAgICAgICAgICAgICAgICdXVFNDbGllbnRJbmZvJzogMjMsCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbkluZm8nOiAyNCwKICAgICAgICAgICAgICAgICdXVFNTZXNzaW9uSW5mb0V4JzogMjUsCiAgICAgICAgICAgICAgICAnV1RTQ29uZmlnSW5mbyc6IDI2LAogICAgICAgICAgICAgICAgJ1dUU1ZhbGlkYXRpb25JbmZvJzogMjcsCiAgICAgICAgICAgICAgICAnV1RTU2Vzc2lvbkFkZHJlc3NWNCc6IDI4LAogICAgICAgICAgICAgICAgJ1dUU0lzUmVtb3RlU2Vzc2lvbic6IDI5CiAgICAgICAgICAgIH07CgogICAgICAgIHRoaXMuaXNSb290ID0gZnVuY3Rpb24gaXNSb290KCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBOVEF1dGhvcml0eSA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNik7CiAgICAgICAgICAgIE5UQXV0aG9yaXR5LnRvQnVmZmVyKCkud3JpdGVJbnQ4KDUsIDUpOwoKICAgICAgICAgICAgdmFyIEFkbWluaXN0cmF0b3JzR3JvdXAgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGFkbWluID0gZmFsc2U7CgogICAgICAgICAgICBpZiAodGhpcy5fYWR2YXBpLkFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZChOVEF1dGhvcml0eSwgMiwgMzIsIDU0NCwgMCwgMCwgMCwgMCwgMCwgMCwgQWRtaW5pc3RyYXRvcnNHcm91cCkuVmFsICE9IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBtZW1iZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZUludGVnZXIoKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhcGkuQ2hlY2tUb2tlbk1lbWJlcnNoaXAoMCwgQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpLCBtZW1iZXIpLlZhbCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXIudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSAhPSAwKSB7IGFkbWluID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fYWR2YXBpLkZyZWVTaWQoQWRtaW5pc3RyYXRvcnNHcm91cC5EZXJlZigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWRtaW47CiAgICAgICAgfQoKICAgICAgICB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUgPSBmdW5jdGlvbiBnZXRTZXNzaW9uQXR0cmlidXRlKHNlc3Npb25JZCwgYXR0cikKICAgICAgICB7CiAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgdmFyIGJ5dGVzUmV0dXJuZWQgPSB0aGlzLl9tYXJzaGFsLkNyZWF0ZVZhcmlhYmxlKDQpOwoKICAgICAgICAgICAgaWYgKHRoaXMuX3d0cy5XVFNRdWVyeVNlc3Npb25JbmZvcm1hdGlvbkEoMCwgc2Vzc2lvbklkLCBhdHRyLCBidWZmZXIsIGJ5dGVzUmV0dXJuZWQpLlZhbCA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ0Vycm9yIGNhbGxpbmcgV1RTUXVlcnlTZXNzaW9uSW5mb3JtYXRpb246ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IuVmFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJldFZhbCA9IGJ1ZmZlci5EZXJlZigpLlN0cmluZzsKCiAgICAgICAgICAgIHRoaXMuX3d0cy5XVFNGcmVlTWVtb3J5KGJ1ZmZlci5EZXJlZigpKTsKICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5jb25zb2xlVWlkID0gZnVuY3Rpb24gY29uc29sZVVpZCgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgaWQgPSB0aGlzLl9rZXJuZWwzMi5XVFNHZXRBY3RpdmVDb25zb2xlU2Vzc2lvbklkKCkuVmFsOwogICAgICAgICAgICBpZihpZD09MHhGRkZGRkZGRikge3Rocm93KCdOb2JvZHkgbG9nZ2VkIGluJyk7fQogICAgICAgICAgICByZXR1cm4gKGlkKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuZ2V0VXNlcm5hbWUgPSBmdW5jdGlvbiBnZXRVc2VybmFtZSh1aWQpCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUodWlkLCB0aGlzLkluZm9DbGFzcy5XVFNVc2VyTmFtZSkpOw0KICAgICAgICB9CiAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikKICAgICAgICB7CiAgICAgICAgICAgIHZhciByZXRWYWwgPSB7fTsKICAgICAgICAgICAgdmFyIHBpbmZvID0gdGhpcy5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMuX21hcnNoYWwuQ3JlYXRlVmFyaWFibGUoNCk7CiAgICAgICAgICAgIGlmICh0aGlzLl93dHMuV1RTRW51bWVyYXRlU2Vzc2lvbnNBKDAsIDAsIDEsIHBpbmZvLCBjb3VudCkuVmFsID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRocm93ICgnRXJyb3IgY2FsbGluZyBXVFNFbnVtZXJhdGVTZXNzaW9uc0E6ICcgKyB0aGlzLl9rZXJuZWwzMi5HZXRMYXN0RXJyb3IoKS5WYWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50LnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBpbmZvID0gcGluZm8uRGVyZWYoKS5EZXJlZihpICogKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDEyIDogMjQpLCB0aGlzLl9tYXJzaGFsLlBvaW50ZXJTaXplID09IDQgPyAxMiA6IDI0KTsKICAgICAgICAgICAgICAgIHZhciBqID0geyBTZXNzaW9uSWQ6IGluZm8udG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSB9OwogICAgICAgICAgICAgICAgai5TdGF0aW9uTmFtZSA9IGluZm8uRGVyZWYodGhpcy5fbWFyc2hhbC5Qb2ludGVyU2l6ZSA9PSA0ID8gNCA6IDgsIHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUpLkRlcmVmKCkuU3RyaW5nOwogICAgICAgICAgICAgICAgai5TdGF0ZSA9IHRoaXMuU2Vzc2lvblN0YXRlc1tpbmZvLkRlcmVmKHRoaXMuX21hcnNoYWwuUG9pbnRlclNpemUgPT0gNCA/IDggOiAxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKV07CiAgICAgICAgICAgICAgICBpZiAoai5TdGF0ZSA9PSAnQWN0aXZlJykgewogICAgICAgICAgICAgICAgICAgIGouVXNlcm5hbWUgPSB0aGlzLmdldFNlc3Npb25BdHRyaWJ1dGUoai5TZXNzaW9uSWQsIHRoaXMuSW5mb0NsYXNzLldUU1VzZXJOYW1lKTsKICAgICAgICAgICAgICAgICAgICBqLkRvbWFpbiA9IHRoaXMuZ2V0U2Vzc2lvbkF0dHJpYnV0ZShqLlNlc3Npb25JZCwgdGhpcy5JbmZvQ2xhc3MuV1RTRG9tYWluTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXRWYWxbai5TZXNzaW9uSWRdID0gajsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5fd3RzLldUU0ZyZWVNZW1vcnkocGluZm8uRGVyZWYoKSk7CgogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0VmFsLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkocmV0VmFsKSB9KTsKICAgICAgICAgICAgaWYgKGNiKSB7IGNiKHJldFZhbCk7IH0KICAgICAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgICAgIH07CgoKICAgICAgICAvLyBXZSBuZWVkIHRvIHNwaW4gdXAgYSBtZXNzYWdlIHB1bXAsIGFuZCBmZXRjaCBhIHdpbmRvdyBoYW5kbGUKICAgICAgICB2YXIgbWVzc2FnZV9wdW1wID0gcmVxdWlyZSgnd2luLW1lc3NhZ2UtcHVtcCcpOwogICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wID0gbmV3IG1lc3NhZ2VfcHVtcCh7IGZpbHRlcjogV01fV1RTU0VTU0lPTl9DSEFOR0UgfSk7IHRoaXMuX21lc3NhZ2VwdW1wLnBhcmVudCA9IHRoaXM7ICAgICAKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50Ll93dHMuV1RTVW5SZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24odGhpcy5wYXJlbnQuaHduZCk7IH0pOwogICAgICAgIHRoaXMuX21lc3NhZ2VwdW1wLm9uKCdod25kJywgZnVuY3Rpb24gKGgpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudC5od25kID0gaDsKCiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8geWllbGQsIGFuZCBkbyB0aGlzIGluIHRoZSBuZXh0IGV2ZW50IGxvb3AgcGFzcywgYmVjdWFzZSB3ZSBkb24ndCB3YW50IHRvIGNhbGwgJ1JlZ2lzdGVyUG93ZXJTZXR0aW5nTm90aWZpY2F0aW9uJwogICAgICAgICAgICAvLyBmcm9tIHRoZSBtZXNzYWdlcHVtcCAndGhyZWFkJywgYmVjYXVzZSB3ZSBhcmUgYWN0dWFsbHkgb24gdGhlIG1pY3Jvc3RhY2sgdGhyZWFkLCBzdWNoIHRoYXQgdGhlIG1lc3NhZ2UgcHVtcCB0aHJlYWQsIGlzIGhvbGRpbmcKICAgICAgICAgICAgLy8gb24gYSBzZW1hcGhvcmUgZm9yIHVzIHRvIHJldHVybi4gSWYgd2UgY2FsbCBub3csIHdlIG1heSBkZWFkbG9jayBvbiBXaW5kb3dzIDcsIGJlY3Vhc2UgaXQgd2lsbCB0cnkgdG8gbm90aWZ5IGltbWVkaWF0ZWx5CiAgICAgICAgICAgIHRoaXMuaW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uIChzZWxmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgd2luZG93IGhhbmRsZSwgd2UgY2FuIHJlZ2lzdGVyIGl0IHRvIHJlY2VpdmUgV2luZG93cyBNZXNzYWdlcwogICAgICAgICAgICAgICAgaWYgKHNlbGYucGFyZW50Ll93dHMpIHsgc2VsZi5wYXJlbnQuX3d0cy5XVFNSZWdpc3RlclNlc3Npb25Ob3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgTk9USUZZX0ZPUl9BTExfU0VTU0lPTlMpOyB9CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkFDRENfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9BQ0RDX1BPV0VSX1NPVVJDRSwgMCk7CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5fdXNlcjMyLkJBVFRfSCA9IHNlbGYucGFyZW50Ll91c2VyMzIuUmVnaXN0ZXJQb3dlclNldHRpbmdOb3RpZmljYXRpb24oc2VsZi5wYXJlbnQuaHduZCwgR1VJRF9CQVRURVJZX1BFUkNFTlRBR0VfUkVNQUlOSU5HLCAwKTsKICAgICAgICAgICAgICAgIHNlbGYucGFyZW50Ll91c2VyMzIuRElTUF9IID0gc2VsZi5wYXJlbnQuX3VzZXIzMi5SZWdpc3RlclBvd2VyU2V0dGluZ05vdGlmaWNhdGlvbihzZWxmLnBhcmVudC5od25kLCBHVUlEX0NPTlNPTEVfRElTUExBWV9TVEFURSwgMCk7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYucGFyZW50Ll91c2VyMzIuQUNEQ19ILlZhbCwgc2VsZi5wYXJlbnQuX3VzZXIzMi5CQVRUX0guVmFsLCBzZWxmLnBhcmVudC5fdXNlcjMyLkRJU1BfSC5WYWwpOwogICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9tZXNzYWdlcHVtcC5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2gobXNnLm1lc3NhZ2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgV01fV1RTU0VTU0lPTl9DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG1zZy53cGFyYW0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdUU19TRVNTSU9OX0xPQ0s6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5lbnVtZXJhdGVVc2VycygpLnRoZW4oZnVuY3Rpb24gKHVzZXJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2Vyc1ttc2cubHBhcmFtXSkgeyB0aGlzLnBhcmVudC5lbWl0KCdsb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fVU5MT0NLOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1c2VycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcnNbbXNnLmxwYXJhbV0pIHsgdGhpcy5wYXJlbnQuZW1pdCgndW5sb2NrZWQnLCB1c2Vyc1ttc2cubHBhcmFtXSk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05fTE9HT046CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV1RTX1NFU1NJT05f", 16000); + memcpy_s(_usersessions + 16000, 36508, "TE9HT0ZGOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXTV9QT1dFUkJST0FEQ0FTVDoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobXNnLndwYXJhbSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV01fUE9XRVJCUk9BRENBU1QgW1VOS05PV04gd3BhcmFtXTogJyArIG1zZy53cGFyYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVNVU1BFTkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnU0xFRVAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBCVF9BUE1SRVNVTUVBVVRPTUFUSUM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX05PTl9JTlRFUkFDVElWRScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX0FQTVJFU1VNRVNVU1BFTkQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnc3gnLCAnUkVTVU1FX0lOVEVSQUNUSVZFJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQQlRfQVBNUE9XRVJTVEFUVVNDSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUEJUX1BPV0VSU0VUVElOR0NIQU5HRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBscGFyYW0gPSB0aGlzLnBhcmVudC5fbWFyc2hhbC5DcmVhdGVQb2ludGVyKEJ1ZmZlci5mcm9tKG1zZy5scGFyYW1faGV4LCAnaGV4JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBscGFyYW0uRGVyZWYoMjAsIGxwYXJhbS5EZXJlZigxNiwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoMCkpLnRvQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gobHBhcmFtLkRlcmVmKDAsIDE2KS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQUNEQ19QT1dFUl9TT1VSQ0UuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YS5yZWFkVUludDMyTEUoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdBQycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdhY2RjJywgJ0JBVFRFUlknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnYWNkYycsICdIT1QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdVSURfQkFUVEVSWV9QRVJDRU5UQUdFX1JFTUFJTklORy5EZXJlZigwLCAxNikudG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdiYXR0ZXJ5TGV2ZWwnLCBkYXRhLnJlYWRVSW50MzJMRSgwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR1VJRF9DT05TT0xFX0RJU1BMQVlfU1RBVEUuRGVyZWYoMCwgMTYpLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goZGF0YS5yZWFkVUludDMyTEUoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPRkYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdwb3dlci1tb25pdG9yJykuZW1pdCgnZGlzcGxheScsICdPTicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Bvd2VyLW1vbml0b3InKS5lbWl0KCdkaXNwbGF5JywgJ0RJTU1FRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcgfHwgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICB7CiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykKICAgICAgICB7CiAgICAgICAgICAgIHZhciBkYnVzID0gcmVxdWlyZSgnbGludXgtZGJ1cycpOwogICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS53YXRjaCkgewogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyID0gcmVxdWlyZSgnZnMnKS53YXRjaCgnL3Zhci9ydW4vdXRtcCcpOwogICAgICAgICAgICAgICAgdGhpcy5fbGludXhXYXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXM7CiAgICAgICAgICAgICAgICB0aGlzLl9saW51eFdhdGNoZXIub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2VyX3Nlc3Npb24uZW1pdCgnY2hhbmdlZCcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5DdXJyZW50ID0gZnVuY3Rpb24gQ3VycmVudChjYikgewogICAgICAgICAgICAgICAgdmFyIHJldFZhbCA9IHt9OwogICAgICAgICAgICAgICAgcmV0VmFsLl9PYmplY3RJRCA9ICdVc2VyU2Vzc2lvbicKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdfY2FsbGJhY2snLCB7IHZhbHVlOiBjYiB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXRWYWwsICdfY2hpbGQnLCB7IHZhbHVlOiByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2xhc3QnLCBbJ2xhc3QnLCAnLWYnLCAnL3Zhci9ydW4vdXRtcCddKSB9KTsKCiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLlBhcmVudCA9IHJldFZhbDsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuX3R4dCA9ICcnOwogICAgICAgICAgICAgICAgcmV0VmFsLl9jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gdGhpcy5fdHh0LnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgICAgIHZhciBzZXNzaW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGxpbmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lc1tpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGdldFRva2VucyhsaW5lc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHsgVXNlcm5hbWU6IHRva2Vuc1swXSwgU2Vzc2lvbklkOiB0b2tlbnNbMV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1szXS5pbmNsdWRlcygnc3RpbGwgbG9nZ2VkIGluJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLlN0YXRlID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLkxhc3RBY3RpdmUgPSB0b2tlbnNbM107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMucHVzaChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9ucy5wb3AoKTsKCgogICAgICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZXMgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzZXNzaW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnNbaV0uVXNlcm5hbWUgIT0gJ3JlYm9vdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW3Nlc3Npb25zW2ldLlNlc3Npb25JZF0gPSBzZXNzaW9uc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZXNbc2Vzc2lvbnNbaV0uVXNlcm5hbWVdID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZXNbc2Vzc2lvbnNbaV0uVXNlcm5hbWVdID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ3Byb21pc2UnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHVzZXJzLCAnQWN0aXZlJywgeyB2YWx1ZTogc2hvd0FjdGl2ZU9ubHkodXNlcnMpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5QYXJlbnQuX2NhbGxiYWNrKSB7IHRoaXMuUGFyZW50Ll9jYWxsYmFjay5jYWxsKHRoaXMuUGFyZW50LCB1c2Vycyk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB1c2VybmFtZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX191c2VybmFtZSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fcmVzb2x2ZXIgPSByZXM7IHRoaXMuX19yZWplY3RvciA9IHJlajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJywgJy11Jywgbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLnByb21pc2UgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkLnN0ZG91dC5fdHh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuX3R4dCArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5zdGRvdXQuX3R4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZS5fX3JlamVjdG9yKCdpbnZhbGlkIHVpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBwYXJzZUludCh0aGlzLnN0ZG91dC5fdHh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX19yZXNvbHZlcihpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gocCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChwbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBEb25lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHBsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZVtwbGlzdFtpXS5fX3VzZXJuYW1lXSA9IHBsaXN0W2ldLl9pbnRlcm5hbC5jb21wbGV0ZWRBcmdzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdXNlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzW2ldLnVpZCA9IHRhYmxlW3VzZXJzW2ldLlVzZXJuYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodXNlcnMsICdBY3RpdmUnLCB7IHZhbHVlOiBzaG93QWN0aXZlT25seSh1c2VycykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRWYWwuX2NhbGxiYWNrKSB7IHJldFZhbC5fY2FsbGJhY2suY2FsbChyZXRWYWwsIHVzZXJzKTsgfQogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1c2VycywgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHVzZXJzKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbC5fY2FsbGJhY2spIHsgcmV0VmFsLl9jYWxsYmFjay5jYWxsKHJldFZhbCwgdXNlcnMpOyB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldFZhbC5fY2hpbGQuc3Rkb3V0LlBhcmVudCA9IHJldFZhbC5fY2hpbGQ7CiAgICAgICAgICAgICAgICByZXRWYWwuX2NoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLlBhcmVudC5fdHh0ICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwoKICAgICAgICAgICAgICAgIHJldHVybiAocmV0VmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2VycyA9IGZ1bmN0aW9uIF9yZWNoZWNrTG9nZ2VkSW5Vc2VycygpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW51bWVyYXRlVXNlcnMoKS50aGVuKGZ1bmN0aW9uICh1KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh1LkFjdGl2ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYSB1c2VyIGxvZ2dlZCBpbiwgc28gd2UgY2FuIG1vbml0b3IgREJVUyBmb3IgbG9jay91bmxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIgIT0gbnVsbCAmJiB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLnVpZCAhPSB1LkFjdGl2ZVswXS51aWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXIgPSBuZXcgZGJ1cyhwcm9jZXNzLmVudlsnWERHX0NVUlJFTlRfREVTS1RPUCddID09ICdVbml0eScgPyAnY29tLnVidW50dS5VcHN0YXJ0MF82JyA6ICdvcmcuZ25vbWUuU2NyZWVuU2F2ZXInLCB1LkFjdGl2ZVswXS51aWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLnVzZXJfc2Vzc2lvbiA9IHRoaXMucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyLm9uKCdzaWduYWwnLCBmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLnVzZXJfc2Vzc2lvbi5lbnVtZXJhdGVVc2VycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zaWduYWxEYXRhID0gcy5kYXRhWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50aGVuKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNpZ25hbERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0cnVlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZXNrdG9wLWxvY2snOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnbG9ja2VkJywgdS5BY3RpdmVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2t0b3AtdW5sb2NrJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ3VubG9ja2VkJywgdS5BY3RpdmVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudC5fbGludXhfbG9ja193YXRjaGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFyZW50Ll9saW51eF9sb2NrX3dhdGNoZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmdldFVpZENvbmZpZyA9IGZ1bmN0aW9uIGdldFVpZENvbmZpZygpIHsKICAgICAgICAgICAgICAgIHZhciByZXQgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBjZmcgPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL2V0Yy9sb2dpbi5kZWZzJykudG9TdHJpbmcoKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnM7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGNmZykgewogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGNvbHVtblBhcnNlKGNmZ1tpXSwgJ1x0Jyk7IC8vY29uc29sZS5sb2codG9rZW5zKTsKICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdID09ICdVSURfTUlOJykgeyByZXQuTUlOID0gcGFyc2VJbnQodG9rZW5zWzFdKTsgfQogICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0gPT0gJ1VJRF9NQVgnKSB7IHJldC5NQVggPSBwYXJzZUludCh0b2tlbnNbMV0pOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5NSU4gIT0gbnVsbCAmJiByZXQuTUFYICE9IG51bGwpIHsgYnJlYWs7IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5vbignY2hhbmdlZCcsIHRoaXMuX3JlY2hlY2tMb2dnZWRJblVzZXJzKTsgLy8gRm9yIGxpbnV4IExvY2svVW5sb2NrIG1vbml0b3JpbmcsIHdlIG5lZWQgdG8gd2F0Y2ggZm9yIExvZ09uL0xvZ09mZiwgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIFVJRC4KCiAgICAgICAgICAgIC8vIEZpcnN0IHN0ZXAsIGlzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHVzZXIgbG9nZ2VkIGluOgogICAgICAgICAgICB0aGlzLl9yZWNoZWNrTG9nZ2VkSW5Vc2VycygpOwogICAgICAgIH0KICAgICAgICB0aGlzLm1pblVpZCA9ICBmdW5jdGlvbiBtaW5VaWQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL2V0Yy9sb2dpbi5kZWZzIHwgZ3JlcCBVSURfIHwgYXdrICd7IGlmKCQxPT1cIlVJRF9NSU5cIikgeyBw", 16000); + memcpy_s(_usersessions + 32000, 20508, "cmludCAkMjsgfSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSA+PSAwID8gcGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpIDogNTAwKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLl91c2VycyA9IGZ1bmN0aW9uIF91c2VycygpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgfCBhd2sgLUY6ICd7IGlmKCQzPj0wKSB7IHByaW50ZiBcIiVzOiVzXFxuXCIsICQxLCAkMzsgfSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgcmV0ID0ge30sIHRva2VuczsKICAgICAgICAgICAgZm9yICh2YXIgbG4gaW4gbGluZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2xuXS5zcGxpdCgnOicpOwogICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSkgeyByZXRbdG9rZW5zWzBdXSA9IHRva2Vuc1sxXTsgfSAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgIH0KICAgICAgICB0aGlzLl91aWRzID0gZnVuY3Rpb24gX3VpZHMoKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCB8IGF3ayAtRjogJ3sgaWYoJDM+PTApIHsgcHJpbnRmIFwiJXM6JXNcXG5cIiwgJDEsICQzOyB9IH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgIHZhciByZXQgPSB7fSwgdG9rZW5zOwogICAgICAgICAgICBmb3IgKHZhciBsbiBpbiBsaW5lcykgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbbG5dLnNwbGl0KCc6Jyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHJldFt0b2tlbnNbMV1dID0gdG9rZW5zWzBdOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgIH0KICAgICAgICB0aGlzLmNvbnNvbGVVaWQgPSBmdW5jdGlvbiBjb25zb2xlVWlkKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3dob1xuZXhpdFxuJyk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICBpZiAoY2hpbGQuc3RkZXJyLnN0ciAhPSAnJykgeyByZXR1cm4gKDApOyB9CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgdG9rZW5zLCBpLCBqOwogICAgICAgICAgICBmb3IgKGkgaW4gbGluZXMpIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgdG9rZW5zLmxlbmd0aDsgKytqKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1tqXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQodGhpcy5fdXNlcnMoKVt0b2tlbnNbMF1dKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93ICgnbm9ib2R5IGxvZ2dlZCBpbnRvIGNvbnNvbGUnKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5nZXRIb21lRm9sZGVyID0gZnVuY3Rpb24gZ2V0SG9tZUZvbGRlcihpZCkKICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImdldGVudCBwYXNzd2QgIiArIGlkICsgIiB8IGF3ayAtRjogJ3twcmludCAkNn0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgIH0KICAgICAgICB0aGlzLmdldFVpZCA9IGZ1bmN0aW9uIGdldFVpZCh1c2VybmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCBcIiIgKyB1c2VybmFtZSArICJcIiB8IGF3ayAtRjogJ3twcmludCAkM30nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciByZXQgPSBwYXJzZUludChjaGlsZC5zdGRvdXQuc3RyKTsgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7IHJldHVybiAocmV0KTsgfQogICAgICAgICAgICB0aHJvdyAoJ3VzZXJuYW1lOiAnICsgdXNlcm5hbWUgKyAnIE5PVCBGT1VORCcpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiZ2V0ZW50IHBhc3N3ZCAiICsgdWlkICsgIiB8IGF3ayAtRjogJ3twcmludCAkMX0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIubGVuZ3RoID4gMCkgeyByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsgfQogICAgICAgICAgICB0aHJvdyAoJ3VpZDogJyArIHVpZCArICcgTk9UIEZPVU5EJyk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLndob2FtaSA9IGZ1bmN0aW9uIHdob2FtaSgpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndob2FtaVxuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZXRFbnZGcm9tUGlkID0gZnVuY3Rpb24gZ2V0RW52RnJvbVBpZChwaWQpCiAgICAgICAgewogICAgICAgICAgICB2YXIgcmV0ID0ge307CiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdsaW51eCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBwcywgcHN4LCB2LCB2cyA9IDA7CiAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgcGlkICsgJy9lbnZpcm9uJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAocHNlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKHBzeCA9IDA7IHBzeCA8IHBzLmxlbmd0aDsgKytwc3gpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBzW3BzeF0gPT0gMCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwcy5zbGljZSh2cywgcHN4KS50b1N0cmluZygpLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFt2WzBdXSA9IHZbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZzID0gcHN4ICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZnJlZWJzZCcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicHJvY3N0YXQgLWUgIiArIHBpZCArICIgfCBncmVwICIgKyBwaWQgKyAiIHwgYXdrICd7ICQxPVwiXCI7ICQyPVwiXCI7IHByaW50ICQwIH0nIHwgdHIgXCJcXCBcIiBcIlxcblwiXG5leGl0XG4iKTsgCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoJCQogICAgICAgICAgICAgICAgdmFyIGVudjsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0b2tlbnMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9rZW5zW2ldLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgcmV0W2VudlswXV0gPSBlbnZbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5maW5kRW52ID0gZnVuY3Rpb24gZmluZEVudih1aWQsIGVudikKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1bmFtZSA9IHRoaXMuZ2V0VXNlcm5hbWUodWlkKTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwcyAiICsgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2ZyZWVic2QnID8gIi1heCAiOiIiKSArICItZSAtbyBwaWQgLW8gdXNlciB8IGdyZXAgIiArIHVuYW1lICsgIiB8IGF3ayAneyBwcmludCAkMSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICBmb3IgKHZhciBuIGluIGxpbmVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgbG4gPSBsaW5lc1tuXS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAobG4ubGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2V0RW52RnJvbVBpZChsbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVbZW52XSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVtlbnZdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKICAgICAgICB9OwogICAgfQogICAgZWxzZSBpZihwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgewogICAgICAgIHRoaXMuZ2V0VWlkID0gZnVuY3Rpb24gZ2V0VWlkKHVzZXJuYW1lKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJpZCAiICsgdXNlcm5hbWUgKyAiIHwgYXdrICd7IHNwbGl0KCQxLCB0b2tlbiwgXCI9XCIpOyBzcGxpdCh0b2tlblsyXSwgdWlkLCBcIihcIik7IHByaW50IHVpZFsxXTsgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICByZXR1cm4gKHBhcnNlSW50KGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7CiAgICAgICAgfTsKICAgICAgICB0aGlzLmdldEdyb3VwSUQgPSBmdW5jdGlvbiBnZXRHcm91cElEKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgiaWQgIiArIHVpZCArICIgfCBhd2sgJ3sgc3BsaXQoJDIsIGdpZCwgXCI9XCIpOyBpZihnaWRbMV09PVwiZ2lkXCIpIHsgc3BsaXQoZ2lkWzJdLCBnaWRudW0sIFwiKFwiKTsgcHJpbnQgZ2lkbnVtWzFdOyAgfSB9J1xuZXhpdFxuIik7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nZXRVc2VybmFtZSA9IGZ1bmN0aW9uIGdldFVzZXJuYW1lKHVpZCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoImRzY2wgLiBsaXN0IC9Vc2VycyBVbmlxdWVJRCB8IGdyZXAgIiArIHVpZCArICIgfCBhd2sgJ3sgaWYoJDI9PSIgKyB1aWQgKyAiKXsgcHJpbnQgJDEgfX0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKICAgICAgICAgICAgaWYoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCd1aWQ6ICcgKyB1aWQgKyAnIG5vdCBmb3VuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB0aGlzLmNvbnNvbGVVaWQgPSBmdW5jdGlvbiBjb25zb2xlVWlkKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hvIHwgdHIgJ1xuJyAnXC4nIHwgYXdrICd7IHByaW50ICQxIH0nXG5leGl0XG4iKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciByZXQgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsKICAgICAgICAgICAgaWYgKHJldCAhPSAnJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldFVpZChyZXQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyAoJ25vYm9keSBsb2dnZWQgaW50byBjb25zb2xlJyk7ICAgICAKICAgICAgICB9CiAgICAgICAgdGhpcy5nZXRIb21lRm9sZGVyID0gZnVuY3Rpb24gZ2V0SG9tZUZvbGRlcih1c2VyKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJkc2NsIC4gLXJlYWQgL1VzZXJzLyIgKyB1c2VyICsgIiB8IGdyZXAgTkZTSG9tZURpcmVjdG9yeSB8IGF3ayAtRjogJ3sgcHJpbnQgJDIgfSdcbmV4aXRcbiIpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgIT0gJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGhyb3cgKCd1c2VyOiAnICsgdXNlciArICcgbm90IGZvdW5kJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHRoaXMuX3VzZXJzID0gZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vZHNjbCcsIFsnZHNjbCcsICcuJywgJ2xpc3QnLCAnL1VzZXJzJywgJ1VuaXF1ZUlEJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsKICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdleGl0XG4nKTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICB2YXIgdG9rZW5zLCBpOwogICAgICAgICAgICB2YXIgdXNlcnMgPSB7fTsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgIGlmICh0b2tlbnNbMF0pIHsgdXNlcnNbdG9rZW5zWzBdXSA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07IH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICh1c2Vycyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3VpZHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vZHNjbCcsIFsnZHNjbCcsICcuJywgJ2xpc3QnLCAnL1VzZXJzJywgJ1VuaXF1ZUlEJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2V4aXRcbicpOwogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgICAgICAgICAgdmFyIGxpbmVzID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgdmFyIHRva2VucywgaTsKICAgICAgICAgICAgdmFyIHVzZXJzID0ge307CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICBpZiAodG9rZW5zWzBdKSB7IHVzZXJzW3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1dID0gdG9rZW5zWzBdOyB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAodXNlcnMpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9pZFRhYmxlID0gZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHRhYmxlID0ge307CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vaWQnLCBbJ2lkJ10pOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7CiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsKCiAgICAgICAgICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xuJylbMF0uc3BsaXQoJyAnKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgdmFyIHR5cGVzID0gbGluZXNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgIHZhciB0b2tlbnMg", 16000); + memcpy_s(_usersessions + 48000, 4508, "PSB0eXBlc1sxXS5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgdGFibGVbdHlwZXNbMF1dID0ge307CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaiBpbiB0b2tlbnMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWRhcnIgPSB0b2tlbnNbal0uc3BsaXQoJygnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBpZGFyclswXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGlkYXJyWzFdLnN1YnN0cmluZygwLCBpZGFyclsxXS5sZW5ndGggLSAxKS50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgdGFibGVbdHlwZXNbMF1dW25hbWVdID0gaWQ7CiAgICAgICAgICAgICAgICAgICAgdGFibGVbdHlwZXNbMF1dW2lkXSA9IG5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh0YWJsZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuQ3VycmVudCA9IGZ1bmN0aW9uIChjYikKICAgICAgICB7CiAgICAgICAgICAgIHZhciB1c2VycyA9IHt9OwogICAgICAgICAgICB2YXIgdGFibGUgPSB0aGlzLl9pZFRhYmxlKCk7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL3Vzci9iaW4vbGFzdCcsIFsnbGFzdCddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgICAgICAgICB2YXIgbGluZXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcbicpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aCAmJiBsaW5lc1tpXS5sZW5ndGggPiAwOyArK2kpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghdXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB1c2Vyc1tsaW5lc1tpXS5zcGxpdCgnICcpWzBdXSA9IHsgVXNlcm5hbWU6IGxpbmVzW2ldLnNwbGl0KCcgJylbMF0sIFN0YXRlOiBsaW5lc1tpXS5zcGxpdCgnc3RpbGwgbG9nZ2VkIGluJykubGVuZ3RoID4gMSA/ICdBY3RpdmUnIDogJ0luYWN0aXZlJywgdWlkOiB0YWJsZS51aWRbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkKICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKHVzZXJzW2xpbmVzW2ldLnNwbGl0KCcgJylbMF1dLlN0YXRlICE9ICdBY3RpdmUnICYmIGxpbmVzW2ldLnNwbGl0KCdzdGlsbCBsb2dnZWQgaW4nKS5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNbbGluZXNbaV0uc3BsaXQoJyAnKVswXV0uU3RhdGUgPSAnQWN0aXZlJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1c2VycywgJ0FjdGl2ZScsIHsgdmFsdWU6IHNob3dBY3RpdmVPbmx5KHVzZXJzKSB9KTsKICAgICAgICAgICAgaWYgKGNiKSB7IGNiLmNhbGwodGhpcywgdXNlcnMpOyB9CiAgICAgICAgfQogICAgfQoKICAgIGlmKHByb2Nlc3MucGxhdGZvcm0gIT0gJ3dpbjMyJykgLy8gTGludXgsIE1hY09TLCBGcmVlQlNECiAgICB7CiAgICAgICAgdGhpcy5TZWxmID0gZnVuY3Rpb24gU2VsZigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy91c3IvYmluL2lkJywgWydpZCcsICctdSddKTsKICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOwogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoY2hpbGQuc3Rkb3V0LnN0cikpOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzUm9vdCA9IGZ1bmN0aW9uIGlzUm9vdCgpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuU2VsZigpID09IDApOwogICAgICAgIH0KICAgIH0KCgp9CmZ1bmN0aW9uIHNob3dBY3RpdmVPbmx5KHNvdXJjZSkKewogICAgdmFyIHJldFZhbCA9IFtdOwogICAgdmFyIHVuaXF1ZSA9IHt9OwogICAgdmFyIHVzZXJuYW1lcyA9IFtdOwogICAgdmFyIHRtcDsKCiAgICBmb3IgKHZhciBpIGluIHNvdXJjZSkKICAgIHsKICAgICAgICBpZiAoc291cmNlW2ldLlN0YXRlID09ICdBY3RpdmUnKQogICAgICAgIHsKICAgICAgICAgICAgcmV0VmFsLnB1c2goc291cmNlW2ldKTsKICAgICAgICAgICAgdG1wID0gKHNvdXJjZVtpXS5Eb21haW4gPyAoc291cmNlW2ldLkRvbWFpbiArICdcXCcpIDogJycpICsgc291cmNlW2ldLlVzZXJuYW1lOwogICAgICAgICAgICBpZiAoIXVuaXF1ZVt0bXBdKSB7IHVuaXF1ZVt0bXBdID0gdG1wO30KICAgICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSBpbiB1bmlxdWUpCiAgICB7CiAgICAgICAgdXNlcm5hbWVzLnB1c2goaSk7CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldFZhbCwgJ3VzZXJuYW1lcycsIHsgdmFsdWU6IHVzZXJuYW1lcyB9KTsKICAgIHJldHVybiAocmV0VmFsKTsKfQpmdW5jdGlvbiBnZXRUb2tlbnMoc3RyKQp7CiAgICB2YXIgY29sdW1ucyA9IFtdOwogICAgdmFyIGk7CgogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoMCwgKGk9c3RyLmluZGV4T2YoJyAnKSkpKTsKICAgIHdoaWxlIChzdHJbKytpXSA9PSAnICcpOwogICAgY29sdW1ucy5wdXNoKHN0ci5zdWJzdHJpbmcoaSwgKGk9c3RyLnN1YnN0cmluZyhpKS5pbmRleE9mKCcgJykgKyBpKSkpOwogICAgd2hpbGUgKHN0clsrK2ldID09ICcgJyk7CiAgICBjb2x1bW5zLnB1c2goc3RyLnN1YnN0cmluZyhpLCAoaT1zdHIuc3Vic3RyaW5nKGkpLmluZGV4T2YoJyAnKSArIGkpKSk7CiAgICB3aGlsZSAoc3RyWysraV0gPT0gJyAnKTsKICAgIHZhciBzdGF0dXMgPSBzdHIuc3Vic3RyaW5nKGkpLnRyaW0oKTsKICAgIGNvbHVtbnMucHVzaChzdGF0dXMpOwoKICAgIHJldHVybiAoY29sdW1ucyk7Cn0KCm1vZHVsZS5leHBvcnRzID0gbmV3IFVzZXJTZXNzaW9ucygpOwo=", 4508); + ILibBase64DecodeEx((unsigned char*)_usersessions, 52508, (unsigned char*)_usersessions + 52508); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "user-sessions"); duk_push_string(ctx, _usersessions + 52508); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_usersessions); diff --git a/modules/linux-gnome-helpers.js b/modules/linux-gnome-helpers.js new file mode 100644 index 0000000..c5500ce --- /dev/null +++ b/modules/linux-gnome-helpers.js @@ -0,0 +1,38 @@ + + +function gnome_getProxySettings(uid) +{ + var child = require('child_process').execFile('/bin/sh', ['sh'], { env: { HOME: require('user-sessions').getHomeFolder(uid) }}); + child.stderr.str = ''; child.stderr.on('data', function (c) { }); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + + child.stdin.write('gsettings list-recursively org.gnome.system.proxy | tr "\\n" "\\|" | tr "\\\'" "\\`" | awk \'{ count=split($0, res, "|");') + child.stdin.write('for(a=0;a= 0 ? parseInt(child.stdout.str.trim()) : 500); + } this._users = function _users() { var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); - child.stdin.write('awk -F: \'($3 >= 0) {printf "%s:%s\\n", $1, $3}\' /etc/passwd\nexit\n'); + child.stdin.write("getent passwd | awk -F: '{ if($3>=0) { printf \"%s:%s\\n\", $1, $3; } }'\nexit\n"); child.waitExit(); var lines = child.stdout.str.split('\n'); @@ -534,7 +543,7 @@ function UserSessions() var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); - child.stdin.write('awk -F: \'($3 >= 0) {printf "%s:%s\\n", $1, $3}\' /etc/passwd\nexit\n'); + child.stdin.write("getent passwd | awk -F: '{ if($3>=0) { printf \"%s:%s\\n\", $1, $3; } }'\nexit\n"); child.waitExit(); var lines = child.stdout.str.split('\n'); @@ -568,12 +577,21 @@ function UserSessions() throw ('nobody logged into console'); } + this.getHomeFolder = function getHomeFolder(id) + { + var child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; + child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stdin.write("getent passwd " + id + " | awk -F: '{print $6}'\nexit\n"); + child.waitExit(); + return (child.stdout.str.trim()); + } this.getUid = function getUid(username) { var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); - child.stdin.write("cat /etc/passwd | awk -F: '($1==\"" + username + "\"){print $3}'\nexit\n"); + child.stdin.write("getent passwd \"" + username + "\" | awk -F: '{print $3}'\nexit\n"); child.waitExit(); var ret = parseInt(child.stdout.str); @@ -585,7 +603,7 @@ function UserSessions() var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); - child.stdin.write("cat /etc/passwd | awk -F: '($3==" + uid + "){print $1}'\nexit\n"); + child.stdin.write("getent passwd " + uid + " | awk -F: '{print $1}'\nexit\n"); child.waitExit(); if (child.stdout.str.length > 0) { return (child.stdout.str.trim()); } throw ('uid: ' + uid + ' NOT FOUND');