diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index d8669c7..98a0443 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2072,7 +2072,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) free(_toaster); // notifybar-desktop, refer to modules/notifybar-desktop.js - duk_peval_string_noresult(ctx, "addModule('notifybar-desktop', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KdmFyIHB0cnNpemUgPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKS5Qb2ludGVyU2l6ZTsNCg0KZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfY2hlY2sodGl0bGUpDQp7DQogICAgaWYocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpLnRzaWQgPT0gMCkNCiAgICB7DQogICAgICAgIHJldHVybiAod2luZG93c19ub3RpZnliYXJfc3lzdGVtKHRpdGxlKSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldHVybiAod2luZG93c19ub3RpZnliYXJfbG9jYWwodGl0bGUpKTsNCiAgICB9DQp9DQpmdW5jdGlvbiB3aW5kb3dzX25vdGlmeWJhcl9zeXN0ZW0odGl0bGUpDQp7DQogICAgdmFyIHJldCA9IHt9Ow0KDQogICAgdmFyIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCdub3RpZnliYXItZGVza3RvcCcpKCciICsgdGl0bGUgKyAiJykub24oJ2Nsb3NlJywgZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTsiKS50b1N0cmluZygnYmFzZTY0Jyk7DQoNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQ0KICAgICAgICAuYWRkTWV0aG9kKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkgeyB0aGlzLmNoaWxkLmtpbGwoKTsgfSk7DQoNCiAgICBjb25zb2xlLmxvZygnc3dpdGNoaW5nJyk7DQogICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZXhlY1BhdGgsIFtwcm9jZXNzLmV4ZWNQYXRoLnNwbGl0KCdcXCcpLnBvcCgpLCAnLWI2NGV4ZWMnLCBzY3JpcHRdLCB7IHR5cGU6IDEgfSk7DQogICAgcmV0LmNoaWxkLnBhcmVudCA9IHJldDsNCiAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKSB7IHRoaXMucGFyZW50LmVtaXQoJ2Nsb3NlJywgY29kZSk7IH0pOw0KDQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiB3aW5kb3dzX25vdGlmeWJhcl9sb2NhbCh0aXRsZSkNCnsNCiAgICB2YXIgTWVzc2FnZVB1bXA7DQogICAgdmFyIHJldDsNCg0KICAgIE1lc3NhZ2VQdW1wID0gcmVxdWlyZSgnd2luLW1lc3NhZ2UtcHVtcCcpOw0KICAgIHJldCA9IHsgX09iamVjdElEOiAnbm90aWZ5YmFyLWRlc2t0b3AuV2luZG93cycsIHRpdGxlOiB0aXRsZSwgX3B1bXBzOiBbXSwgX3Byb21pc2U6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldEluZm8oKSB9Ow0KDQogICAgcmV0Ll9wcm9taXNlLm5vdGlmeWJhciA9IHJldDsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdjbG9zZScpDQogICAgICAgIC5hZGRNZXRob2QoJ2Nsb3NlJywgZnVuY3Rpb24gY2xvc2UoKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuX3B1bXBzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX3B1bXBzW2ldLnJlbW92ZUFsbExpc3RlbmVycygnZXhpdCcpOw0KICAgICAgICAgICAgICAgIHRoaXMuX3B1bXBzW2ldLmNsb3NlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgcmV0Ll9wcm9taXNlLnRoZW4oZnVuY3Rpb24gKG0pDQogICAgew0KICAgICAgICB2YXIgb2Zmc2V0Ow0KICAgICAgICB2YXIgYmFyV2lkdGgsIG1vbldpZHRoLCBvZmZzZXQsIGJhckhlaWdodCwgbW9uSGVpZ2h0Ow0KDQogICAgICAgIGZvciAodmFyIGkgaW4gbSkNCiAgICAgICAgew0KICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnTW9uaXRvcjogJyArIGkgKyAnID0gV2lkdGhbJyArIChtW2ldLnJpZ2h0IC0gbVtpXS5sZWZ0KSArICddJyk7DQogICAgICAgICAgICBtb25XaWR0aCA9IChtW2ldLnJpZ2h0IC0gbVtpXS5sZWZ0KTsNCiAgICAgICAgICAgIG1vbkhlaWdodCA9IChtW2ldLmJvdHRvbSAtIG1baV0udG9wKTsNCiAgICAgICAgICAgIGJhcldpZHRoID0gTWF0aC5mbG9vcihtb25XaWR0aCAqIDAuMzApOw0KICAgICAgICAgICAgYmFySGVpZ2h0ID0gTWF0aC5mbG9vcihtb25IZWlnaHQgKiAwLjAzNSk7DQogICAgICAgICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC41MCkgLSBNYXRoLmZsb29yKGJhcldpZHRoICogMC41MCk7DQogICAgICAgICAgICBzdGFydCA9IG1baV0ubGVmdCArIG9mZnNldDsNCiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJyAgICcgKyBzdGFydCArICcsICcgKyBiYXJXaWR0aCArICcsICcgKyBiYXJIZWlnaHQpOw0KDQogICAgICAgICAgICB2YXIgb3B0aW9ucyA9DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB3aW5kb3c6DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbnN0eWxlczogTWVzc2FnZVB1bXAuV2luZG93U3R5bGVzLldTX1ZJU0lCTEUgfCBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfQk9SREVSIHwgTWVzc2FnZVB1bXAuV2luZG93U3R5bGVzLldTX0NBUFRJT04gfCBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfU1lTTUVOVSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHN0YXJ0LCB3aWR0aDogYmFyV2lkdGgsIGhlaWdodDogYmFySGVpZ2h0LCB0aXRsZTogdGhpcy5ub3RpZnliYXIudGl0bGUNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICANCiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl9wdW1wcy5wdXNoKG5ldyBNZXNzYWdlUHVtcChvcHRpb25zKSk7DQogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm5vdGlmeWJhciA9IHRoaXMubm90aWZ5YmFyOw0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzLnBlZWsoKS5vbignaHduZCcsIGZ1bmN0aW9uIChoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX0hBTkRMRSA9IGg7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl9wdW1wcy5wZWVrKCkub24oJ2V4aXQnLCBmdW5jdGlvbiAoaCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5ub3RpZnliYXIuX3B1bXBzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzW2ldLnJlbW92ZUFsbExpc3RlbmVycygnZXhpdCcpOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHNbaV0uY2xvc2UoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuZW1pdCgnY2xvc2UnKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzLnBlZWsoKS5vbignbWVzc2FnZScsIGZ1bmN0aW9uIG9uV2luZG93c01lc3NhZ2UobXNnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChtc2cubWVzc2FnZSA9PSAxMzMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJXTV9OQ1BBSU5UIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChtc2cubWVzc2FnZSA9PSA3MCkgICAvLyBXZSBhcmUgaW50ZXJjZXB0aW5nIFdNX1dJTkRPV1BPU0NIQU5HSU5HIHRvIERJU0FCTEUgbW92aW5nIHRoZSB3aW5kb3cNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9IQU5ETEUpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbGFncyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHB0cnNpemUpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IG1zZy5scGFyYW1fcmF3LkRlcmVmKDI0LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIHwgMHgwMDAyOyAvLyBTZXQgU1dQX05PTU9WRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cubHBhcmFtX3Jhdy5EZXJlZigyNCwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IG1zZy5scGFyYW1fcmF3LkRlcmVmKDMyLCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpIHwgMHgwMDAyICAvLyBTZXQgU1dQX05PTU9WRQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cubHBhcmFtX3Jhdy5EZXJlZigzMiwgNCkudG9CdWZmZXIoKS53cml0ZVVJbnQzMkxFKGZsYWdzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQoNCg0KDQoNCg0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICd3aW4zMic6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93c19ub3RpZnliYXJfY2hlY2s7DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgJ2xpbnV4JzoNCiAgICBjYXNlICdmcmVlYnNkJzoNCiAgICAgICAgYnJlYWs7DQp9DQoNCg0K', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('notifybar-desktop', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KdmFyIHB0cnNpemUgPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKS5Qb2ludGVyU2l6ZTsNCnZhciBDbGllbnRNZXNzYWdlID0gMzM7DQoNCg0KZnVuY3Rpb24gd2luZG93c19ub3RpZnliYXJfY2hlY2sodGl0bGUpDQp7DQogICAgaWYocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocHJvY2Vzcy5waWQpLnRzaWQgPT0gMCkNCiAgICB7DQogICAgICAgIHJldHVybiAod2luZG93c19ub3RpZnliYXJfc3lzdGVtKHRpdGxlKSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldHVybiAod2luZG93c19ub3RpZnliYXJfbG9jYWwodGl0bGUpKTsNCiAgICB9DQp9DQpmdW5jdGlvbiB3aW5kb3dzX25vdGlmeWJhcl9zeXN0ZW0odGl0bGUpDQp7DQogICAgdmFyIHJldCA9IHt9Ow0KDQogICAgdmFyIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCdub3RpZnliYXItZGVza3RvcCcpKCciICsgdGl0bGUgKyAiJykub24oJ2Nsb3NlJywgZnVuY3Rpb24oKXtwcm9jZXNzLmV4aXQoKTt9KTsiKS50b1N0cmluZygnYmFzZTY0Jyk7DQoNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQ0KICAgICAgICAuYWRkTWV0aG9kKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkgeyB0aGlzLmNoaWxkLmtpbGwoKTsgfSk7DQoNCiAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQoJ1xcJykucG9wKCksICctYjY0ZXhlYycsIHNjcmlwdF0sIHsgdHlwZTogMSB9KTsNCiAgICByZXQuY2hpbGQucGFyZW50ID0gcmV0Ow0KICAgIHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgdGhpcy5wYXJlbnQuZW1pdCgnY2xvc2UnLCBjb2RlKTsgfSk7DQoNCiAgICByZXR1cm4gKHJldCk7DQp9DQoNCmZ1bmN0aW9uIHdpbmRvd3Nfbm90aWZ5YmFyX2xvY2FsKHRpdGxlKQ0Kew0KICAgIHZhciBNZXNzYWdlUHVtcDsNCiAgICB2YXIgcmV0Ow0KDQogICAgTWVzc2FnZVB1bXAgPSByZXF1aXJlKCd3aW4tbWVzc2FnZS1wdW1wJyk7DQogICAgcmV0ID0geyBfT2JqZWN0SUQ6ICdub3RpZnliYXItZGVza3RvcC5XaW5kb3dzJywgdGl0bGU6IHRpdGxlLCBfcHVtcHM6IFtdLCBfcHJvbWlzZTogcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuZ2V0SW5mbygpIH07DQoNCiAgICByZXQuX3Byb21pc2Uubm90aWZ5YmFyID0gcmV0Ow0KICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldCwgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2Nsb3NlJykNCiAgICAgICAgLmFkZE1ldGhvZCgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fcHVtcHMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fcHVtcHNbaV0ucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7DQogICAgICAgICAgICAgICAgdGhpcy5fcHVtcHNbaV0uY2xvc2UoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQoNCiAgICByZXQuX3Byb21pc2UudGhlbihmdW5jdGlvbiAobSkNCiAgICB7DQogICAgICAgIHZhciBvZmZzZXQ7DQogICAgICAgIHZhciBiYXJXaWR0aCwgbW9uV2lkdGgsIG9mZnNldCwgYmFySGVpZ2h0LCBtb25IZWlnaHQ7DQoNCiAgICAgICAgZm9yICh2YXIgaSBpbiBtKQ0KICAgICAgICB7DQogICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdNb25pdG9yOiAnICsgaSArICcgPSBXaWR0aFsnICsgKG1baV0ucmlnaHQgLSBtW2ldLmxlZnQpICsgJ10nKTsNCiAgICAgICAgICAgIG1vbldpZHRoID0gKG1baV0ucmlnaHQgLSBtW2ldLmxlZnQpOw0KICAgICAgICAgICAgbW9uSGVpZ2h0ID0gKG1baV0uYm90dG9tIC0gbVtpXS50b3ApOw0KICAgICAgICAgICAgYmFyV2lkdGggPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC4zMCk7DQogICAgICAgICAgICBiYXJIZWlnaHQgPSBNYXRoLmZsb29yKG1vbkhlaWdodCAqIDAuMDM1KTsNCiAgICAgICAgICAgIG9mZnNldCA9IE1hdGguZmxvb3IobW9uV2lkdGggKiAwLjUwKSAtIE1hdGguZmxvb3IoYmFyV2lkdGggKiAwLjUwKTsNCiAgICAgICAgICAgIHN0YXJ0ID0gbVtpXS5sZWZ0ICsgb2Zmc2V0Ow0KICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnICAgJyArIHN0YXJ0ICsgJywgJyArIGJhcldpZHRoICsgJywgJyArIGJhckhlaWdodCk7DQoNCiAgICAgICAgICAgIHZhciBvcHRpb25zID0NCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHdpbmRvdzoNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2luc3R5bGVzOiBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfVklTSUJMRSB8IE1lc3NhZ2VQdW1wLldpbmRvd1N0eWxlcy5XU19CT1JERVIgfCBNZXNzYWdlUHVtcC5XaW5kb3dTdHlsZXMuV1NfQ0FQVElPTiB8IE1lc3NhZ2VQdW1wLldpbmRvd1N0eWxlcy5XU19TWVNNRU5VLA0KICAgICAgICAgICAgICAgICAgICAgICAgeDogc3RhcnQsIHdpZHRoOiBiYXJXaWR0aCwgaGVpZ2h0OiBiYXJIZWlnaHQsIHRpdGxlOiB0aGlzLm5vdGlmeWJhci50aXRsZQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzLnB1c2gobmV3IE1lc3NhZ2VQdW1wKG9wdGlvbnMpKTsNCiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl9wdW1wcy5wZWVrKCkubm90aWZ5YmFyID0gdGhpcy5ub3RpZnliYXI7DQogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm9uKCdod25kJywgZnVuY3Rpb24gKGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fSEFORExFID0gaDsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3B1bXBzLnBlZWsoKS5vbignZXhpdCcsIGZ1bmN0aW9uIChoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLm5vdGlmeWJhci5fcHVtcHMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHNbaV0ucmVtb3ZlQWxsTGlzdGVuZXJzKCdleGl0Jyk7DQogICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl9wdW1wc1tpXS5jbG9zZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5lbWl0KCdjbG9zZScpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fcHVtcHMucGVlaygpLm9uKCdtZXNzYWdlJywgZnVuY3Rpb24gb25XaW5kb3dzTWVzc2FnZShtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKG1zZy5tZXNzYWdlID09IDEzMykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coIldNX05DUEFJTlQiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKG1zZy5tZXNzYWdlID09IDcwKSAgIC8vIFdlIGFyZSBpbnRlcmNlcHRpbmcgV01fV0lORE9XUE9TQ0hBTkdJTkcgdG8gRElTQUJMRSBtb3ZpbmcgdGhlIHdpbmRvdw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0hBTkRMRSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHRyc2l6ZSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gbXNnLmxwYXJhbV9yYXcuRGVyZWYoMjQsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfCAweDAwMDI7IC8vIFNldCBTV1BfTk9NT1ZFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5scGFyYW1fcmF3LkRlcmVmKDI0LCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZmxhZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gbXNnLmxwYXJhbV9yYXcuRGVyZWYoMzIsIDQpLnRvQnVmZmVyKCkucmVhZFVJbnQzMkxFKCkgfCAweDAwMDIgIC8vIFNldCBTV1BfTk9NT1ZFDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5scGFyYW1fcmF3LkRlcmVmKDMyLCA0KS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZmxhZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfSk7DQoNCiAgICByZXR1cm4gKHJldCk7DQp9DQoNCg0KZnVuY3Rpb24geF9ub3RpZnliYXJfY2hlY2sodGl0bGUpDQp7DQogICAgaWYocmVxdWlyZSgndXNlci1zZXNzaW9ucycpLlNlbGYoKSE9MCkNCiAgICB7DQogICAgICAgIHJldHVybiAoeF9ub3RpZnliYXIodGl0bGUpKTsgLy8gTm8gRGlzcGF0Y2hpbmcgbmVjZXNzYXJ5DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIC8vIFdlIGFyZSByb290LCBzbyB3ZSBzaG91bGQgdHJ5IHRvIHNwYXduIGEgY2hpbGQgaW50byB0aGUgdXNlcidzIGRlc2t0b3ANCiAgICAgICAgdmFyIHVpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCk7DQogICAgICAgIHZhciB4aW5mbyA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmdldFhJbmZvKHVpZCk7DQogICAgICAgIA0KICAgICAgICBpZiAoIXhpbmZvIHx8ICF4aW5mby54YXV0aG9yaXR5KQ0KICAgICAgICB7DQogICAgICAgICAgICB0aHJvdygnWFNlcnZlciBJbml0aWFsaXphdGlvbiBFcnJvcicpDQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcmV0ID0ge307DQogICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgicmVxdWlyZSgnbm90aWZ5YmFyLWRlc2t0b3AnKSgnIiArIHRpdGxlICsgIicpLm9uKCdjbG9zZScsIGZ1bmN0aW9uKCl7cHJvY2Vzcy5leGl0KCk7fSk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KDQogICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldCwgdHJ1ZSkNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpIHsgdGhpcy5jaGlsZC5raWxsKCk7IH0pOw0KDQogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdCgnLycpLnBvcCgpLCAnLWI2NGV4ZWMnLCBzY3JpcHRdLCB7IHVpZDogdWlkLCBlbnY6IHsgWEFVVEhPUklUWTogeGluZm8ueGF1dGhvcml0eSwgRElTUExBWTogeGluZm8uZGlzcGxheSB9IH0pOw0KICAgICAgICByZXQuY2hpbGQucGFyZW50ID0gcmV0Ow0KICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgIHJldC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgdGhpcy5wYXJlbnQuZW1pdCgnY2xvc2UnLCBjb2RlKTsgfSk7DQoNCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24geF9ub3RpZnliYXIodGl0bGUpDQp7DQogICAgcmV0ID0geyBfT2JqZWN0SUQ6ICdub3RpZnliYXItZGVza3RvcC5YJywgdGl0bGU6IHRpdGxlLCBfd2luZG93czogW10sIF9wcm9taXNlOiByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5nZXRJbmZvKCkgfTsNCg0KICAgIHJldC5fcHJvbWlzZS5ub3RpZnliYXIgPSByZXQ7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKQogICAgICAgIC5jcmVhdGVFdmVudCgnY2xvc2UnKQ0KICAgICAgICAuYWRkTWV0aG9kKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkNCiAgICAgICAgew0KICAgICAgICB9KTsNCg0KICAgIHJldC5fcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChtKQ0KICAgIHsNCiAgICAgICAgdmFyIG9mZnNldDsNCiAgICAgICAgdmFyIGJhcldpZHRoLCBtb25XaWR0aCwgb2Zmc2V0LCBiYXJIZWlnaHQsIG1vbkhlaWdodDsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBtKQ0KICAgICAgICB7DQogICAgICAgICAgICBtb25XaWR0aCA9IChtW2ldLnJpZ2h0IC0gbVtpXS5sZWZ0KTsNCiAgICAgICAgICAgIG1vbkhlaWdodCA9IChtW2ldLmJvdHRvbSAtIG1baV0udG9wKTsNCiAgICAgICAgICAgIGJhcldpZHRoID0gTWF0aC5mbG9vcihtb25XaWR0aCAqIDAuMzApOw0KICAgICAgICAgICAgYmFySGVpZ2h0ID0gTWF0aC5mbG9vcihtb25IZWlnaHQgKiAwLjAzNSk7DQogICAgICAgICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKG1vbldpZHRoICogMC41MCkgLSBNYXRoLmZsb29yKGJhcldpZHRoICogMC41MCk7DQogICAgICAgICAgICBzdGFydCA9IG1baV0ubGVmdCArIG9mZnNldDsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0YXJ0LCBiYXJXaWR0aCwgYmFySGVpZ2h0KTsNCg0KICAgICAgICAgICAgdmFyIHdoaXRlID0gcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YV2hpdGVQaXhlbChtW2ldLmRpc3BsYXksIG1baV0uc2NyZWVuSWQpLlZhbDsNCiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnB1c2goew0KICAgICAgICAgICAgICAgIHJvb3Q6IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWFJvb3RXaW5kb3cobVtpXS5kaXNwbGF5LCBtW2ldLnNjcmVlbklkKSwNCiAgICAgICAgICAgICAgICBkaXNwbGF5OiBtW2ldLmRpc3BsYXksIGlkOiBtW2ldLnNjcmVlZElkDQogICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLm5vdGlmeWJhciA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWENyZWF0ZVNpbXBsZVdpbmRvdyhtW2ldLmRpc3BsYXksIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5yb290LCBzdGFydCwgMCwgYmFyV2lkdGgsIDEsIDAsIHdoaXRlLCB3aGl0ZSk7DQogICAgICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhTdG9yZU5hbWUobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyLCByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKS5DcmVhdGVWYXJpYWJsZSh0aGlzLm5vdGlmeWJhci50aXRsZSkpOw0KDQogICAgICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5zZXRXaW5kb3dTaXplSGludHMobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyLCBzdGFydCwgMCwgYmFyV2lkdGgsIDEsIGJhcldpZHRoLCAxLCBiYXJXaWR0aCwgMSk7CiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLmhpZGVXaW5kb3dJY29uKG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLnJvb3QsIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5ub3RpZnliYXIpOwoKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuc2V0QWxsb3dlZEFjdGlvbnMobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyLCByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5NT1RJRl9GTEFHUy5NV01fRlVOQ19DTE9TRSk7CiAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLnNldEFsd2F5c09uVG9wKG1baV0uZGlzcGxheSwgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLnJvb3QsIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5ub3RpZnliYXIpOwoKICAgICAgICAgICAgdmFyIHdtX2RlbGV0ZV93aW5kb3dfYXRvbSA9IHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWEludGVybkF0b20obVtpXS5kaXNwbGF5LCByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKS5DcmVhdGVWYXJpYWJsZSgnV01fREVMRVRFX1dJTkRPVycpLCAwKS5WYWw7DQogICAgICAgICAgICB2YXIgYXRvbXMgPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKS5DcmVhdGVWYXJpYWJsZSg0KTsNCiAgICAgICAgICAgIGF0b21zLnRvQnVmZmVyKCkud3JpdGVVSW50MzJMRSh3bV9kZWxldGVfd2luZG93X2F0b20pOw0KICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YU2V0V01Qcm90b2NvbHMobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyLCBhdG9tcywgMSk7CgogICAgICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhNYXBXaW5kb3cobVtpXS5kaXNwbGF5LCB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkubm90aWZ5YmFyKTsKICAgICAgICAgICAgcmVxdWlyZSgnbW9uaXRvci1pbmZvJykuX1gxMS5YRmx1c2gobVtpXS5kaXNwbGF5KTsNCg0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLkRlc2NyaXB0b3JFdmVudCA9IHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5hZGREZXNjcmlwdG9yKHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWENvbm5lY3Rpb25OdW1iZXIobVtpXS5kaXNwbGF5KS5WYWwsIHsgcmVhZHNldDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5EZXNjcmlwdG9yRXZlbnQpOw0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLkRlc2NyaXB0b3JFdmVudC5hdG9tID0gd21fZGVsZXRlX3dpbmRvd19hdG9tOw0KICAgICAgICAgICAgdGhpcy5ub3RpZnliYXIuX3dpbmRvd3MucGVlaygpLkRlc2NyaXB0b3JFdmVudC5yZXQgPSB0aGlzLm5vdGlmeWJhcjsNCiAgICAgICAgICAgIHRoaXMubm90aWZ5YmFyLl93aW5kb3dzLnBlZWsoKS5EZXNjcmlwdG9yRXZlbnQuX2Rpc3BsYXkgPSBtW2ldLmRpc3BsYXk7DQogICAgICAgICAgICB0aGlzLm5vdGlmeWJhci5fd2luZG93cy5wZWVrKCkuRGVzY3JpcHRvckV2ZW50Lm9uKCdyZWFkc2V0JywgZnVuY3Rpb24gKGZkKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBYRSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOw0KICAgICAgICAgICAgICAgIHdoaWxlIChyZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhQZW5kaW5nKHRoaXMuX2Rpc3BsYXkpLlZhbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ21vbml0b3ItaW5mbycpLl9YMTEuWE5leHRFdmVudFN5bmModGhpcy5fZGlzcGxheSwgWEUpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoWEUuRGVyZWYoMCwgNCkudG9CdWZmZXIoKS5yZWFkVUludDMyTEUoKSA9PSBDbGllbnRNZXNzYWdlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50VHlwZSA9IFhFLkRlcmVmKHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpLlBvaW50ZXJTaXplID09IDggPyA1NiA6IDI4LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudFR5cGUgPT0gdGhpcy5hdG9tKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ0Rlc2NyaXB0b3JFdmVudHMnKS5yZW1vdmVEZXNjcmlwdG9yKGZkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKCdtb25pdG9yLWluZm8nKS5fWDExLlhDbG9zZURpc3BsYXkodGhpcy5fZGlzcGxheSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LmVtaXQoJ2Nsb3NlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll93aW5kb3dzLmNsZWFyKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KDQoNCnN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0Kew0KICAgIGNhc2UgJ3dpbjMyJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB3aW5kb3dzX25vdGlmeWJhcl9jaGVjazsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnbGludXgnOg0KICAgIGNhc2UgJ2ZyZWVic2QnOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHhfbm90aWZ5YmFyX2NoZWNrOw0KICAgICAgICBicmVhazsNCn0NCg0KDQo=', 'base64').toString());"); #ifdef _POSIX diff --git a/modules/notifybar-desktop.js b/modules/notifybar-desktop.js index f7e5314..c051aa5 100644 --- a/modules/notifybar-desktop.js +++ b/modules/notifybar-desktop.js @@ -15,6 +15,8 @@ limitations under the License. */ var ptrsize = require('_GenericMarshal').PointerSize; +var ClientMessage = 33; + function windows_notifybar_check(title) { @@ -37,7 +39,6 @@ function windows_notifybar_system(title) .createEvent('close') .addMethod('close', function close() { this.child.kill(); }); - console.log('switching'); ret.child = require('child_process').execFile(process.execPath, [process.execPath.split('\\').pop(), '-b64exec', script], { type: 1 }); ret.child.parent = ret; ret.child.stdout.on('data', function (c) { }); @@ -139,8 +140,117 @@ function windows_notifybar_local(title) } +function x_notifybar_check(title) +{ + if(require('user-sessions').Self()!=0) + { + return (x_notifybar(title)); // No Dispatching necessary + } + else + { + // We are root, so we should try to spawn a child into the user's desktop + var uid = require('user-sessions').consoleUid(); + var xinfo = require('monitor-info').getXInfo(uid); + + if (!xinfo || !xinfo.xauthority) + { + throw('XServer Initialization Error') + } + var ret = {}; + var script = Buffer.from("require('notifybar-desktop')('" + title + "').on('close', function(){process.exit();});").toString('base64'); + require('events').EventEmitter.call(ret, true) + .createEvent('close') + .addMethod('close', function close() { this.child.kill(); }); + + ret.child = require('child_process').execFile(process.execPath, [process.execPath.split('/').pop(), '-b64exec', script], { uid: uid, env: { XAUTHORITY: xinfo.xauthority, DISPLAY: xinfo.display } }); + ret.child.parent = ret; + ret.child.stdout.on('data', function (c) { }); + ret.child.stderr.on('data', function (c) { }); + ret.child.on('exit', function (code) { this.parent.emit('close', code); }); + + return (ret); + } +} + +function x_notifybar(title) +{ + ret = { _ObjectID: 'notifybar-desktop.X', title: title, _windows: [], _promise: require('monitor-info').getInfo() }; + + ret._promise.notifybar = ret; + require('events').EventEmitter.call(ret, true) + .createEvent('close') + .addMethod('close', function close() + { + }); + + ret._promise.then(function (m) + { + var offset; + var barWidth, monWidth, offset, barHeight, monHeight; + for (var i in m) + { + monWidth = (m[i].right - m[i].left); + monHeight = (m[i].bottom - m[i].top); + barWidth = Math.floor(monWidth * 0.30); + barHeight = Math.floor(monHeight * 0.035); + offset = Math.floor(monWidth * 0.50) - Math.floor(barWidth * 0.50); + start = m[i].left + offset; + console.log(start, barWidth, barHeight); + + var white = require('monitor-info')._X11.XWhitePixel(m[i].display, m[i].screenId).Val; + this.notifybar._windows.push({ + root: require('monitor-info')._X11.XRootWindow(m[i].display, m[i].screenId), + display: m[i].display, id: m[i].screedId + }); + + this.notifybar._windows.peek().notifybar = require('monitor-info')._X11.XCreateSimpleWindow(m[i].display, this.notifybar._windows.peek().root, start, 0, barWidth, 1, 0, white, white); + require('monitor-info')._X11.XStoreName(m[i].display, this.notifybar._windows.peek().notifybar, require('_GenericMarshal').CreateVariable(this.notifybar.title)); + + require('monitor-info').setWindowSizeHints(m[i].display, this.notifybar._windows.peek().notifybar, start, 0, barWidth, 1, barWidth, 1, barWidth, 1); + require('monitor-info').hideWindowIcon(m[i].display, this.notifybar._windows.peek().root, this.notifybar._windows.peek().notifybar); + + require('monitor-info').setAllowedActions(m[i].display, this.notifybar._windows.peek().notifybar, require('monitor-info').MOTIF_FLAGS.MWM_FUNC_CLOSE); + require('monitor-info').setAlwaysOnTop(m[i].display, this.notifybar._windows.peek().root, this.notifybar._windows.peek().notifybar); + + var wm_delete_window_atom = require('monitor-info')._X11.XInternAtom(m[i].display, require('_GenericMarshal').CreateVariable('WM_DELETE_WINDOW'), 0).Val; + var atoms = require('_GenericMarshal').CreateVariable(4); + atoms.toBuffer().writeUInt32LE(wm_delete_window_atom); + require('monitor-info')._X11.XSetWMProtocols(m[i].display, this.notifybar._windows.peek().notifybar, atoms, 1); + + require('monitor-info')._X11.XMapWindow(m[i].display, this.notifybar._windows.peek().notifybar); + require('monitor-info')._X11.XFlush(m[i].display); + + this.notifybar._windows.peek().DescriptorEvent = require('DescriptorEvents').addDescriptor(require('monitor-info')._X11.XConnectionNumber(m[i].display).Val, { readset: true }); + console.log(this.notifybar._windows.peek().DescriptorEvent); + this.notifybar._windows.peek().DescriptorEvent.atom = wm_delete_window_atom; + this.notifybar._windows.peek().DescriptorEvent.ret = this.notifybar; + this.notifybar._windows.peek().DescriptorEvent._display = m[i].display; + this.notifybar._windows.peek().DescriptorEvent.on('readset', function (fd) + { + var XE = require('_GenericMarshal').CreateVariable(1024); + while (require('monitor-info')._X11.XPending(this._display).Val) + { + require('monitor-info')._X11.XNextEventSync(this._display, XE); + if (XE.Deref(0, 4).toBuffer().readUInt32LE() == ClientMessage) + { + var clientType = XE.Deref(require('_GenericMarshal').PointerSize == 8 ? 56 : 28, 4).toBuffer().readUInt32LE(); + if (clientType == this.atom) + { + require('DescriptorEvents').removeDescriptor(fd); + require('monitor-info')._X11.XCloseDisplay(this._display); + ret.emit('close'); + ret._windows.clear(); + break; + } + } + } + }); + } + }); + return (ret); +} @@ -151,6 +261,7 @@ switch(process.platform) break; case 'linux': case 'freebsd': + module.exports = x_notifybar_check; break; }