From eaf4d408a8a1aac73d34f15a2732a9d5332df5b6 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Mon, 11 Feb 2019 17:43:41 -0800 Subject: [PATCH] Updated linux clipboard --- microscript/ILibDuktape_Polyfills.c | 2 +- modules/clipboard.js | 86 ++++++++++++++++++++++++++++- modules/monitor-info.js | 1 + 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 2f79b19..df06483 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1864,7 +1864,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('http-digest', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KDQp2YXIgd3JpdGFibGUgPSByZXF1aXJlKCdzdHJlYW0nKS5Xcml0YWJsZTsNCnZhciBtZDUgPSByZXF1aXJlKCdNRDVTdHJlYW0nKS5jcmVhdGUoKTsNCg0KZnVuY3Rpb24gY2hlY2tFdmVudEZvcndhcmRpbmcoZGlnZXN0UmVxdWVzdCwgZXZlbnROYW1lKQ0Kew0KICAgIGlmIChkaWdlc3RSZXF1ZXN0Lmxpc3RlbmVyQ291bnQoZXZlbnROYW1lKSA+IDApDQogICAgew0KICAgICAgICB2YXIgZUZvcndhcmQgPSBmdW5jdGlvbiBfZUZvcndhcmQoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgcCA9IFtlRm9yd2FyZC5fZXZlbnROYW1lXTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7IHAucHVzaChhcmd1bWVudHNbaV0pOyB9DQogICAgICAgICAgICBfZUZvcndhcmQuX2RpZ2VzdFJlcXVlc3QuZW1pdC5hcHBseShfZUZvcndhcmQuX2RpZ2VzdFJlcXVlc3QsIHApOw0KICAgICAgICB9Ow0KICAgICAgICBlRm9yd2FyZC5fZXZlbnROYW1lID0gZXZlbnROYW1lOw0KICAgICAgICBlRm9yd2FyZC5fZGlnZXN0UmVxdWVzdCA9IGRpZ2VzdFJlcXVlc3Q7DQogICAgICAgIGRpZ2VzdFJlcXVlc3QuX3JlcXVlc3Qub24oZXZlbnROYW1lLCBlRm9yd2FyZCk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBnZW5lcmF0ZUF1dGhIZWFkZXJzKGltc2csIG9wdGlvbnMsIGRpZ2VzdCkNCnsNCiAgICB2YXIgYXV0aDsNCg0KICAgIGlmIChpbXNnICE9IG51bGwpDQogICAgew0KICAgICAgICBhdXRoID0geyByZWFsbTogbnVsbCwgbm9uY2U6IG51bGwsIG9wYXF1ZTogbnVsbCwgcW9wOiBudWxsIH07DQogICAgICAgIHZhciB3d3cgPSBpbXNnLmhlYWRlcnNbJ1dXVy1BdXRoZW50aWNhdGUnXTsNCiAgICAgICAgdmFyIHRva2VucyA9IHd3dy5zcGxpdCgnLCcpOw0KDQogICAgICAgIHZhciBwYWlyczsNCiAgICAgICAgZm9yICh2YXIgaSBpbiB0b2tlbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHBhaXJzID0gdG9rZW5zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgICAgICBpZiAocGFpcnMubGVuZ3RoID09IDIpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChwYWlyc1swXS50b0xvd2VyQ2FzZSgpLnRyaW0oKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RpZ2VzdCByZWFsbSc6DQogICAgICAgICAgICAgICAgICAgICAgICBhdXRoLnJlYWxtID0gcGFpcnNbMV07DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aC5yZWFsbVswXSA9PSAnIicpIHsgYXV0aC5yZWFsbSA9IGF1dGgucmVhbG0uc3Vic3RyaW5nKDEsIGF1dGgucmVhbG0ubGVuZ3RoIC0gMSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdub25jZSc6DQogICAgICAgICAgICAgICAgICAgICAgICBhdXRoLm5vbmNlID0gcGFpcnNbMV07DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aC5ub25jZVswXSA9PSAnIicpIHsgYXV0aC5ub25jZSA9IGF1dGgubm9uY2Uuc3Vic3RyaW5nKDEsIGF1dGgubm9uY2UubGVuZ3RoIC0gMSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdvcGFxdWUnOg0KICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC5vcGFxdWUgPSBwYWlyc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoLm9wYXF1ZVswXSA9PSAnIicpIHsgYXV0aC5vcGFxdWUgPSBhdXRoLm9wYXF1ZS5zdWJzdHJpbmcoMSwgYXV0aC5vcGFxdWUubGVuZ3RoIC0gMSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdxb3AnOg0KICAgICAgICAgICAgICAgICAgICAgICAgYXV0aC5xb3AgPSBwYWlyc1sxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoLnFvcFswXSA9PSAnIicpIHsgYXV0aC5xb3AgPSBhdXRoLnFvcC5zdWJzdHJpbmcoMSwgYXV0aC5xb3AubGVuZ3RoIC0gMSk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBkaWdlc3QuX2F1dGggPSBhdXRoOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAoIShhdXRoID0gZGlnZXN0Ll9hdXRoKSkgeyByZXR1cm47IH0NCiAgICB9DQoNCiAgICB2YXIgc3RlcDEgPSBkaWdlc3QuX29wdGlvbnMudXNlcm5hbWUgKyAnOicgKyBhdXRoLnJlYWxtICsgJzonICsgZGlnZXN0Ll9vcHRpb25zLnBhc3N3b3JkOw0KICAgIGF1dGguc3RlcDEgPSBtZDUuc3luY0hhc2goc3RlcDEpLnRvU3RyaW5nKCdoZXgnKS50b0xvd2VyQ2FzZSgpOw0KDQogICAgdmFyIHN0ZXAyID0gb3B0aW9ucy5tZXRob2QgKyAnOicgKyBvcHRpb25zLnBhdGg7DQogICAgYXV0aC5zdGVwMiA9IG1kNS5zeW5jSGFzaChzdGVwMikudG9TdHJpbmcoJ2hleCcpLnRvTG93ZXJDYXNlKCk7DQoNCg0KICAgIGlmIChhdXRoLnFvcCA9PSBudWxsKQ0KICAgIHsNCiAgICAgICAgdmFyIHN0ZXAzID0gYXV0aC5zdGVwMSArICc6JyArIGF1dGgubm9uY2UgKyAnOicgKyBhdXRoLnN0ZXAyOw0KICAgICAgICBhdXRoLnN0ZXAzID0gbWQ1LnN5bmNIYXNoKHN0ZXAzKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgZGlnZXN0Ll9OQyArPSAxOwogICAgICAgIHZhciBzdGVwMyA9IGF1dGguc3RlcDEgKyAnOicgKyBhdXRoLm5vbmNlICsgJzonICsgZGlnZXN0Ll9OQy50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKS5wYWRTdGFydCg4LCAnMCcpICsgJzonICsgZGlnZXN0Ll9DTk9OQ0UgKyAnOicgKyBhdXRoLnFvcCArICc6JyArIGF1dGguc3RlcDI7CiAgICAgICAgYXV0aC5zdGVwMyA9IG1kNS5zeW5jSGFzaChzdGVwMykudG9TdHJpbmcoJ2hleCcpLnRvTG93ZXJDYXNlKCk7DQogICAgfQ0KDQogICAgdmFyIHJldCA9ICdEaWdlc3QgdXNlcm5hbWU9IicgKyBkaWdlc3QuX29wdGlvbnMudXNlcm5hbWUgKyAnIixyZWFsbT0iJyArIGF1dGgucmVhbG0gKyAnIixub25jZT0iJyArIGF1dGgubm9uY2UgKyAnIix1cmk9IicgKyBvcHRpb25zLnBhdGggKyAnIic7DQogICAgaWYgKGF1dGgub3BhcXVlICE9IG51bGwpIHsgcmV0ICs9ICgnLG9wYXF1ZT0iJyArIGF1dGgub3BhcXVlICsgJyInKTsgfQ0KICAgIHJldCArPSAoJyxyZXNwb25zZT0iJyArIGF1dGguc3RlcDMgKyAnIicpOw0KDQogICAgaWYgKGF1dGgucW9wICE9IG51bGwpDQogICAgew0KICAgICAgICByZXQgKz0gKCcscW9wPSInICsgYXV0aC5xb3AgKyAnIixuYz0iJyArIGRpZ2VzdC5fTkMudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCkucGFkU3RhcnQoOCwgJzAnKSArICciLGNub25jZT0iJyArIGRpZ2VzdC5fQ05PTkNFICsgJyInKTsNCiAgICB9DQoNCg0KICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7IG9wdGlvbnMuaGVhZGVycyA9IHt9OyB9DQogICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSByZXQ7DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBodHRwX2RpZ2VzdCgpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAiaHR0cC1kaWdlc3QiOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24oKQ0KICAgIHsNCiAgICAgICAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PSAxICYmIHR5cGVvZihhcmd1bWVudHNbMF0gPT0gJ29iamVjdCcpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gKG5ldyBodHRwX2RpZ2VzdF9pbnN0YW5jZShhcmd1bWVudHNbMF0pKTsNCiAgICAgICAgfQ0KICAgICAgICBpZihhcmd1bWVudHMubGVuZ3RoID09IDIgJiYgdHlwZW9mKGFyZ3VtZW50c1swXSkgPT0gJ3N0cmluZycgJiYgdHlwZW9mKGFyZ3VtZW50c1sxXSkgPT0gJ3N0cmluZycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiAobmV3IGh0dHBfZGlnZXN0X2luc3RhbmNlKHt1c2VybmFtZTogYXJndW1lbnRzWzBdLCBwYXNzd29yZDogYXJndW1lbnRzWzFdfSkpOw0KICAgICAgICB9DQogICAgICAgIHRocm93ICgnSW52YWxpZCBQYXJhbWV0ZXJzJyk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBodHRwX2RpZ2VzdF9pbnN0YW5jZShvcHRpb25zKQ0Kew0KICAgIHRoaXMuX09iamVjdElEID0gJ2h0dHAtZGlnZXN0Lmluc3RhbmNlJzsNCiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9uczsNCiAgICB0aGlzLmh0dHAgPSBudWxsOw0KICAgIHRoaXMuX05DID0gMDsNCiAgICB0aGlzLl9DTk9OQ0UgPSByZXF1aXJlKCdodHRwJykuZ2VuZXJhdGVOb25jZSgxNik7DQoNCiAgICB0aGlzLmdldCA9IGZ1bmN0aW9uKHVyaSkNCiAgICB7DQogICAgICAgIHJldHVybiAodGhpcy5yZXF1ZXN0KHVyaSkpOw0KICAgIH0NCiAgICB0aGlzLnJlcXVlc3QgPSBmdW5jdGlvbiAocGFyMSkNCiAgICB7DQogICAgICAgIHZhciBjYWxsZW5kID0gZmFsc2U7DQogICAgICAgIHZhciByZXQgPSBuZXcgd3JpdGFibGUoDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIChjaHVuaywgZmx1c2gpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZW5kZWQpIHsgdGhyb3cgKCdTdHJlYW0gYWxyZWFkeSBlbmRlZCcpOyB9DQogICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLl9idWZmZXJlZCkgDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlcmVkID0gQnVmZmVyLmFsbG9jKGNodW5rLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5jb3B5KHRoaXMuX2J1ZmZlcmVkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlcmVkID0gQnVmZmVyLmNvbmNhdChbdGhpcy5fYnVmZmVyZWQsIGNodW5rXSwgdGhpcy5fYnVmZmVyZWQubGVuZ3RoICsgY2h1bmsubGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0KSB7IHRoaXMuX3JlcXVlc3Qud3JpdGUoY2h1bmspOyB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmbHVzaCAhPSBudWxsKSB7IGZsdXNoKCk7IH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIGZpbmFsOiBmdW5jdGlvbiAoZmx1c2gpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZW5kZWQpIHsgdGhyb3cgKCdTdHJlYW0gYWxyZWFkeSBlbmRlZCcpOyB9DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3QpIHsgdGhpcy5fcmVxdWVzdC5lbmQoKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2ggIT0gbnVsbCkgeyBmbHVzaCgpOyB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIHJldC5fYnVmZmVyZWQgPSBudWxsOw0KICAgICAgICByZXQuX2VuZGVkID0gZmFsc2U7DQogICAgICAgIHN3aXRjaCAodHlwZW9mIChwYXIxKSkNCiAgICAgICAgew0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVyJyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdzdHJpbmcnOg0KICAgICAgICAgICAgICAgIHJldC5vcHRpb25zID0gdGhpcy5odHRwLnBhcnNlVXJpKHBhcjEpOw0KICAgICAgICAgICAgICAgIGNhbGxlbmQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzoNCiAgICAgICAgICAgICAgICByZXQub3B0aW9ucyA9IHBhcjE7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdyZXNwb25zZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2Vycm9yJykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgndXBncmFkZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2NvbnRpbnVlJykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgndGltZW91dCcpOw0KICAgICAgICByZXQuX2RpZ2VzdCA9IHRoaXM7DQoNCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiAoYXJndW1lbnRzWzFdKSA9PSAnZnVuY3Rpb24nKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXQub25jZSgncmVzcG9uc2UnLCBhcmd1bWVudHNbMV0pOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8NCiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGFkZCBBdXRoSGVhZGVycyBub3cNCiAgICAgICAgLy8NCiAgICAgICAgZ2VuZXJhdGVBdXRoSGVhZGVycyhudWxsLCByZXQub3B0aW9ucywgdGhpcyk7DQoNCiAgICAgICAgLy8gV2hlbiBzb21lYm9keSBob29rcyB1cCBldmVudHMgdG8gZGlnZXN0LmNsaWVudFJlcXVlc3QsIHdlIG5lZWQgdG8gaG9vayB0aGUgcmVhbCBldmVudCBvbiBodHRwLmNsaWVudFJlcXVlc3QNCiAgICAgICAgcmV0Ll9yZXF1ZXN0ID0gdGhpcy5odHRwLnJlcXVlc3QocmV0Lm9wdGlvbnMpOw0KICAgICAgICByZXQuX3JlcXVlc3QuZGlnUmVxdWVzdCA9IHJldDsNCiAgICAgICAgcmV0Lm9uKCdfZXZlbnRIb29rJywgZnVuY3Rpb24gKGV2TmFtZSwgY2FsbGJhY2spDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChldk5hbWUgIT0gJ3VwZ3JhZGUnICYmIGV2TmFtZSAhPSAnZXJyb3InICYmIGV2TmFtZSAhPSAnY29udGludWUnICYmIGV2TmFtZSAhPSAndGltZW91dCcgJiYgZXZOYW1lICE9ICdkcmFpbicpIHsgcmV0dXJuOyB9DQogICAgICAgICAgICBpZiAodGhpcy5fcmVxdWVzdC5saXN0ZW5lckNvdW50KGV2TmFtZSkgPT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgZXZTaW5rID0gZnVuY3Rpb24gX2V2U2luaygpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcGFybXMgPSBbX2V2U2luay5ldmVudE5hbWVdOw0KICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7KytpKSB7cGFybXMucHVzaChhcmd1bWVudHNbaV0pO30NCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0LmVtaXQuYXBwbHkodGhpcy5kaWdSZXF1ZXN0LCBwYXJtcyk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICBldlNpbmsuZXZlbnROYW1lID0gZXZOYW1lOw0KICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3Qub24oZXZOYW1lLCBldlNpbmspOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICByZXQuX3JlcXVlc3Qub25jZSgncmVzcG9uc2UnLCBmdW5jdGlvbiAoaW1zZykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGltc2cuc3RhdHVzQ29kZSA9PSA0MDEpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNhbGxlbmQgPSB0aGlzLmRpZ1JlcXVlc3QuX3JlcXVlc3QuX2NhbGxlbmQ7DQogICAgICAgICAgICAgICAgdmFyIGF1dGggPSBnZW5lcmF0ZUF1dGhIZWFkZXJzKGltc2csIHRoaXMuZGlnUmVxdWVzdC5vcHRpb25zLCB0aGlzLmRpZ1JlcXVlc3QuX2RpZ2VzdCk7DQoNCiAgICAgICAgICAgICAgICB0aGlzLmRpZ1JlcXVlc3QuX3JlcXVlc3QgPSB0aGlzLmRpZ1JlcXVlc3QuX2RpZ2VzdC5odHRwLnJlcXVlc3QodGhpcy5kaWdSZXF1ZXN0Lm9wdGlvbnMpOw0KICAgICAgICAgICAgICAgIHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdC5kaWdSZXF1ZXN0ID0gdGhpcy5kaWdSZXF1ZXN0Ow0KICAgICAgICAgICAgICAgIHRoaXMuZGlnUmVxdWVzdC5fcmVxdWVzdC5vbmNlKCdyZXNwb25zZScsIGZ1bmN0aW9uIChpbXNnKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGltc2cuc3RhdHVzQ29kZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDE6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0LmVtaXQoJ2Vycm9yJywgJ0RpZ2VzdCBmYWlsZWQgdG9vIG1hbnkgdGltZXMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0LmVtaXQoJ3Jlc3BvbnNlJywgaW1zZyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBjaGVja0V2ZW50Rm9yd2FyZGluZyh0aGlzLmRpZ1JlcXVlc3QsICd1cGdyYWRlJyk7DQogICAgICAgICAgICAgICAgY2hlY2tFdmVudEZvcndhcmRpbmcodGhpcy5kaWdSZXF1ZXN0LCAnZXJyb3InKTsNCiAgICAgICAgICAgICAgICBjaGVja0V2ZW50Rm9yd2FyZGluZyh0aGlzLmRpZ1JlcXVlc3QsICdjb250aW51ZScpOw0KICAgICAgICAgICAgICAgIGNoZWNrRXZlbnRGb3J3YXJkaW5nKHRoaXMuZGlnUmVxdWVzdCwgJ3RpbWVvdXQnKTsNCiAgICAgICAgICAgICAgICBjaGVja0V2ZW50Rm9yd2FyZGluZyh0aGlzLmRpZ1JlcXVlc3QsICdkcmFpbicpOw0KICAgICAgICAgICAgICAgIGlmIChjYWxsZW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWdSZXF1ZXN0Ll9yZXF1ZXN0LmVuZCgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaWdSZXF1ZXN0Ll9idWZmZXJlZCkgeyB0aGlzLmRpZ1JlcXVlc3QuX3JlcXVlc3Qud3JpdGUodGhpcy5kaWdSZXF1ZXN0Ll9idWZmZXJlZCk7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlnUmVxdWVzdC5fZW5kZWQpIHsgdGhpcy5kaWdSZXF1ZXN0Ll9yZXF1ZXN0LmVuZCgpOyB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuZGlnUmVxdWVzdC5lbWl0KCdyZXNwb25zZScsIGltc2cpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgaWYgKGNhbGxlbmQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldC5fcmVxdWVzdC5fY2FsbGVuZCA9IHRydWU7IHJldC5fcmVxdWVzdC5lbmQoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChyZXQuX2J1ZmZlcmVkKSB7IHJldC5fcmVxdWVzdC53cml0ZShyZXQuX2J1ZmZlcmVkKTsgfQ0KICAgICAgICAgICAgaWYgKHJldC5fZW5kZWQpIHsgcmV0Ll9yZXF1ZXN0LmVuZCgpOyB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH07DQp9DQoNCg0KbW9kdWxlLmV4cG9ydHMgPSBuZXcgaHR0cF9kaWdlc3QoKTsNCg0K', 'base64').toString());"); // Clipboard. Refer to /modules folder for a human readable version - duk_peval_string_noresult(ctx, "addModule('clipboard', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgpmdW5jdGlvbiBuYXRpdmVBZGRNb2R1bGUobmFtZSkKewogICAgdmFyIHZhbHVlID0gZ2V0SlNNb2R1bGUobmFtZSk7CiAgICB2YXIgcmV0ID0gImR1a19wZXZhbF9zdHJpbmdfbm9yZXN1bHQoY3R4LCBcImFkZE1vZHVsZSgnIiArIG5hbWUgKyAiJywgQnVmZmVyLmZyb20oJyIgKyBCdWZmZXIuZnJvbSh2YWx1ZSkudG9TdHJpbmcoJ2Jhc2U2NCcpICsgIicsICdiYXNlNjQnKS50b1N0cmluZygpKTtcIik7IjsKICAgIG1vZHVsZS5leHBvcnRzKHJldCk7Cn0KCgpmdW5jdGlvbiB3aW5fcmVhZHRleHQoKQp7CiAgICB2YXIgcmV0ID0gJyc7CiAgICB2YXIgQ0ZfVEVYVCA9IDE7CiAgICB2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsKICAgIHZhciB1c2VyMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgndXNlcjMyLmRsbCcpOwogICAgdmFyIGtlcm5lbDMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ2tlcm5lbDMyLmRsbCcpOwogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHbG9iYWxBbGxvYycpOwogICAga2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdHbG9iYWxMb2NrJyk7CiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dsb2JhbFVubG9jaycpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnT3BlbkNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VDbGlwYm9hcmQnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ0dldENsaXBib2FyZERhdGEnKTsKCiAgICB1c2VyMzIuT3BlbkNsaXBib2FyZCgwKTsKICAgIHZhciBoID0gdXNlcjMyLkdldENsaXBib2FyZERhdGEoQ0ZfVEVYVCk7CiAgICBpZihoLlZhbCE9MCkKICAgIHsKICAgICAgICB2YXIgaGJ1ZmZlciA9IGtlcm5lbDMyLkdsb2JhbExvY2soaCk7CiAgICAgICAgcmV0ID0gaGJ1ZmZlci5TdHJpbmc7CiAgICAgICAga2VybmVsMzIuR2xvYmFsVW5sb2NrKGgpOwogICAgfQogICAgdXNlcjMyLkNsb3NlQ2xpcGJvYXJkKCk7CiAgICByZXR1cm4gKHJldCk7Cn0KCmZ1bmN0aW9uIHdpbl9jb3B5dGV4dCh0eHQpCnsKICAgIHZhciBHTUVNX01PVkVBQkxFID0gMHgwMDAyOwogICAgdmFyIENGX1RFWFQgPSAxOwoKICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgdmFyIHVzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCd1c2VyMzIuZGxsJyk7CiAgICB2YXIga2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7CiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dsb2JhbEFsbG9jJyk7CiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dsb2JhbExvY2snKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsVW5sb2NrJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdPcGVuQ2xpcGJvYXJkJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdFbXB0eUNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VDbGlwYm9hcmQnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ1NldENsaXBib2FyZERhdGEnKTsKCiAgICB2YXIgaCA9IGtlcm5lbDMyLkdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIHR4dC5sZW5ndGggKyAyKTsKICAgIGguYXV0b0ZyZWUoZmFsc2UpOwogICAgdmFyIGhidWZmZXIgPSBrZXJuZWwzMi5HbG9iYWxMb2NrKGgpOwogICAgaGJ1ZmZlci5hdXRvRnJlZShmYWxzZSk7CiAgICB2YXIgdG1wID0gQnVmZmVyLmFsbG9jKHR4dC5sZW5ndGggKyAxKTsKICAgIEJ1ZmZlci5mcm9tKHR4dCkuY29weSh0bXApOwogICAgdG1wLmNvcHkoaGJ1ZmZlci5EZXJlZigwLCB0eHQubGVuZ3RoICsgMSkudG9CdWZmZXIoKSk7CiAgICBrZXJuZWwzMi5HbG9iYWxVbmxvY2soaCk7CgogICAgdXNlcjMyLk9wZW5DbGlwYm9hcmQoMCk7CiAgICB1c2VyMzIuRW1wdHlDbGlwYm9hcmQoKTsKICAgIHVzZXIzMi5TZXRDbGlwYm9hcmREYXRhKENGX1RFWFQsIGgpOwogICAgdXNlcjMyLkNsb3NlQ2xpcGJvYXJkKCk7Cn0KCnN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQp7CiAgICBjYXNlICd3aW4zMic6CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB3aW5fY29weXRleHQ7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMucmVhZCA9IHdpbl9yZWFkdGV4dDsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2Rhcndpbic6CiAgICAgICAgYnJlYWs7Cn0KbW9kdWxlLmV4cG9ydHMubmF0aXZlQWRkTW9kdWxlID0gbmF0aXZlQWRkTW9kdWxlO/==', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('clipboard', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwoKZnVuY3Rpb24gbmF0aXZlQWRkTW9kdWxlKG5hbWUpCnsKICAgIHZhciB2YWx1ZSA9IGdldEpTTW9kdWxlKG5hbWUpOwogICAgdmFyIHJldCA9ICJkdWtfcGV2YWxfc3RyaW5nX25vcmVzdWx0KGN0eCwgXCJhZGRNb2R1bGUoJyIgKyBuYW1lICsgIicsIEJ1ZmZlci5mcm9tKCciICsgQnVmZmVyLmZyb20odmFsdWUpLnRvU3RyaW5nKCdiYXNlNjQnKSArICInLCAnYmFzZTY0JykudG9TdHJpbmcoKSk7XCIpOyI7CiAgICBtb2R1bGUuZXhwb3J0cyhyZXQpOwp9CgpmdW5jdGlvbiBsaW5fcmVhZHRleHQoKQp7CiAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKHJlcywgcmVqKSB7IHRoaXMuX3JlcyA9IHJlczsgdGhpcy5fcmVqID0gcmVqOyB9KTsKICAgIHRyeQogICAgewogICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpDQogICAgfQogICAgY2F0Y2goZXhjKQogICAgew0KICAgICAgICByZXQuX3JlaihleGMpOw0KICAgICAgICByZXR1cm4gKHJldCk7DQogICAgfQoKICAgIHZhciBYMTEgPSByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExOwogICAgaWYgKCFYMTEpCiAgICB7DQogICAgICAgIHJldC5fcmVqKCdYMTEgcmVxdWlyZWQgZm9yIENsaXBib2FyZCBNYW5pcHVsYXRpb24nKTsNCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIFNlbGVjdGlvbk5vdGlmeSA9IDMxOwogICAgICAgIHZhciBBbnlQcm9wZXJ0eVR5cGUgPSAwOwogICAgICAgIHZhciBHTSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9nbTsKCiAgICAgICAgcmV0Ll9nZXRJbmZvUHJvbWlzZSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldEluZm8oKTsKICAgICAgICByZXQuX2dldEluZm9Qcm9taXNlLl9tYXN0ZXJQcm9taXNlID0gcmV0OwogICAgICAgIHJldC5fZ2V0SW5mb1Byb21pc2UudGhlbihmdW5jdGlvbiAobW9uKQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChtb24ubGVuZ3RoID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgd2hpdGUgPSBYMTEuWFdoaXRlUGl4ZWwobW9uWzBdLmRpc3BsYXksIG1vblswXS5zY3JlZW5JZCkuVmFsOw0KDQogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5DTElQSUQgPSBYMTEuWEludGVybkF0b20obW9uWzBdLmRpc3BsYXksIEdNLkNyZWF0ZVZhcmlhYmxlKCdDTElQQk9BUkQnKSwgMCk7DQogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5GTVRJRCA9IFgxMS5YSW50ZXJuQXRvbShtb25bMF0uZGlzcGxheSwgR00uQ3JlYXRlVmFyaWFibGUoJ1VURjhfU1RSSU5HJyksIDApOw0KICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuUFJPUElEID0gWDExLlhJbnRlcm5BdG9tKG1vblswXS5kaXNwbGF5LCBHTS5DcmVhdGVWYXJpYWJsZSgnWFNFTF9EQVRBJyksIDApOw0KICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuSU5DUklEID0gWDExLlhJbnRlcm5BdG9tKG1vblswXS5kaXNwbGF5LCBHTS5DcmVhdGVWYXJpYWJsZSgnSU5DUicpLCAwKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLlJPT1RXSU4gPSBYMTEuWFJvb3RXaW5kb3cobW9uWzBdLmRpc3BsYXksIG1vblswXS5zY3JlZW5JZCk7DQogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOID0gWDExLlhDcmVhdGVTaW1wbGVXaW5kb3cobW9uWzBdLmRpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuUk9PVFdJTiwgMCwgMCwgbW9uWzBdLnJpZ2h0LCA1LCAwLCB3aGl0ZSwgd2hpdGUpOw0KDQogICAgICAgICAgICAgICAgWDExLlhTeW5jKG1vblswXS5kaXNwbGF5LCAwKTsNCiAgICAgICAgICAgICAgICBYMTEuWENvbnZlcnRTZWxlY3Rpb24obW9uWzBdLmRpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuQ0xJUElELCB0aGlzLl9tYXN0ZXJQcm9taXNlLkZNVElELCB0aGlzLl9tYXN0ZXJQcm9taXNlLlBST1BJRCwgdGhpcy5fbWFzdGVyUHJvbWlzZS5GQUtFV0lOLCAwKTsNCiAgICAgICAgICAgICAgICBYMTEuWFN5bmMobW9uWzBdLmRpc3BsYXksIDApOw0KDQogICAgICAgICAgICAgICAgdGhpcy5fbWFzdGVyUHJvbWlzZS5EZXNjcmlwdG9yRXZlbnQgPSByZXF1aXJlKCdEZXNjcmlwdG9yRXZlbnRzJykuYWRkRGVzY3JpcHRvcihYMTEuWENvbm5lY3Rpb25OdW1iZXIobW9uWzBdLmRpc3BsYXkpLlZhbCwgeyByZWFkc2V0OiB0cnVlIH0pOw0KICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50Ll9tYXN0ZXJQcm9taXNlID0gdGhpcy5fbWFzdGVyUHJvbWlzZTsNCiAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLkRlc2NyaXB0b3JFdmVudC5fZGlzcGxheSA9IG1vblswXS5kaXNwbGF5Ow0KICAgICAgICAgICAgICAgIHRoaXMuX21hc3RlclByb21pc2UuRGVzY3JpcHRvckV2ZW50Lm9uKCdyZWFkc2V0JywgZnVuY3Rpb24gKGZkKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIFhFID0gR00uQ3JlYXRlVmFyaWFibGUoMTAyNCk7DQogICAgICAgICAgICAgICAgICAgIHdoaWxlIChYMTEuWFBlbmRpbmcodGhpcy5fZGlzcGxheSkuVmFsKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBYMTEuWE5leHRFdmVudFN5bmModGhpcy5fZGlzcGxheSwgWEUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoWEUuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSA9PSBTZWxlY3Rpb25Ob3RpZnkpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gR00uQ3JlYXRlUG9pbnRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJpdHMgPSBHTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ogPSBHTS5DcmVhdGVQb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFpbCA9IEdNLkNyZWF0ZVBvaW50ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBHTS5DcmVhdGVQb2ludGVyKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMTEuWEdldFdpbmRvd1Byb3BlcnR5KHRoaXMuX2Rpc3BsYXksIHRoaXMuX21hc3RlclByb21pc2UuRkFLRVdJTiwgdGhpcy5fbWFzdGVyUHJvbWlzZS5QUk9QSUQsIDAsIDY1NTM1LCAwLCBBbnlQcm9wZXJ0eVR5cGUsIGlkLCBiaXRzLCBzeiwgdGFpbCwgcmVzdWx0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXN0ZXJQcm9taXNlLl9yZXMocmVzdWx0LkRlcmVmKCkuU3RyaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBYMTEuWEZyZWUocmVzdWx0LkRlcmVmKCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgxMS5YRGVzdHJveVdpbmRvdyh0aGlzLl9kaXNwbGF5LCB0aGlzLl9tYXN0ZXJQcm9taXNlLkZBS0VXSU4pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEZXNjcmlwdG9yKGZkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBsaW5fY29weXRleHQoKQp7Cn0KCmZ1bmN0aW9uIHdpbl9yZWFkdGV4dCgpCnsKICAgIHZhciByZXQgPSAnJzsKICAgIHZhciBDRl9URVhUID0gMTsKICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgdmFyIHVzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCd1c2VyMzIuZGxsJyk7CiAgICB2YXIga2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7CiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dsb2JhbEFsbG9jJyk7CiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dsb2JhbExvY2snKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsVW5sb2NrJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdPcGVuQ2xpcGJvYXJkJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdDbG9zZUNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnR2V0Q2xpcGJvYXJkRGF0YScpOwoKICAgIHVzZXIzMi5PcGVuQ2xpcGJvYXJkKDApOwogICAgdmFyIGggPSB1c2VyMzIuR2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKICAgIGlmKGguVmFsIT0wKQogICAgewogICAgICAgIHZhciBoYnVmZmVyID0ga2VybmVsMzIuR2xvYmFsTG9jayhoKTsKICAgICAgICByZXQgPSBoYnVmZmVyLlN0cmluZzsKICAgICAgICBrZXJuZWwzMi5HbG9iYWxVbmxvY2soaCk7CiAgICB9CiAgICB1c2VyMzIuQ2xvc2VDbGlwYm9hcmQoKTsKCiAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikgeyB0aGlzLl9yZXMgPSByZXM7IHRoaXMuX3JlaiA9IHJlajsgfSk7CiAgICBwLl9yZXMocmV0KTsKICAgIHJldHVybiAocCk7Cn0KCmZ1bmN0aW9uIHdpbl9jb3B5dGV4dCh0eHQpCnsKICAgIHZhciBHTUVNX01PVkVBQkxFID0gMHgwMDAyOwogICAgdmFyIENGX1RFWFQgPSAxOwoKICAgIHZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwogICAgdmFyIHVzZXIzMiA9IEdNLkNyZWF0ZU5hdGl2ZVByb3h5KCd1c2VyMzIuZGxsJyk7CiAgICB2YXIga2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7CiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dsb2JhbEFsbG9jJyk7CiAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dsb2JhbExvY2snKTsKICAgIGtlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnR2xvYmFsVW5sb2NrJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdPcGVuQ2xpcGJvYXJkJyk7CiAgICB1c2VyMzIuQ3JlYXRlTWV0aG9kKCdFbXB0eUNsaXBib2FyZCcpOwogICAgdXNlcjMyLkNyZWF0ZU1ldGhvZCgnQ2xvc2VDbGlwYm9hcmQnKTsKICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ1NldENsaXBib2FyZERhdGEnKTsKCiAgICB2YXIgaCA9IGtlcm5lbDMyLkdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIHR4dC5sZW5ndGggKyAyKTsKICAgIGguYXV0b0ZyZWUoZmFsc2UpOwogICAgdmFyIGhidWZmZXIgPSBrZXJuZWwzMi5HbG9iYWxMb2NrKGgpOwogICAgaGJ1ZmZlci5hdXRvRnJlZShmYWxzZSk7CiAgICB2YXIgdG1wID0gQnVmZmVyLmFsbG9jKHR4dC5sZW5ndGggKyAxKTsKICAgIEJ1ZmZlci5mcm9tKHR4dCkuY29weSh0bXApOwogICAgdG1wLmNvcHkoaGJ1ZmZlci5EZXJlZigwLCB0eHQubGVuZ3RoICsgMSkudG9CdWZmZXIoKSk7CiAgICBrZXJuZWwzMi5HbG9iYWxVbmxvY2soaCk7CgogICAgdXNlcjMyLk9wZW5DbGlwYm9hcmQoMCk7CiAgICB1c2VyMzIuRW1wdHlDbGlwYm9hcmQoKTsKICAgIHVzZXIzMi5TZXRDbGlwYm9hcmREYXRhKENGX1RFWFQsIGgpOwogICAgdXNlcjMyLkNsb3NlQ2xpcGJvYXJkKCk7Cn0KCnN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQp7CiAgICBjYXNlICd3aW4zMic6CiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB3aW5fY29weXRleHQ7CiAgICAgICAgbW9kdWxlLmV4cG9ydHMucmVhZCA9IHdpbl9yZWFkdGV4dDsKICAgICAgICBicmVhazsKICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGxpbl9jb3B5dGV4dDsKICAgICAgICBtb2R1bGUuZXhwb3J0cy5yZWFkID0gbGluX3JlYWR0ZXh0OwogICAgICAgIGJyZWFrOwogICAgY2FzZSAnZGFyd2luJzoKICAgICAgICBicmVhazsKfQptb2R1bGUuZXhwb3J0cy5uYXRpdmVBZGRNb2R1bGUgPSBuYXRpdmVBZGRNb2R1bGU7', 'base64').toString());"); // Promise: This is very important, as it is used everywhere. Refer to /modules folder to see a human readable version of promise.js duk_peval_string_noresult(ctx, "addModule('promise', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTggSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciByZWZUYWJsZSA9IHt9OwoKZnVuY3Rpb24gZXZlbnRfc3dpdGNoZXJfaGVscGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ2V2ZW50X3N3aXRjaGVyJzsKICAgIHRoaXMuZnVuYyA9IGZ1bmN0aW9uIGZ1bmMoKQogICAgewogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgZm9yKHZhciBpIGluIGFyZ3VtZW50cykKICAgICAgICB7CiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKGZ1bmMudGFyZ2V0LmFwcGx5KGZ1bmMuZGVzaXJlZCwgYXJncykpOwogICAgfTsKICAgIHRoaXMuZnVuYy5kZXNpcmVkID0gZGVzaXJlZF9jYWxsZWU7CiAgICB0aGlzLmZ1bmMudGFyZ2V0ID0gdGFyZ2V0OwogICAgdGhpcy5mdW5jLnNlbGYgPSB0aGlzOwp9CmZ1bmN0aW9uIGV2ZW50X3N3aXRjaGVyKGRlc2lyZWRfY2FsbGVlLCB0YXJnZXQpCnsKICAgIHJldHVybiAobmV3IGV2ZW50X3N3aXRjaGVyX2hlbHBlcihkZXNpcmVkX2NhbGxlZSwgdGFyZ2V0KSk7Cn0KCmZ1bmN0aW9uIFByb21pc2UocHJvbWlzZUZ1bmMpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ3Byb21pc2UnOwogICAgdGhpcy5wcm9taXNlID0gdGhpczsKICAgIHRoaXMuX2ludGVybmFsID0geyBfT2JqZWN0SUQ6ICdwcm9taXNlLmludGVybmFsJywgcHJvbWlzZTogdGhpcywgZnVuYzogcHJvbWlzZUZ1bmMsIGNvbXBsZXRlZDogZmFsc2UsIGVycm9yczogZmFsc2UsIGNvbXBsZXRlZEFyZ3M6IFtdIH07CiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLl9pbnRlcm5hbCk7CiAgICB0aGlzLl9pbnRlcm5hbC5vbignX2V2ZW50SG9vaycsIGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2spCiAgICB7CiAgICAgICAgLy9jb25zb2xlLmxvZygnaG9vaycsIGV2ZW50TmFtZSwgJ2Vycm9ycy8nICsgdGhpcy5lcnJvcnMgKyAnIGNvbXBsZXRlZC8nICsgdGhpcy5jb21wbGV0ZWQpOwogICAgICAgIHZhciByID0gbnVsbDsKCiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PSAncmVzb2x2ZWQnICYmICF0aGlzLmVycm9ycyAmJiB0aGlzLmNvbXBsZXRlZCkKICAgICAgICB7CiAgICAgICAgICAgIHIgPSBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIHRoaXMuY29tcGxldGVkQXJncyk7CiAgICAgICAgICAgIGlmKHIhPW51bGwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnLCByKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnROYW1lID09ICdyZWplY3RlZCcgJiYgdGhpcy5lcnJvcnMgJiYgdGhpcy5jb21wbGV0ZWQpCiAgICAgICAgewogICAgICAgICAgICBldmVudENhbGxiYWNrLmFwcGx5KHRoaXMsIHRoaXMuY29tcGxldGVkQXJncyk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudE5hbWUgPT0gJ3NldHRsZWQnICYmIHRoaXMuY29tcGxldGVkKQogICAgICAgIHsKICAgICAgICAgICAgZXZlbnRDYWxsYmFjay5hcHBseSh0aGlzLCBbXSk7CiAgICAgICAgfQogICAgfSk7CiAgICB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlciA9IGZ1bmN0aW9uIF9yZXNvbHZlcigpCiAgICB7CiAgICAgICAgX3Jlc29sdmVyLl9zZWxmLmVycm9ycyA9IGZhbHNlOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWRBcmdzID0gW107CiAgICAgICAgdmFyIGFyZ3MgPSBbJ3Jlc29sdmVkJ107CiAgICAgICAgaWYgKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSAmJiB0aGlzLmVtaXRfcmV0dXJuVmFsdWUoJ3Jlc29sdmVkJykgIT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIF9yZXNvbHZlci5fc2VsZi5jb21wbGV0ZWRBcmdzLnB1c2godGhpcy5lbWl0X3JldHVyblZhbHVlKCdyZXNvbHZlZCcpKTsKICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuZW1pdF9yZXR1cm5WYWx1ZSgncmVzb2x2ZWQnKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAodmFyIGEgaW4gYXJndW1lbnRzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuY29tcGxldGVkQXJncy5wdXNoKGFyZ3VtZW50c1thXSk7CiAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2FdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfcmVzb2x2ZXIuX3NlbGYuZW1pdC5hcHBseShfcmVzb2x2ZXIuX3NlbGYsIGFyZ3MpOwogICAgICAgIF9yZXNvbHZlci5fc2VsZi5lbWl0KCdzZXR0bGVkJyk7CiAgICB9OwogICAgdGhpcy5faW50ZXJuYWwucmVqZWN0b3IgPSBmdW5jdGlvbiBfcmVqZWN0b3IoKQogICAgewogICAgICAgIF9yZWplY3Rvci5fc2VsZi5lcnJvcnMgPSB0cnVlOwogICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIF9yZWplY3Rvci5fc2VsZi5jb21wbGV0ZWRBcmdzID0gW107CiAgICAgICAgdmFyIGFyZ3MgPSBbJ3JlamVjdGVkJ107CiAgICAgICAgZm9yICh2YXIgYSBpbiBhcmd1bWVudHMpCiAgICAgICAgewogICAgICAgICAgICBfcmVqZWN0b3IuX3NlbGYuY29tcGxldGVkQXJncy5wdXNoKGFyZ3VtZW50c1thXSk7CiAgICAgICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbYV0pOwogICAgICAgIH0KCiAgICAgICAgX3JlamVjdG9yLl9zZWxmLmVtaXQuYXBwbHkoX3JlamVjdG9yLl9zZWxmLCBhcmdzKTsKICAgICAgICBfcmVqZWN0b3IuX3NlbGYuZW1pdCgnc2V0dGxlZCcpOwogICAgfTsKICAgIHRoaXMuY2F0Y2ggPSBmdW5jdGlvbihmdW5jKQogICAgewogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3JlamVjdGVkJywgZXZlbnRfc3dpdGNoZXIodGhpcywgZnVuYykuZnVuYyk7CiAgICB9CiAgICB0aGlzLmZpbmFsbHkgPSBmdW5jdGlvbiAoZnVuYykKICAgIHsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5vbmNlKCdzZXR0bGVkJywgZXZlbnRfc3dpdGNoZXIodGhpcywgZnVuYykuZnVuYyk7CiAgICB9OwogICAgdGhpcy50aGVuID0gZnVuY3Rpb24gKHJlc29sdmVkLCByZWplY3RlZCkKICAgIHsKICAgICAgICBpZiAocmVzb2x2ZWQpIHsgdGhpcy5faW50ZXJuYWwub25jZSgncmVzb2x2ZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCByZXNvbHZlZCkuZnVuYyk7IH0KICAgICAgICBpZiAocmVqZWN0ZWQpIHsgdGhpcy5faW50ZXJuYWwub25jZSgncmVqZWN0ZWQnLCBldmVudF9zd2l0Y2hlcih0aGlzLCByZWplY3RlZCkuZnVuYyk7IH0KCiAgICAgICAgdmFyIHJldFZhbCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBqKSB7IH0pOwogICAgICAgIHRoaXMuX2ludGVybmFsLm9uY2UoJ3Jlc29sdmVkJywgcmV0VmFsLl9pbnRlcm5hbC5yZXNvbHZlcik7CiAgICAgICAgdGhpcy5faW50ZXJuYWwub25jZSgncmVqZWN0ZWQnLCByZXRWYWwuX2ludGVybmFsLnJlamVjdG9yKTsKICAgICAgICByZXRWYWwucGFyZW50UHJvbWlzZSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIChyZXRWYWwpOwogICAgfTsKCiAgICB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlci5fc2VsZiA9IHRoaXMuX2ludGVybmFsOwogICAgdGhpcy5faW50ZXJuYWwucmVqZWN0b3IuX3NlbGYgPSB0aGlzLl9pbnRlcm5hbDs7CgogICAgdHJ5CiAgICB7CiAgICAgICAgcHJvbWlzZUZ1bmMuY2FsbCh0aGlzLCB0aGlzLl9pbnRlcm5hbC5yZXNvbHZlciwgdGhpcy5faW50ZXJuYWwucmVqZWN0b3IpOwogICAgfQogICAgY2F0Y2goZSkKICAgIHsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5lcnJvcnMgPSB0cnVlOwogICAgICAgIHRoaXMuX2ludGVybmFsLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgdGhpcy5faW50ZXJuYWwuY29tcGxldGVkQXJncyA9IFtlXTsKICAgICAgICB0aGlzLl9pbnRlcm5hbC5lbWl0KCdyZWplY3RlZCcsIGUpOwogICAgICAgIHRoaXMuX2ludGVybmFsLmVtaXQoJ3NldHRsZWQnKTsKICAgIH0KCiAgICBpZighdGhpcy5faW50ZXJuYWwuY29tcGxldGVkKQogICAgewogICAgICAgIC8vIFNhdmUgcmVmZXJlbmNlIG9mIHRoaXMgb2JqZWN0CiAgICAgICAgcmVmVGFibGVbdGhpcy5faW50ZXJuYWwuX2hhc2hDb2RlKCldID0gdGhpcy5faW50ZXJuYWw7CiAgICAgICAgdGhpcy5faW50ZXJuYWwub25jZSgnc2V0dGxlZCcsIGZ1bmN0aW9uICgpIHsgcmVmVGFibGVbdGhpcy5faGFzaENvZGUoKV0gPSBudWxsOyB9KTsKICAgIH0KfQoKUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZSgpCnsKICAgIHZhciByZXRWYWwgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAociwgaikgeyB9KTsKICAgIHZhciBhcmdzID0gW107CiAgICBmb3IgKHZhciBpIGluIGFyZ3VtZW50cykKICAgIHsKICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsKICAgIH0KICAgIHJldFZhbC5faW50ZXJuYWwucmVzb2x2ZXIuYXBwbHkocmV0VmFsLl9pbnRlcm5hbCwgYXJncyk7CiAgICByZXR1cm4gKHJldFZhbCk7Cn07ClByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24gcmVqZWN0KCkgewogICAgdmFyIHJldFZhbCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBqKSB7IH0pOwogICAgdmFyIGFyZ3MgPSBbXTsKICAgIGZvciAodmFyIGkgaW4gYXJndW1lbnRzKSB7CiAgICAgICAgYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICB9CiAgICByZXRWYWwuX2ludGVybmFsLnJlamVjdG9yLmFwcGx5KHJldFZhbC5faW50ZXJuYWwsIGFyZ3MpOwogICAgcmV0dXJuIChyZXRWYWwpOwp9OwpQcm9taXNlLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlTGlzdCkKewogICAgdmFyIHJldCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikKICAgIHsKICAgICAgICB0aGlzLl9fcmVqZWN0b3IgPSByZWo7CiAgICAgICAgdGhpcy5fX3Jlc29sdmVyID0gcmVzOwogICAgICAgIHRoaXMuX19wcm9taXNlTGlzdCA9IHByb21pc2VMaXN0OwogICAgICAgIHRoaXMuX19kb25lID0gZmFsc2U7CiAgICAgICAgdGhpcy5fX2NvdW50ID0gMDsKICAgIH0pOwoKICAgIGZvciAodmFyIGkgaW4gcHJvbWlzZUxpc3QpCiAgICB7CiAgICAgICAgcHJvbWlzZUxpc3RbaV0udGhlbihmdW5jdGlvbiAoKQogICAgICAgIHsKICAgICAgICAgICAgLy8gU3VjY2VzcwogICAgICAgICAgICBpZigrK3JldC5fX2NvdW50ID09IHJldC5fX3Byb21pc2VMaXN0Lmxlbmd0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0Ll9fZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXQuX19yZXNvbHZlcihyZXQuX19wcm9taXNlTGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbiAoYXJnKQogICAgICAgIHsKICAgICAgICAgICAgLy8gRmFpbHVyZQogICAgICAgICAgICBpZighcmV0Ll9fZG9uZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0Ll9fZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXQuX19yZWplY3RvcihhcmcpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBpZiAocHJvbWlzZUxpc3QubGVuZ3RoID09IDApCiAgICB7CiAgICAgICAgcmV0Ll9fcmVzb2x2ZXIocHJvbWlzZUxpc3QpOwogICAgfQogICAgcmV0dXJuIChyZXQpOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlOw==', 'base64').toString());"); diff --git a/modules/clipboard.js b/modules/clipboard.js index 4eec82c..341d0da 100644 --- a/modules/clipboard.js +++ b/modules/clipboard.js @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +var promise = require('promise'); function nativeAddModule(name) { @@ -22,6 +23,84 @@ function nativeAddModule(name) module.exports(ret); } +function lin_readtext() +{ + var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; }); + try + { + require('monitor-info') + } + catch(exc) + { + ret._rej(exc); + return (ret); + } + + var X11 = require('monitor-info')._X11; + if (!X11) + { + ret._rej('X11 required for Clipboard Manipulation'); + } + else + { + var SelectionNotify = 31; + var AnyPropertyType = 0; + var GM = require('monitor-info')._gm; + + ret._getInfoPromise = require('monitor-info').getInfo(); + ret._getInfoPromise._masterPromise = ret; + ret._getInfoPromise.then(function (mon) + { + if (mon.length > 0) + { + var white = X11.XWhitePixel(mon[0].display, mon[0].screenId).Val; + + this._masterPromise.CLIPID = X11.XInternAtom(mon[0].display, GM.CreateVariable('CLIPBOARD'), 0); + this._masterPromise.FMTID = X11.XInternAtom(mon[0].display, GM.CreateVariable('UTF8_STRING'), 0); + this._masterPromise.PROPID = X11.XInternAtom(mon[0].display, GM.CreateVariable('XSEL_DATA'), 0); + this._masterPromise.INCRID = X11.XInternAtom(mon[0].display, GM.CreateVariable('INCR'), 0); + this._masterPromise.ROOTWIN = X11.XRootWindow(mon[0].display, mon[0].screenId); + this._masterPromise.FAKEWIN = X11.XCreateSimpleWindow(mon[0].display, this._masterPromise.ROOTWIN, 0, 0, mon[0].right, 5, 0, white, white); + + X11.XSync(mon[0].display, 0); + X11.XConvertSelection(mon[0].display, this._masterPromise.CLIPID, this._masterPromise.FMTID, this._masterPromise.PROPID, this._masterPromise.FAKEWIN, 0); + X11.XSync(mon[0].display, 0); + + this._masterPromise.DescriptorEvent = require('DescriptorEvents').addDescriptor(X11.XConnectionNumber(mon[0].display).Val, { readset: true }); + this._masterPromise.DescriptorEvent._masterPromise = this._masterPromise; + this._masterPromise.DescriptorEvent._display = mon[0].display; + this._masterPromise.DescriptorEvent.on('readset', function (fd) + { + var XE = GM.CreateVariable(1024); + while (X11.XPending(this._display).Val) + { + X11.XNextEventSync(this._display, XE); + if(XE.Deref(0, 4).toBuffer().readUInt32LE() == SelectionNotify) + { + var id = GM.CreatePointer(); + var bits = GM.CreatePointer(); + var sz = GM.CreatePointer(); + var tail = GM.CreatePointer(); + var result = GM.CreatePointer(); + + X11.XGetWindowProperty(this._display, this._masterPromise.FAKEWIN, this._masterPromise.PROPID, 0, 65535, 0, AnyPropertyType, id, bits, sz, tail, result); + this._masterPromise._res(result.Deref().String); + X11.XFree(result.Deref()); + X11.XDestroyWindow(this._display, this._masterPromise.FAKEWIN); + + this.removeDescriptor(fd); + break; + } + } + }); + } + }); + } + return (ret); +} +function lin_copytext() +{ +} function win_readtext() { @@ -46,7 +125,10 @@ function win_readtext() kernel32.GlobalUnlock(h); } user32.CloseClipboard(); - return (ret); + + var p = new promise(function (res, rej) { this._res = res; this._rej = rej; }); + p._res(ret); + return (p); } function win_copytext(txt) @@ -87,6 +169,8 @@ switch(process.platform) module.exports.read = win_readtext; break; case 'linux': + module.exports = lin_copytext; + module.exports.read = lin_readtext; break; case 'darwin': break; diff --git a/modules/monitor-info.js b/modules/monitor-info.js index d94e0c2..fe4c745 100644 --- a/modules/monitor-info.js +++ b/modules/monitor-info.js @@ -200,6 +200,7 @@ function monitorinfo() this._X11.CreateMethod('XCreateSimpleWindow'); this._X11.CreateMethod('XDefaultColormap'); this._X11.CreateMethod('XDefaultScreen'); + this._X11.CreateMethod('XDestroyWindow'); this._X11.CreateMethod('XDrawLine'); this._X11.CreateMethod('XDisplayHeight'); this._X11.CreateMethod('XDisplayWidth');