From 5aff4c172ebe522d5cda860bb5d2b1ecc6cdaf5c Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Wed, 10 Jun 2020 13:49:24 -0700 Subject: [PATCH] Added power-monitor.wakeDisplay() and sleepDisplay() --- microscript/ILibDuktape_Polyfills.c | 4 +- microscript/ILibDuktape_net.c | 11 +++ modules/child-container.js | 46 +++++++------ modules/power-monitor.js | 101 ++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+), 24 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 00cfc5d..012936d 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2158,7 +2158,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) // power-monitor, refer to modules/power-monitor.js for details - duk_peval_string_noresult(ctx, "addModule('power-monitor', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24NCg0KTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQpsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiovDQoNCmZ1bmN0aW9uIHBvd2VyTW9uaXRvcigpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAncG93ZXItbW9uaXRvcic7DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdjaGFuZ2VkJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdzeCcpDQogICAgICAgIC5jcmVhdGVFdmVudCgnYmF0dGVyeUxldmVsJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdhY2RjJykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdkaXNwbGF5Jyk7DQoNCiAgICB0aGlzLl9BQ1N0YXRlID0gMTsNCiAgICB0aGlzLl9CYXR0ZXJ5TGV2ZWwgPSAtMTsNCg0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICAvLyBUaGVzZSBtdXN0IGJlIHJlZ2lzdGVyZWQgQkVGT1JFIG5ld0xpc3RlbmVyIGlzIGhvb2tlZCB1cA0KICAgICAgICB0aGlzLm9uKCdiYXR0ZXJ5TGV2ZWwnLCBmdW5jdGlvbiAobGV2ZWwpIHsgdGhpcy5fQmF0dGVyeUxldmVsID0gbGV2ZWw7IH0pOw0KICAgICAgICB0aGlzLm9uKCdhY2RjJywgZnVuY3Rpb24gKG0pIHsgdGhpcy5fQUNTdGF0ZSA9IChtID09ICdBQycgPyAxIDogMCk7IH0pOw0KICAgIH0NCg0KICAgIHRoaXMub24oJ25ld0xpc3RlbmVyJywgZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKQ0KICAgIHsNCiAgICAgICAgaWYgKG5hbWUgPT0gJ2FjZGMnKSB7IGNhbGxiYWNrLmNhbGwodGhpcywgdGhpcy5fQUNTdGF0ZSA9PSAxID8gJ0FDJyA6ICdCQVRURVJZJyk7IH0NCiAgICAgICAgaWYgKG5hbWUgPT0gJ2JhdHRlcnlMZXZlbCcpIHsgaWYgKHRoaXMuX0JhdHRlcnlMZXZlbCA+PSAwKSB7IGNhbGxiYWNrLmNhbGwodGhpcywgdGhpcy5fQmF0dGVyeUxldmVsKTsgfSB9DQogICAgfSk7DQoNCiAgICB0aGlzLl9pID0gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uIChzZWxmKQ0KICAgIHsNCiAgICAgICAgcmVxdWlyZSgndXNlci1zZXNzaW9ucycpOyAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaXMgd2hlcmUgdGhlIFdpbmRvd3MgTWVzc2FnZXMgYXJlIHByb2Nlc3NlZCBmb3IgdGhlc2UgZXZlbnRzDQogICAgICAgIGRlbGV0ZSBzZWxmLl9pOw0KICAgIH0sIHRoaXMpOw0KDQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2xpbnV4JykNCiAgICB7DQogICAgICAgIHRoaXMuX0FDUGF0aCA9IG51bGw7DQogICAgICAgIHRoaXMuX0JhdHRlcnlQYXRoID0gW107DQoNCiAgICAgICAgdmFyIGRldmljZXMgPSByZXF1aXJlKCdmcycpLnJlYWRkaXJTeW5jKCcvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseScpOw0KICAgICAgICBmb3IgKHZhciBpIGluIGRldmljZXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvJyArIGRldmljZXNbaV0gKyAnL3R5cGUnKS50b1N0cmluZygpLnRyaW0oKSA9PSAnTWFpbnMnKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX0FDUGF0aCA9ICcvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8nICsgZGV2aWNlc1tpXSArICcvJzsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IgKHZhciBpIGluIGRldmljZXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvJyArIGRldmljZXNbaV0gKyAnL3R5cGUnKS50b1N0cmluZygpLnRyaW0oKSA9PSAnQmF0dGVyeScpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fQmF0dGVyeVBhdGgucHVzaCgnL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvJyArIGRldmljZXNbaV0gKyAnLycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICh0aGlzLl9BQ1BhdGggIT0gbnVsbCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fQUNTdGF0ZSA9IHBhcnNlSW50KHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKHRoaXMuX0FDUGF0aCArICdvbmxpbmUnKS50b1N0cmluZygpLnRyaW0oKSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRoaXMuX0JhdHRlcnlQYXRoLmxlbmd0aCA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX2dldEJhdHRlcnlMZXZlbCA9IGZ1bmN0aW9uIF9nZXRCYXR0ZXJ5TGV2ZWwoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBzdW0gPSAwOw0KICAgICAgICAgICAgICAgIHZhciBpOw0KICAgICAgICAgICAgICAgIGZvciAoaSBpbiB0aGlzLl9CYXR0ZXJ5UGF0aCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHN1bSArPSBwYXJzZUludChyZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYyh0aGlzLl9CYXR0ZXJ5UGF0aFtpXSArICdjYXBhY2l0eScpLnRvU3RyaW5nKCkudHJpbSgpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgc3VtID0gTWF0aC5mbG9vcihzdW0gLyB0aGlzLl9CYXR0ZXJ5UGF0aC5sZW5ndGgpOw0KICAgICAgICAgICAgICAgIHJldHVybiAoc3VtKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuX0JhdHRlcnlMZXZlbCA9IHRoaXMuX2dldEJhdHRlcnlMZXZlbCgpOw0KDQogICAgICAgICAgICAvLyBTaW5jZSBCYXR0ZXJ5IExldmVscyBhcmUgbm90IHByb3BhZ2F0ZWQgd2l0aCBBQ1BJLCB3ZSBuZWVkIHRvIHBlcmlvZGljYWxseSBjaGVjayB0aGUgYmF0dGVyeSBsZXZlbA0KICAgICAgICAgICAgdGhpcy5fQmF0dGVyeUxldmVsQ2hlY2sgPSBmdW5jdGlvbiBfQmF0dGVyeUxldmVsQ2hlY2soKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLl9nZXRCYXR0ZXJ5TGV2ZWwoKTsNCiAgICAgICAgICAgICAgICBpZiAodmFsICE9IHRoaXMuX0JhdHRlcnlMZXZlbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuX0JhdHRlcnlMZXZlbCA9IHZhbDsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdiYXR0ZXJ5TGV2ZWwnLCB2YWwpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB0aGlzLl9CYXR0Q2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uIChzZWxmKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHNlbGYuX0JhdHRlcnlMZXZlbENoZWNrLmNhbGwoc2VsZik7DQogICAgICAgICAgICB9LCAzMDAwMDAsIHRoaXMpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuX2FjcGlTaW5rID0gZnVuY3Rpb24gX2FjcGlTaW5rKGFjcGlFdmVudCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKGFjcGlFdmVudC5uYW1lID09ICdhY19hZGFwdGVyJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBfYWNwaVNpbmsuc2VsZi5fQUNTdGF0ZSA9IGFjcGlFdmVudC52YWx1ZTsNCiAgICAgICAgICAgICAgICBfYWNwaVNpbmsuc2VsZi5lbWl0KCdhY2RjJywgYWNwaUV2ZW50LnZhbHVlID09IDEgPyAnQUMnIDogJ0JBVFRFUlknKTsNCiAgICAgICAgICAgICAgICBfYWNwaVNpbmsuc2VsZi5fQmF0dGVyeUxldmVsQ2hlY2soKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fYWNwaVNpbmsuc2VsZiA9IHRoaXM7DQogICAgICAgIHJlcXVpcmUoJ2xpbnV4LWFjcGknKS5vbignYWNwaScsIHRoaXMuX2FjcGlTaW5rKTsNCiAgICB9DQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ2RhcndpbicpDQogICAgew0KICAgICAgICB0aGlzLl9nZXRCYXR0ZXJ5TGV2ZWwgPSBmdW5jdGlvbiBfZ2V0QmF0dGVyeUxldmVsKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJwbXNldCAtZyBiYXR0IHwgdHIgJ1xcbicgJ2AnIHwgYXdrIC1GJ2AnICciKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCd7Jyk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnICAgcG93ZXI9c3BsaXQoJDEscHdyLCJBQyIpPjE/IjEiOiIwIjsnKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCcgICBzcGxpdCgkMiwgYmF0dCwgIiAiKTsnKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCcgICBzcGxpdChiYXR0WzJdLGNoZywiJSIpOycpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJyAgIHByaW50ZiAie1xcImFjXFwiOiAlcyxcXCJsZXZlbFxcIjogJXN9Iixwb3dlciwgY2hnWzFdOyAnKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ9J1xuZXhpdFxuIik7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgICAgIHJldHVybiAoaW5mbyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHsgYWM6IDEsIGxldmVsOiAtMSB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgdGhpcy5fYmF0dGVyeUxldmVsQ2hlY2sgPSBmdW5jdGlvbiBfYmF0dGVyeUxldmVsQ2hlY2soKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgbmV3TGV2ZWwgPSB0aGlzLl9nZXRCYXR0ZXJ5TGV2ZWwoKTsNCiAgICAgICAgICAgIGlmIChuZXdMZXZlbC5hYyAhPSB0aGlzLl9BQ1N0YXRlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuX0FDU3RhdGUgPSBuZXdMZXZlbC5hYzsNCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2FjZGMnLCB0aGlzLl9BQ1N0YXRlID09IDEgPyAnQUMnIDogJ0JBVFRFUlknKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChuZXdMZXZlbC5sZXZlbCAhPSB0aGlzLl9CYXR0ZXJ5TGV2ZWwpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fQmF0dGVyeUxldmVsID0gbmV3TGV2ZWwubGV2ZWw7DQogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdiYXR0ZXJ5TGV2ZWwnLCB0aGlzLl9CYXR0ZXJ5TGV2ZWwpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB2YXIgdG1wID0gdGhpcy5fZ2V0QmF0dGVyeUxldmVsKCk7DQogICAgICAgIHRoaXMuX0FDU3RhdGUgPSB0bXAuYWM7DQogICAgICAgIHRoaXMuX0JhdHRlcnlMZXZlbCA9IHRtcC5sZXZlbDsNCg0KICAgICAgICBpZiAodGhpcy5fQmF0dGVyeUxldmVsID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuX0JhdHRDaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKHNlbGYpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc2VsZi5fYmF0dGVyeUxldmVsQ2hlY2suY2FsbChzZWxmKTsNCiAgICAgICAgICAgIH0sIDMwMDAwMCwgdGhpcyk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gbmV3IHBvd2VyTW9uaXRvcigpOw0K', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('power-monitor', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24NCg0KTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQpsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiovDQoNCnZhciBXTV9TWVNDT01NQU5EID0gMHgwMTEyOw0KdmFyIFNDX01PTklUT1JQT1dFUiA9IDB4RjE3MDsNCnZhciBIV05EX0JST0FEQ0FTVCA9IDB4ZmZmZjsNCnZhciBFU19ESVNQTEFZX1JFUVVJUkVEID0gMHgwMDAwMDAwMjsNCg0KZnVuY3Rpb24gcG93ZXJNb25pdG9yKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdwb3dlci1tb25pdG9yJzsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2NoYW5nZWQnKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ3N4JykNCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdiYXR0ZXJ5TGV2ZWwnKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2FjZGMnKQ0KICAgICAgICAuY3JlYXRlRXZlbnQoJ2Rpc3BsYXknKTsNCg0KICAgIHRoaXMuX0FDU3RhdGUgPSAxOw0KICAgIHRoaXMuX0JhdHRlcnlMZXZlbCA9IC0xOw0KDQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICB7DQogICAgICAgIC8vIFRoZXNlIG11c3QgYmUgcmVnaXN0ZXJlZCBCRUZPUkUgbmV3TGlzdGVuZXIgaXMgaG9va2VkIHVwDQogICAgICAgIHRoaXMub24oJ2JhdHRlcnlMZXZlbCcsIGZ1bmN0aW9uIChsZXZlbCkgeyB0aGlzLl9CYXR0ZXJ5TGV2ZWwgPSBsZXZlbDsgfSk7DQogICAgICAgIHRoaXMub24oJ2FjZGMnLCBmdW5jdGlvbiAobSkgeyB0aGlzLl9BQ1N0YXRlID0gKG0gPT0gJ0FDJyA/IDEgOiAwKTsgfSk7DQogICAgfQ0KDQogICAgdGhpcy5vbignbmV3TGlzdGVuZXInLCBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2spDQogICAgew0KICAgICAgICBpZiAobmFtZSA9PSAnYWNkYycpIHsgY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzLl9BQ1N0YXRlID09IDEgPyAnQUMnIDogJ0JBVFRFUlknKTsgfQ0KICAgICAgICBpZiAobmFtZSA9PSAnYmF0dGVyeUxldmVsJykgeyBpZiAodGhpcy5fQmF0dGVyeUxldmVsID49IDApIHsgY2FsbGJhY2suY2FsbCh0aGlzLCB0aGlzLl9CYXR0ZXJ5TGV2ZWwpOyB9IH0NCiAgICB9KTsNCg0KICAgIHRoaXMuX2kgPSBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gKHNlbGYpDQogICAgew0KICAgICAgICByZXF1aXJlKCd1c2VyLXNlc3Npb25zJyk7IC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhpcyBpcyB3aGVyZSB0aGUgV2luZG93cyBNZXNzYWdlcyBhcmUgcHJvY2Vzc2VkIGZvciB0aGVzZSBldmVudHMNCiAgICAgICAgZGVsZXRlIHNlbGYuX2k7DQogICAgfSwgdGhpcyk7DQoNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnbGludXgnKQ0KICAgIHsNCiAgICAgICAgdGhpcy5fQUNQYXRoID0gbnVsbDsNCiAgICAgICAgdGhpcy5fQmF0dGVyeVBhdGggPSBbXTsNCg0KICAgICAgICB2YXIgZGV2aWNlcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5Jyk7DQogICAgICAgIGZvciAodmFyIGkgaW4gZGV2aWNlcykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8nICsgZGV2aWNlc1tpXSArICcvdHlwZScpLnRvU3RyaW5nKCkudHJpbSgpID09ICdNYWlucycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fQUNQYXRoID0gJy9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5LycgKyBkZXZpY2VzW2ldICsgJy8nOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGZvciAodmFyIGkgaW4gZGV2aWNlcykNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8nICsgZGV2aWNlc1tpXSArICcvdHlwZScpLnRvU3RyaW5nKCkudHJpbSgpID09ICdCYXR0ZXJ5JykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9CYXR0ZXJ5UGF0aC5wdXNoKCcvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8nICsgZGV2aWNlc1tpXSArICcvJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRoaXMuX0FDUGF0aCAhPSBudWxsKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLl9BQ1N0YXRlID0gcGFyc2VJbnQocmVxdWlyZSgnZnMnKS5yZWFkRmlsZVN5bmModGhpcy5fQUNQYXRoICsgJ29ubGluZScpLnRvU3RyaW5nKCkudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5fQmF0dGVyeVBhdGgubGVuZ3RoID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fZ2V0QmF0dGVyeUxldmVsID0gZnVuY3Rpb24gX2dldEJhdHRlcnlMZXZlbCgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHN1bSA9IDA7DQogICAgICAgICAgICAgICAgdmFyIGk7DQogICAgICAgICAgICAgICAgZm9yIChpIGluIHRoaXMuX0JhdHRlcnlQYXRoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgc3VtICs9IHBhcnNlSW50KHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKHRoaXMuX0JhdHRlcnlQYXRoW2ldICsgJ2NhcGFjaXR5JykudG9TdHJpbmcoKS50cmltKCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzdW0gPSBNYXRoLmZsb29yKHN1bSAvIHRoaXMuX0JhdHRlcnlQYXRoLmxlbmd0aCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIChzdW0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5fQmF0dGVyeUxldmVsID0gdGhpcy5fZ2V0QmF0dGVyeUxldmVsKCk7DQoNCiAgICAgICAgICAgIC8vIFNpbmNlIEJhdHRlcnkgTGV2ZWxzIGFyZSBub3QgcHJvcGFnYXRlZCB3aXRoIEFDUEksIHdlIG5lZWQgdG8gcGVyaW9kaWNhbGx5IGNoZWNrIHRoZSBiYXR0ZXJ5IGxldmVsDQogICAgICAgICAgICB0aGlzLl9CYXR0ZXJ5TGV2ZWxDaGVjayA9IGZ1bmN0aW9uIF9CYXR0ZXJ5TGV2ZWxDaGVjaygpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMuX2dldEJhdHRlcnlMZXZlbCgpOw0KICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gdGhpcy5fQmF0dGVyeUxldmVsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fQmF0dGVyeUxldmVsID0gdmFsOw0KICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JhdHRlcnlMZXZlbCcsIHZhbCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuX0JhdHRDaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKHNlbGYpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc2VsZi5fQmF0dGVyeUxldmVsQ2hlY2suY2FsbChzZWxmKTsNCiAgICAgICAgICAgIH0sIDMwMDAwMCwgdGhpcyk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5fYWNwaVNpbmsgPSBmdW5jdGlvbiBfYWNwaVNpbmsoYWNwaUV2ZW50KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoYWNwaUV2ZW50Lm5hbWUgPT0gJ2FjX2FkYXB0ZXInKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIF9hY3BpU2luay5zZWxmLl9BQ1N0YXRlID0gYWNwaUV2ZW50LnZhbHVlOw0KICAgICAgICAgICAgICAgIF9hY3BpU2luay5zZWxmLmVtaXQoJ2FjZGMnLCBhY3BpRXZlbnQudmFsdWUgPT0gMSA/ICdBQycgOiAnQkFUVEVSWScpOw0KICAgICAgICAgICAgICAgIF9hY3BpU2luay5zZWxmLl9CYXR0ZXJ5TGV2ZWxDaGVjaygpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9hY3BpU2luay5zZWxmID0gdGhpczsNCiAgICAgICAgcmVxdWlyZSgnbGludXgtYWNwaScpLm9uKCdhY3BpJywgdGhpcy5fYWNwaVNpbmspOw0KICAgIH0NCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCiAgICB7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiX2NhZmZlaW5hdGUiLCB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3doZXJlaXMgY2FmZmVpbmF0ZVxuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgIH0pKCkNCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMuX2dldEJhdHRlcnlMZXZlbCA9IGZ1bmN0aW9uIF9nZXRCYXR0ZXJ5TGV2ZWwoKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoInBtc2V0IC1nIGJhdHQgfCB0ciAnXFxuJyAnYCcgfCBhd2sgLUYnYCcgJyIpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3snKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCcgICBwb3dlcj1zcGxpdCgkMSxwd3IsIkFDIik+MT8iMSI6IjAiOycpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJyAgIHNwbGl0KCQyLCBiYXR0LCAiICIpOycpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJyAgIHNwbGl0KGJhdHRbMl0sY2hnLCIlIik7Jyk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnICAgcHJpbnRmICJ7XFwiYWNcXCI6ICVzLFxcImxldmVsXFwiOiAlc30iLHBvd2VyLCBjaGdbMV07ICcpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIn0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBpbmZvID0gSlNPTi5wYXJzZShjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIChpbmZvKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoIChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiAoeyBhYzogMSwgbGV2ZWw6IC0xIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICB0aGlzLl9iYXR0ZXJ5TGV2ZWxDaGVjayA9IGZ1bmN0aW9uIF9iYXR0ZXJ5TGV2ZWxDaGVjaygpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBuZXdMZXZlbCA9IHRoaXMuX2dldEJhdHRlcnlMZXZlbCgpOw0KICAgICAgICAgICAgaWYgKG5ld0xldmVsLmFjICE9IHRoaXMuX0FDU3RhdGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5fQUNTdGF0ZSA9IG5ld0xldmVsLmFjOw0KICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWNkYycsIHRoaXMuX0FDU3RhdGUgPT0gMSA/ICdBQycgOiAnQkFUVEVSWScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5ld0xldmVsLmxldmVsICE9IHRoaXMuX0JhdHRlcnlMZXZlbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLl9CYXR0ZXJ5TGV2ZWwgPSBuZXdMZXZlbC5sZXZlbDsNCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JhdHRlcnlMZXZlbCcsIHRoaXMuX0JhdHRlcnlMZXZlbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHZhciB0bXAgPSB0aGlzLl9nZXRCYXR0ZXJ5TGV2ZWwoKTsNCiAgICAgICAgdGhpcy5fQUNTdGF0ZSA9IHRtcC5hYzsNCiAgICAgICAgdGhpcy5fQmF0dGVyeUxldmVsID0gdG1wLmxldmVsOw0KDQogICAgICAgIGlmICh0aGlzLl9CYXR0ZXJ5TGV2ZWwgPj0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5fQmF0dENoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoc2VsZikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzZWxmLl9iYXR0ZXJ5TGV2ZWxDaGVjay5jYWxsKHNlbGYpOw0KICAgICAgICAgICAgfSwgMzAwMDAwLCB0aGlzKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICB0aGlzLnNsZWVwRGlzcGxheSA9IGZ1bmN0aW9uIHNsZWVwRGlzcGF5KGZvcmNlKQ0KICAgIHsNCiAgICAgICAgdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7DQogICAgICAgIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnd2luMzInKSB7IHAuX3JlaignTm90IHN1cHBvcnRlZCcpOyByZXR1cm4gKHApOyB9DQoNCiAgICAgICAgaWYgKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFdlIGFyZSBydW5uaW5nIGFzIExvY2FsU3lzdGVtLCBzbyB3ZSBoYXZlIHRvIGZpbmQgYSB1c2VyIHNlc3Npb24gZm9yIHRoaXMgdG8gd29yaw0KICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7IGxhdW5jaDogeyBtb2R1bGU6ICdwb3dlci1tb25pdG9yJywgbWV0aG9kOiAnc2xlZXBEaXNwbGF5JywgYXJnczogW10gfSB9Ow0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3B0aW9ucy51c2VyID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2goZWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcC5fcmVqKCdObyB1c2VycyBsb2dnZWQgaW4nKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKHApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkLWNvbnRhaW5lcicpLmNyZWF0ZShvcHRpb25zKTsNCiAgICAgICAgICAgIHAuY2hpbGQucHJvbWlzZSA9IHA7DQogICAgICAgICAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkgeyB0aGlzLnByb21pc2UuX3JlcygpOyB9KTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChyZXF1aXJlKCdjaGlsZC1jb250YWluZXInKS5jaGlsZCkgeyByZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTsgfQ0KICAgICAgICAgICAgdmFyIEdNID0gcmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJyk7DQogICAgICAgICAgICB2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ1VzZXIzMi5kbGwnKTsNCiAgICAgICAgICAgIHVzZXIzMi5DcmVhdGVNZXRob2QoJ1NlbmRNZXNzYWdlQScpOw0KICAgICAgICAgICAgdXNlcjMyLlNlbmRNZXNzYWdlQShIV05EX0JST0FEQ0FTVCwgV01fU1lTQ09NTUFORCwgU0NfTU9OSVRPUlBPV0VSLCAyKTsNCiAgICAgICAgICAgIHAuX3JlcygpOw0KICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2NoaWxkLWNvbnRhaW5lcicpLmNoaWxkKSB7IHByb2Nlc3MuX2V4aXQoKTsgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiAocCk7DQogICAgfTsNCiAgICB0aGlzLndha2VEaXNwbGF5ID0gZnVuY3Rpb24gd2FrZURpc3BsYXkoKQ0KICAgIHsNCiAgICAgICAgdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7DQogICAgICAgIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FmZmVpbmF0ZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHAuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUodGhpcy5fY2FmZmVpbmF0ZSwgWydjYWZmZWluYXRlJywgJy11JywgJy10IDInXSk7DQogICAgICAgICAgICAgICAgICAgIHAuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgcC5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgdGhpcy5wcm9taXNlLl9yZXMoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIHAuY2hpbGQucHJvbWlzZSA9IHA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnd2luMzInOg0KICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0UHJvY2Vzc093bmVyTmFtZShwcm9jZXNzLnBpZCkudHNpZCA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHJ1bm5pbmcgYXMgTG9jYWxTeXN0ZW0sIHNvIHdlIGhhdmUgdG8gZmluZCBhIHVzZXIgc2Vzc2lvbiBmb3IgdGhpcyB0byB3b3JrDQogICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0geyBsYXVuY2g6IHsgbW9kdWxlOiAncG93ZXItbW9uaXRvcicsIG1ldGhvZDogJ3dha2VEaXNwbGF5JywgYXJnczogW10gfSB9Ow0KICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51c2VyID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFVzZXJuYW1lKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5jb25zb2xlVWlkKCkpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcC5fcmVqKCdObyB1c2VycyBsb2dnZWQgaW4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkLWNvbnRhaW5lcicpLmNyZWF0ZShvcHRpb25zKTsNCiAgICAgICAgICAgICAgICAgICAgcC5jaGlsZC5wcm9taXNlID0gcDsNCiAgICAgICAgICAgICAgICAgICAgcC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5wcm9taXNlLl9yZXMoKTsgfSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlKCdjaGlsZC1jb250YWluZXInKS5jaGlsZCkgeyByZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTsgfQ0KICAgICAgICAgICAgICAgICAgICB2YXIgR00gPSByZXF1aXJlKCdfR2VuZXJpY01hcnNoYWwnKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGtlcm5lbDMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ0tlcm5lbDMyLmRsbCcpOw0KICAgICAgICAgICAgICAgICAgICBrZXJuZWwzMi5DcmVhdGVNZXRob2QoJ1NldFRocmVhZEV4ZWN1dGlvblN0YXRlJyk7DQogICAgICAgICAgICAgICAgICAgIGtlcm5lbDMyLlNldFRocmVhZEV4ZWN1dGlvblN0YXRlKEVTX0RJU1BMQVlfUkVRVUlSRUQpOw0KICAgICAgICAgICAgICAgICAgICBwLl9yZXMoKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmUoJ2NoaWxkLWNvbnRhaW5lcicpLmNoaWxkKSB7IHByb2Nlc3MuX2V4aXQoKTsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgcC5fcmVzKCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChwKTsNCiAgICB9Ow0KfQ0KDQptb2R1bGUuZXhwb3J0cyA9IG5ldyBwb3dlck1vbml0b3IoKTsNCg==', 'base64').toString());"); // service-manager, which on linux has a dependency on user-sessions and process-manager. Refer to /modules folder for human readable versions. duk_peval_string_noresult(ctx, "addModule('process-manager', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE4IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOw0KdmFyIFRIMzJDU19TTkFQUFJPQ0VTUyA9IDB4MDI7DQp2YXIgVEgzMkNTX1NOQVBNT0RVTEUzMiA9IDB4MTA7DQp2YXIgVEgzMkNTX1NOQVBNT0RVTEUgPSAweDA4Ow0KdmFyIFBST0NFU1NfUVVFUllfTElNSVRFRF9JTkZPUk1BVElPTiA9IDB4MTAwMDsNCg0KDQovLyBVc2VkIG9uIFdpbmRvd3MgYW5kIExpbnV4IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBydW5uaW5nIHByb2Nlc3Nlcw0KZnVuY3Rpb24gcHJvY2Vzc01hbmFnZXIoKSB7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAncHJvY2Vzcy1tYW5hZ2VyJzsgLy8gVXNlZCBmb3IgZGVidWdnaW5nLCBhbGxvd3MgeW91IHRvIGdldCB0aGUgb2JqZWN0IHR5cGUgYXQgcnVudGltZS4NCiAgICANCiAgICAvLyBTZXR1cCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgY2FsbHMuDQogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgIHsNCiAgICAgICAgY2FzZSAnd2luMzInOg0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIgPSBHTS5DcmVhdGVOYXRpdmVQcm94eSgna2VybmVsMzIuZGxsJyk7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0Nsb3NlSGFuZGxlJyk7DQogICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DcmVhdGVNZXRob2QoJ0dldExhc3RFcnJvcicpOw0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdDcmVhdGVUb29saGVscDMyU25hcHNob3QnKTsNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnTW9kdWxlMzJGaXJzdFcnKTsNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnTW9kdWxlMzJOZXh0VycpOw0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdPcGVuUHJvY2VzcycpOw0KICAgICAgICAgICAgdGhpcy5fa2VybmVsMzIuQ3JlYXRlTWV0aG9kKCdQcm9jZXNzMzJGaXJzdFcnKTsNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUHJvY2VzczMyTmV4dFcnKTsNCiAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNyZWF0ZU1ldGhvZCgnUXVlcnlGdWxsUHJvY2Vzc0ltYWdlTmFtZVcnKTsNCiAgICAgICAgICAgIGJyZWFrOw0KCWNhc2UgJ2ZyZWVic2QnOg0KICAgICAgICBjYXNlICdsaW51eCc6DQogICAgICAgIGNhc2UgJ2Rhcndpbic6DQogICAgICAgICAgICB0aGlzLl9jaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHRocm93IChwcm9jZXNzLnBsYXRmb3JtICsgJyBub3Qgc3VwcG9ydGVkJyk7DQogICAgICAgICAgICBicmVhazsNCiAgICB9DQogICAgdGhpcy5lbnVtZXJhdGVQcm9jZXNzZXMgPSBmdW5jdGlvbiBlbnVtZXJhdGVQcm9jZXNzZXMoKQ0KICAgIHsNCiAgICAgICAgdmFyIHByb21pc2UgPSByZXF1aXJlKCdwcm9taXNlJyk7DQogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICByZXQuY2FsbGJhY2sgPSBmdW5jdGlvbiBjYWxsYmFjayhwcykNCiAgICAgICAgew0KICAgICAgICAgICAgY2FsbGJhY2sucHJvbS5fcmVzKHBzKTsNCiAgICAgICAgfQ0KICAgICAgICByZXQuY2FsbGJhY2sucHJvbSA9IHJldDsNCiAgICAgICAgdGhpcy5nZXRQcm9jZXNzZXMocmV0LmNhbGxiYWNrKTsNCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH0NCiAgICAvLyBSZXR1cm4gYSBvYmplY3Qgb2Y6IHBpZCAtPiBwcm9jZXNzIGluZm9ybWF0aW9uLg0KICAgIHRoaXMuZ2V0UHJvY2Vzc2VzID0gZnVuY3Rpb24gZ2V0UHJvY2Vzc2VzKGNhbGxiYWNrKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQogICAgICAgIHsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgdGhyb3cgKCdFbnVtZXJhdGluZyBwcm9jZXNzZXMgb24gJyArIHByb2Nlc3MucGxhdGZvcm0gKyAnIG5vdCBzdXBwb3J0ZWQnKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ3dpbjMyJzogLy8gV2luZG93cyBwcm9jZXNzZXMNCiAgICAgICAgICAgICAgICB2YXIgcGlkOw0KICAgICAgICAgICAgICAgIHZhciByZXRWYWwgPSB7fTsNCiAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXMuX2tlcm5lbDMyLkNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdChUSDMyQ1NfU05BUFBST0NFU1MsIDApOw0KICAgICAgICAgICAgICAgIHZhciBpbmZvID0gR00uQ3JlYXRlVmFyaWFibGUoR00uUG9pbnRlclNpemUgPT0gOCA/IDU2OCA6IDU1Nik7DQogICAgICAgICAgICAgICAgdmFyIGZ1bGxwYXRoID0gR00uQ3JlYXRlVmFyaWFibGUoMjA0OCk7DQogICAgICAgICAgICAgICAgdmFyIHBhdGhTaXplID0gR00uQ3JlYXRlVmFyaWFibGUoNCk7DQogICAgICAgICAgICAgICAgdmFyIHBoOw0KDQogICAgICAgICAgICAgICAgaW5mby50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoaW5mby5fc2l6ZSwgMCk7DQogICAgICAgICAgICAgICAgdmFyIG5leHRQcm9jZXNzID0gdGhpcy5fa2VybmVsMzIuUHJvY2VzczMyRmlyc3RXKGgsIGluZm8pOw0KICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0UHJvY2Vzcy5WYWwpIA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcGlkID0gaW5mby5EZXJlZig4LCA0KS50b0J1ZmZlcigpLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW3BpZF0gPSB7IHBpZDogcGlkLCBjbWQ6IGluZm8uRGVyZWYoR00uUG9pbnRlclNpemUgPT0gNCA/IDM2IDogNDQsIDI2MCkuV2lkZTJVVEY4IH07DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKChwaCA9IHRoaXMuX2tlcm5lbDMyLk9wZW5Qcm9jZXNzKFBST0NFU1NfUVVFUllfTElNSVRFRF9JTkZPUk1BVElPTiwgMCwgcGlkKSkuVmFsICE9IC0xKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoU2l6ZS50b0J1ZmZlcigpLndyaXRlVUludDMyTEUoZnVsbHBhdGguX3NpemUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2tlcm5lbDMyLlF1ZXJ5RnVsbFByb2Nlc3NJbWFnZU5hbWVXKHBoLCAwLCBmdWxscGF0aCwgcGF0aFNpemUpLlZhbCAhPSAwKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbFtwaWRdLnBhdGggPSBmdWxscGF0aC5XaWRlMlVURjg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXJuZWwzMi5DbG9zZUhhbmRsZShwaCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXRWYWxbcGlkXS51c2VyID0gcmVxdWlyZSgndXNlci1zZXNzaW9ucycpLmdldFByb2Nlc3NPd25lck5hbWUocGlkKS5uYW1lOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoKGVlKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIG5leHRQcm9jZXNzID0gdGhpcy5fa2VybmVsMzIuUHJvY2VzczMyTmV4dFcoaCwgaW5mbyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuX2tlcm5lbDMyLkNsb3NlSGFuZGxlKGgpOw0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjay5hcHBseSh0aGlzLCBbcmV0VmFsXSk7IH0NCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJ2xpbnV4JzogLy8gTGludXggcHJvY2Vzc2VzDQogICAgICAgICAgICAgICAgdmFyIHAgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIHAuc3Rkb3V0LnN0ciA9ICcnOyBwLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgcC5zdGRlcnIuc3RyID0gJyc7IHAuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdwcyAtYXggLW8gcGlkIC1vIHVzZXI6OTkgLW8gY29tbWFuZCB8IHRyICcgKyAiJ1xcbicgJ1xcdCcgfCBhd2sgLUYiICsgJyJcXHQiIFwneyBwcmludGYgInsiOyBmb3IoaT0yO2k8TkY7KytpKSB7IHNwbGl0KCRpLHRvaywiICIpOyBwaWQ9dG9rWzFdOyB1c2VyPXRva1syXTsgY21kPXN1YnN0cigkaSxsZW5ndGgodG9rWzFdKSsxMDIpOyBnc3ViKC9cXFxcLywiXFxcXFxcXFwmIixjbWQpOyBnc3ViKC8iLywiXFxcXFxcXFwmIixjbWQpOyBnc3ViKC9eWyBdKy8sIiIsY21kKTsgcHJpbnRmICIlc1xcIiVzXFwiOntcXCJwaWRcXCI6XFwiJXNcXCIsXFwidXNlclxcIjpcXCIlc1xcIixcXCJjbWRcXCI6XFwiJXNcXCJ9IiwoaSE9Mj8iLCI6IiIpLHBpZCxwaWQsdXNlcixjbWQ7IH0gcHJpbnRmICJ9IjsgfVwnXG5leGl0XG4nKTsNCiAgICAgICAgICAgICAgICBwLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwLmFyZ3MgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsgcC5hcmdzLnB1c2goYXJndW1lbnRzW2ldKTsgfQ0KDQogICAgICAgICAgICAgICAgICAgIHAuYXJncy51bnNoaWZ0KEpTT04ucGFyc2UocC5zdGRvdXQuc3RyKSk7DQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIHAuYXJncyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgY2FzZSAnZnJlZWJzZCc6DQogICAgICAgICAgICAgICAgdmFyIHAgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgIHAuc3Rkb3V0LnN0ciA9ICcnOyBwLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgcC5zdGRlcnIuc3RyID0gJyc7IHAuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdwcyAtYXhvIHBpZCAtbyB1c2VyIC1vIGNvbW1hbmQgfCB0ciAnICsgIidcXG4nICdcXHQnIHwgYXdrIC1GIiArICciXFx0IiBcJ3sgcHJpbnRmICJ7IjsgZm9yKGk9MjtpPE5GOysraSkgeyBnc3ViKC9eWyBdKy8sIiIsJGkpOyBzcGxpdCgkaSx0b2ssIiAiKTsgcGlkPXRva1sxXTsgdXNlcj10b2tbMl07IGNtZD1zdWJzdHIoJGksbGVuZ3RoKHRva1sxXSkrbGVuZ3RoKHRva1syXSkrMik7IGdzdWIoL1xcXFwvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoLyIvLCJcXFxcXFxcXCYiLGNtZCk7IGdzdWIoL15bIF0rLywiIixjbWQpOyBwcmludGYgIiVzXFwiJXNcXCI6e1xcInBpZFxcIjpcXCIlc1xcIixcXCJ1c2VyXFwiOlxcIiVzXFwiLFxcImNtZFxcIjpcXCIlc1xcIn0iLChpIT0yPyIsIjoiIikscGlkLHBpZCx1c2VyLGNtZDsgfSBwcmludGYgIn0iOyB9XCdcbmV4aXRcbicpOw0KICAgICAgICAgICAgICAgIHAud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHAuYXJncyA9IFtdOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeyBwLmFyZ3MucHVzaChhcmd1bWVudHNbaV0pOyB9DQoNCiAgICAgICAgICAgICAgICAgICAgcC5hcmdzLnVuc2hpZnQoSlNPTi5wYXJzZShwLnN0ZG91dC5zdHIpKTsNCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgcC5hcmdzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwcm9jZXNzIG9uIExpbnV4DQogICAgdGhpcy5nZXRQcm9jZXNzSW5mbyA9IGZ1bmN0aW9uIGdldFByb2Nlc3NJbmZvKHBpZCkNCiAgICB7DQogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHRocm93ICgnZ2V0UHJvY2Vzc0luZm8oKSBub3Qgc3VwcG9ydGVkIGZvciAnICsgcHJvY2Vzcy5wbGF0Zm9ybSk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlICdsaW51eCc6DQogICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKCcvcHJvYy8nICsgcGlkICsgJy9zdGF0dXMnKTsNCiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHt9Ow0KICAgICAgICAgICAgICAgIHZhciBsaW5lcyA9IHN0YXR1cy50b1N0cmluZygpLnNwbGl0KCdcbicpOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8bGluZXMubGVuZ3RoOysraSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBsaW5lc1tpXS5zcGxpdCgnOicpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDEpIHsgdG9rZW5zWzFdID0gdG9rZW5zWzFdLnRyaW0oKTsgfQ0KICAgICAgICAgICAgICAgICAgICBpbmZvW3Rva2Vuc1swXV0gPSB0b2tlbnNbMV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiAoaW5mbyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9Ow0KDQogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnd2luMzInKQ0KICAgIHsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfcGdyZXAnLCB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzIHBncmVwIHwgYXdrICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICAgICAgfSkoKQ0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAodGhpcy5fcGdyZXAgIT0gJycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMuZ2V0UHJvY2VzcyA9IGZ1bmN0aW9uIGdldFByb2Nlc3MoY21kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgicGdyZXAgZ25vbWUtc2Vzc2lvbiB8IHRyICdcXG4nICdcXHQnIHwiICsgJyBhd2sgLUYiXFx0IiBcJ3sgcHJpbnRmICJbIjsgZm9yKGk9MTtpPE5GOysraSkgeyBpZihpPjEpIHsgcHJpbnRmICIsIjsgfSBwcmludGYgIiVkIiwgJGk7IH0gcHJpbnRmICJdIjsgfVwnJyk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuc3RkZXJyLnN0ciAhPSAnJykgeyB0aHJvdyAoY2hpbGQuc3RkZXJyLnN0ci50cmltKCkpOyB9DQogICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpID09ICcnKSB7IHRocm93IChjbWQgKyAnIG5vdCBmb3VuZCcpOyB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gKEpTT04ucGFyc2UoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpKTsNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCg0KICAgICAgICB0aGlzLmdldFByb2Nlc3NFeCA9IGZ1bmN0aW9uIGdldFByb2Nlc3NFeChjbWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgncHMgLWF4IC1vIHBpZCAtbyBjb21tYW5kIHwgZ3JlcCAnICsgY21kICsgIiB8IHRyICdcXG4nICdcXHQnIHwgYXdrIC1GIiArICciXFx0IiBcJ3sgcHJpbnRmICJbIjsgZm9yKGk9MTtpPE5GOysraSkgeyBzcGxpdCgkaSxyLCIgIik7IGlmKHJbMl0hPSJncmVwIikgeyBpZihpPjEpIHsgcHJpbnRmICIsIjsgfSBwcmludGYgIiVzIiwgclsxXTsgfSB9IHByaW50ZiAiXSI7IH1cJycpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1xuZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICBpZiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkgPT0gJycpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgKGNtZCArICcgbm90IGZvdW5kJyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIChKU09OLnBhcnNlKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCm1vZHVsZS5leHBvcnRzID0gbmV3IHByb2Nlc3NNYW5hZ2VyKCk7DQo=', 'base64').toString());"); @@ -2213,7 +2213,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) free(_taskscheduler); // Child-Container, refer to modules/child-container.js - duk_peval_string_noresult(ctx, "addModule('child-container', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGNoaWxkQ29udGFpbmVyKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdjaGlsZC1jb250YWluZXInOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICAgICAgdmFyIGlwY0ludGVnZXI7DQoNCiAgICAgICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9Ow0KICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ3JlYWR5JykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnZGlzY29ubmVjdCcsIGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3QgY2hpbGQgPT4nKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9jbGllbnQuZW5kKCk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnZXhpdCcsIHZhbHVlOiBjb2RlIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAob2JqKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xpZW50KSB7IHRocm93ICgnTm90IENvbm5lY3RlZCcpOyB9DQogICAgICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQoNCiAgICAgICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkob2JqKSk7DQogICAgICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50LndyaXRlKGgpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudC53cml0ZShkKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCAiZGVzY3JpcHRvck1ldGFkYXRhIiwgew0KICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2xpZW50KSB7IHRoaXMuX2NsaWVudC5kZXNjcmlwdG9yTWV0YWRhdGEgPSB2OyB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2MpIHsgdGhpcy5fcHJvYy5kZXNjcmlwdG9yTWV0YWRhdGEgPSB2OyB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7ICAgICAgIA0KICAgICAgICByZXQuX2lwYy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IGNvbnNvbGUubG9nKCdDaGlsZCBDb250YWluZXIgUHJvY2VzcyBDbG9zZWQnKTsgfSk7DQoNCiAgICAgICAgd2hpbGUgKHRydWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChvcHRpb25zLl9kZWJ1Z0lQQyAmJiBvcHRpb25zLl9pcGNJbnRlZ2VyICE9IG51bGwpDQogICAgICAgICAgICB7IGlwY0ludGVnZXIgPSBvcHRpb25zLl9pcGNJbnRlZ2VyOyB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaXBjSW50ZWdlciA9IHJlcXVpcmUoJ3RscycpLmdlbmVyYXRlUmFuZG9tSW50ZWdlcignMTAwMCcsICc5OTk5Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX2lwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjSW50ZWdlcjsNCg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoICh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKG9wdGlvbnMuX2lwY0ludGVnZXIgIT0gbnVsbCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEZWJ1Z0Vycm9yOiBVbmFibGUgdG8gYmluZCB0byBJUEMgY2hhbm5lbDogJyArIGlwY0ludGVnZXIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHZhciBzY3JpcHQgPSBCdWZmZXIuZnJvbSgiY29uc29sZS5sb2coJ0NISUxEL1NUQVJUJyk7cmVxdWlyZSgnY2hpbGQtY29udGFpbmVyJykuY29ubmVjdCgnIiArIGlwY0ludGVnZXIgKyAiJyk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KICAgICAgICByZXQuX2lwYy5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHMuZGVzY3JpcHRvck1ldGFkYXRhID0gJ2NoaWxkLWNvbnRhaW5lcic7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5fY2xpZW50ID0gczsNCiAgICAgICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7DQogICAgICAgICAgICB2YXIgZGF0YTsNCiAgICAgICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGRhdGEgPSB7IGNvbW1hbmQ6ICdhZGRNb2R1bGUnLCB2YWx1ZTogeyBuYW1lOiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXNbbV0ubmFtZSwganM6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5zY3JpcHQgfSB9Ow0KICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnNlbmQoZGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGRhdGEgPSB7IGNvbW1hbmQ6ICdsYXVuY2gnLCB2YWx1ZTogeyBtb2R1bGU6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1vZHVsZSwgbWV0aG9kOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tZXRob2QsIGFyZ3M6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLmFyZ3MgfSB9Ow0KICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChkYXRhKTsNCiAgICAgICAgICAgIHMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY0xlbjsNCiAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPCA0IHx8IChjTGVuID0gYy5yZWFkVUludDMyTEUoMCkpID4gYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMpOyByZXR1cm47IH0NCiAgICAgICAgICAgICAgICB2YXIgY21kID0gSlNPTi5wYXJzZShjLnNsaWNlKDQsIGNMZW4pLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5wYXJlbnQuZW1pdCgnbWVzc2FnZScsIGNtZC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdyZWFkeScpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBpZiAob3B0aW9ucy5fZGVidWdJUEMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctYjY0ZXhlYyAnICsgc2NyaXB0KTsNCiAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFNwYXduIHRoZSBjaGlsZA0KICAgICAgICBpZihvcHRpb25zLnVzZXIgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBVc2UgVGFzayBTY2hlZHVsZXINCiAgICAgICAgICAgIHZhciBwYXJtcyA9ICcvQyBTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwICc7DQogICAgICAgICAgICBwYXJtcyArPSAoJy9SVSAnICsgb3B0aW9ucy51c2VyICsgJyAnKTsNCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1RSICJcXCInICsgcHJvY2Vzcy5leGVjUGF0aCArICdcXCIgLWI2NGV4ZWMgJyArIHNjcmlwdCArICciJyk7DQoNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFtwYXJtc10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgWydjbWQnXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9SVU4gL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvREVMRVRFIC9GIC9UTiBNZXNoVXNlclRhc2tcclxuZXhpdFxyXG4nKTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB2YXIgY2hpbGRfb3B0aW9ucyA9IHt9Ow0KICAgICAgICAgICAgaWYob3B0aW9ucy51aWQgIT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgdHNpZDsNCiAgICAgICAgICAgICAgICBpZiAoKHRzaWQgPSByZXF1aXJlKCd1c2VyLXNlc3Npb25zJykuZ2V0UHJvY2Vzc093bmVyTmFtZShwcm9jZXNzLnBpZCkudHNpZCkgPT0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBydW5uaW5nIGFzIExvY2FsU3lzdGVtDQogICAgICAgICAgICAgICAgICAgIGNoaWxkX29wdGlvbnMudWlkID0gb3B0aW9ucy51aWQ7DQogICAgICAgICAgICAgICAgICAgIGNoaWxkX29wdGlvbnMudHlwZSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5TcGF3blR5cGVzLlVTRVI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIC8vIFdlIHdvbid0IGJlIGFibGUgdG8gc3dpdGNoIHNlc3Npb24gSURzLCBzbyBjaGVjayB0byBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgYXMgdGhpcyBzaWQNCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lkICE9IHRzaWQpIHsgdGhyb3cgKCdJbnN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byBydW4gYXMgdGhpcyB1c2VyJyk7IH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXQuX3Byb2MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5leGVjUGF0aCwgW3Byb2Nlc3MuZXhlY1BhdGguc3BsaXQocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ1xcJyA6ICcvJykucG9wKCksICctYjY0ZXhlYycsIHNjcmlwdF0sIGNoaWxkX29wdGlvbnMpOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLmRlc2NyaXB0b3JNZXRhZGF0YSA9ICJjaGlsZC1jb250YWluZXIiOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLnBhcmVudCA9IHJldDsNCiAgICAgICAgICAgIHJldC5fcHJvYy5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIHJldC5fcHJvYy5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIHJldC5fcHJvYy5vbignZXhpdCcsIGZ1bmN0aW9uIChjb2RlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2V4aXQnLCBjb2RlKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAocmV0KTsNCiAgICB9DQogICAgdGhpcy5jb25uZWN0ID0gZnVuY3Rpb24gKGlwY051bWJlcikNCiAgICB7DQogICAgICAgIHZhciBpcGNQYXRoID0gJ1xcXFwuXFxwaXBlXFx0YXNrUmVkaXJlY3Rpb24tJyArIGlwY051bWJlcjsNCiAgICAgICAgdGhpcy5faXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuX2V4aXQoMCk7IH0pOw0KICAgICAgICAgICAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjTGVuOw0KICAgICAgICAgICAgICAgIGlmIChjLmxlbmd0aCA8IDQgfHwgKGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKSkgPiBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYyk7IHJldHVybjsgfQ0KDQogICAgICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNtZC5jb21tYW5kKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWRkTW9kdWxlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vZHVsZShjbWQudmFsdWUubmFtZSwgY21kLnZhbHVlLmpzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXVuY2gnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHJlcXVpcmUoY21kLnZhbHVlLm1vZHVsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bHQgPSBvYmpbY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkob2JqLCBjbWQudmFsdWUuYXJncyk7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0KCdtZXNzYWdlJywgY21kLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdfZGlzY29ubmVjdCc6DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY29ubmVjdGluZy4uLicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICdleGl0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5lbWl0KCdleGl0Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZWUpDQogICAgICAgICAgICAgICAgICAgICAgICB7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuX2V4aXQoMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLl9pcGNDbGllbnQuX3BhcmVudCA9IHRoaXM7DQoNCiAgICAgICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwodGhpcywgdHJ1ZSkNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnbWVzc2FnZScpDQogICAgICAgICAgICAuY3JlYXRlRXZlbnQoJ2V4aXQnKQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnbWVzc2FnZScsIGZ1bmN0aW9uIChtc2cpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5zZW5kKHsgY29tbWFuZDogJ21lc3NhZ2UnLCB2YWx1ZTogbXNnIH0pOw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIC5hZGRNZXRob2QoJ3NlbmQnLCBmdW5jdGlvbiAoZGF0YSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lwY0NsaWVudCkgeyB0aHJvdyAoJ05vdCBDb25uZWN0ZWQnKTsgfQ0KICAgICAgICAgICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOw0KDQogICAgICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRhdGEpKTsNCiAgICAgICAgICAgICAgICBoLndyaXRlVUludDMyTEUoZC5sZW5ndGggKyA0KTsNCiAgICAgICAgICAgICAgICB0aGlzLl9pcGNDbGllbnQud3JpdGUoaCk7DQogICAgICAgICAgICAgICAgdGhpcy5faXBjQ2xpZW50LndyaXRlKGQpOw0KICAgICAgICAgICAgfSk7DQogICAgfTsNCn0NCg0KDQptb2R1bGUuZXhwb3J0cyA9IG5ldyBjaGlsZENvbnRhaW5lcigpOw==', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('child-container', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGNoaWxkQ29udGFpbmVyKCkNCnsNCiAgICB0aGlzLl9PYmplY3RJRCA9ICdjaGlsZC1jb250YWluZXInOw0KICAgIHRoaXMuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpDQogICAgew0KICAgICAgICBpZiAoIW9wdGlvbnMgfHwgKCFvcHRpb25zLnVzZXIgJiYgIW9wdGlvbnMudWlkKSB8fCAhb3B0aW9ucy5sYXVuY2ggfHwgIW9wdGlvbnMubGF1bmNoLm1vZHVsZSB8fCAhb3B0aW9ucy5sYXVuY2gubWV0aG9kIHx8ICFvcHRpb25zLmxhdW5jaC5hcmdzKSB7IHRocm93ICgnSW52YWxpZCBQYXJhbWV0ZXJzJyk7IH0NCg0KICAgICAgICB2YXIgaXBjSW50ZWdlcjsNCg0KICAgICAgICB2YXIgcmV0ID0geyBvcHRpb25zOiBvcHRpb25zIH07DQogICAgICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHJldCwgdHJ1ZSkNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgncmVhZHknKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdtZXNzYWdlJykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnZXhpdCcpDQogICAgICAgICAgICAuYWRkTWV0aG9kKCdkaXNjb25uZWN0JywgZnVuY3Rpb24gKCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRGlzY29ubmVjdCBjaGlsZCA9PicpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2NsaWVudC5lbmQoKTsNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAuYWRkTWV0aG9kKCdtZXNzYWdlJywgZnVuY3Rpb24gKG1zZykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnbWVzc2FnZScsIHZhbHVlOiBtc2cgfSk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnZXhpdCcsIGZ1bmN0aW9uIChjb2RlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuc2VuZCh7IGNvbW1hbmQ6ICdleGl0JywgdmFsdWU6IGNvZGUgfSk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnc2VuZCcsIGZ1bmN0aW9uIChvYmopDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jbGllbnQpIHsgdGhyb3cgKCdOb3QgQ29ubmVjdGVkJyk7IH0NCiAgICAgICAgICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCg0KICAgICAgICAgICAgICAgIGQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShvYmopKTsNCiAgICAgICAgICAgICAgICBoLndyaXRlVUludDMyTEUoZC5sZW5ndGggKyA0KTsNCiAgICAgICAgICAgICAgICB0aGlzLl9jbGllbnQud3JpdGUoaCk7DQogICAgICAgICAgICAgICAgdGhpcy5fY2xpZW50LndyaXRlKGQpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsICJkZXNjcmlwdG9yTWV0YWRhdGEiLCB7DQogICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jbGllbnQpIHsgdGhpcy5fY2xpZW50LmRlc2NyaXB0b3JNZXRhZGF0YSA9IHY7IH0NCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvYykgeyB0aGlzLl9wcm9jLmRlc2NyaXB0b3JNZXRhZGF0YSA9IHY7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIHJldC5faXBjID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjLnBhcmVudCA9IHJldDsgICAgICAgDQogICAgICAgIHJldC5faXBjLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgdGhpcy5wYXJlbnQuZW1pdCgnZXhpdCcpOyB9KTsNCg0KICAgICAgICB3aGlsZSAodHJ1ZSkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKG9wdGlvbnMuX2RlYnVnSVBDICYmIG9wdGlvbnMuX2lwY0ludGVnZXIgIT0gbnVsbCkNCiAgICAgICAgICAgIHsgaXBjSW50ZWdlciA9IG9wdGlvbnMuX2lwY0ludGVnZXI7IH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpcGNJbnRlZ2VyID0gcmVxdWlyZSgndGxzJykuZ2VuZXJhdGVSYW5kb21JbnRlZ2VyKCcxMDAwJywgJzk5OTknKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOw0KDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXQuX2lwYy5saXN0ZW4oeyBwYXRoOiByZXQuX2lwY1BhdGgsIHdyaXRhYmxlQWxsOiB0cnVlIH0pOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKHgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYob3B0aW9ucy5faXBjSW50ZWdlciAhPSBudWxsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RlYnVnRXJyb3I6IFVuYWJsZSB0byBiaW5kIHRvIElQQyBjaGFubmVsOiAnICsgaXBjSW50ZWdlcik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdmFyIHNjcmlwdCA9IEJ1ZmZlci5mcm9tKCJjb25zb2xlLmxvZygnQ0hJTEQvU1RBUlQnKTtyZXF1aXJlKCdjaGlsZC1jb250YWluZXInKS5jb25uZWN0KCciICsgaXBjSW50ZWdlciArICInKTsiKS50b1N0cmluZygnYmFzZTY0Jyk7DQogICAgICAgIHJldC5faXBjLm9uY2UoJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiBvbkNvbm5lY3QocykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5jbG9zZSgpOw0KICAgICAgICAgICAgcy5kZXNjcmlwdG9yTWV0YWRhdGEgPSAnY2hpbGQtY29udGFpbmVyJzsNCiAgICAgICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOw0KICAgICAgICAgICAgdGhpcy5wYXJlbnQuX2NsaWVudC5fcGFyZW50ID0gdGhpczsNCiAgICAgICAgICAgIHZhciBkYXRhOw0KICAgICAgICAgICAgZm9yICh2YXIgbSBpbiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZGF0YSA9IHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH07DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChkYXRhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZGF0YSA9IHsgY29tbWFuZDogJ2xhdW5jaCcsIHZhbHVlOiB7IG1vZHVsZTogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubW9kdWxlLCBtZXRob2Q6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1ldGhvZCwgYXJnczogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2guYXJncyB9IH07DQogICAgICAgICAgICB0aGlzLnBhcmVudC5zZW5kKGRhdGEpOw0KICAgICAgICAgICAgcy5vbignZGF0YScsIGZ1bmN0aW9uIChjKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciBjTGVuOw0KICAgICAgICAgICAgICAgIGlmIChjLmxlbmd0aCA8IDQgfHwgKGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKSkgPiBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYyk7IHJldHVybjsgfQ0KICAgICAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2UnOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LnBhcmVudC5lbWl0KCdtZXNzYWdlJywgY21kLnZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ3JlYWR5Jyk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChvcHRpb25zLl9kZWJ1Z0lQQykNCiAgICAgICAgew0KICAgICAgICAgICAgY29uc29sZS5sb2coJy1iNjRleGVjICcgKyBzY3JpcHQpOw0KICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gU3Bhd24gdGhlIGNoaWxkDQogICAgICAgIGlmKG9wdGlvbnMudXNlciAmJiBwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFVzZSBUYXNrIFNjaGVkdWxlcg0KICAgICAgICAgICAgdmFyIHBhcm1zID0gJy9DIFNDSFRBU0tTIC9DUkVBVEUgL0YgL1ROIE1lc2hVc2VyVGFzayAvU0MgT05DRSAvU1QgMDA6MDAgJzsNCiAgICAgICAgICAgIHBhcm1zICs9ICgnL1JVICcgKyBvcHRpb25zLnVzZXIgKyAnICcpOw0KICAgICAgICAgICAgcGFybXMgKz0gKCcvVFIgIlxcIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJ1xcIiAtYjY0ZXhlYyAnICsgc2NyaXB0ICsgJyInKTsNCg0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxjbWQuZXhlJywgW3Bhcm1zXSk7DQogICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXGNtZC5leGUnLCBbJ2NtZCddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7DQogICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnU0NIVEFTS1MgL1JVTiAvVE4gTWVzaFVzZXJUYXNrXHJcbicpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG5leGl0XHJcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZF9vcHRpb25zID0ge307DQogICAgICAgICAgICBpZihvcHRpb25zLnVpZCAhPSBudWxsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB0c2lkOw0KICAgICAgICAgICAgICAgIGlmICgodHNpZCA9IHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkKSA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHJ1bm5pbmcgYXMgTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgICAgICAgICAgY2hpbGRfb3B0aW9ucy51aWQgPSBvcHRpb25zLnVpZDsNCiAgICAgICAgICAgICAgICAgICAgY2hpbGRfb3B0aW9ucy50eXBlID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLlNwYXduVHlwZXMuVVNFUjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd29uJ3QgYmUgYWJsZSB0byBzd2l0Y2ggc2Vzc2lvbiBJRHMsIHNvIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBhcyB0aGlzIHNpZA0KICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaWQgIT0gdHNpZCkgeyB0aHJvdyAoJ0luc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIHJ1biBhcyB0aGlzIHVzZXInKTsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldC5fcHJvYyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmV4ZWNQYXRoLCBbcHJvY2Vzcy5leGVjUGF0aC5zcGxpdChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnXFwnIDogJy8nKS5wb3AoKSwgJy1iNjRleGVjJywgc2NyaXB0XSwgY2hpbGRfb3B0aW9ucyk7DQogICAgICAgICAgICByZXQuX3Byb2MuZGVzY3JpcHRvck1ldGFkYXRhID0gImNoaWxkLWNvbnRhaW5lciI7DQogICAgICAgICAgICByZXQuX3Byb2MucGFyZW50ID0gcmV0Ow0KICAgICAgICAgICAgcmV0Ll9wcm9jLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IH0pOw0KICAgICAgICAgICAgcmV0Ll9wcm9jLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnZXhpdCcsIGNvZGUpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgIH0NCiAgICB0aGlzLmNvbm5lY3QgPSBmdW5jdGlvbiAoaXBjTnVtYmVyKQ0KICAgIHsNCiAgICAgICAgdmFyIGlwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjTnVtYmVyOw0KICAgICAgICB0aGlzLl9pcGNDbGllbnQgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVDb25uZWN0aW9uKHsgcGF0aDogaXBjUGF0aCB9KTsNCiAgICAgICAgdGhpcy5faXBjQ2xpZW50Ll9wYXJlbnQgPSB0aGlzOw0KICAgICAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzLCB0cnVlKQ0KICAgICAgICAgICAgLmNyZWF0ZUV2ZW50KCdtZXNzYWdlJykNCiAgICAgICAgICAgIC5jcmVhdGVFdmVudCgnZXhpdCcpDQogICAgICAgICAgICAuYWRkTWV0aG9kKCdtZXNzYWdlJywgZnVuY3Rpb24gKG1zZykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aGlzLnNlbmQoeyBjb21tYW5kOiAnbWVzc2FnZScsIHZhbHVlOiBtc2cgfSk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLmFkZE1ldGhvZCgnc2VuZCcsIGZ1bmN0aW9uIChkYXRhKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5faXBjQ2xpZW50KSB7IHRocm93ICgnTm90IENvbm5lY3RlZCcpOyB9DQogICAgICAgICAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7DQoNCiAgICAgICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoZGF0YSkpOw0KICAgICAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgICAgIHRoaXMuX2lwY0NsaWVudC53cml0ZShoKTsNCiAgICAgICAgICAgICAgICB0aGlzLl9pcGNDbGllbnQud3JpdGUoZCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjaGlsZCcsIHsgdmFsdWU6IHRydWUgfSk7DQogICAgICAgIHRoaXMuX2lwY0NsaWVudC5vbignY29ubmVjdCcsIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLl9leGl0KDApOyB9KTsNCiAgICAgICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY0xlbjsNCiAgICAgICAgICAgICAgICBpZiAoYy5sZW5ndGggPCA0IHx8IChjTGVuID0gYy5yZWFkVUludDMyTEUoMCkpID4gYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMpOyByZXR1cm47IH0NCg0KICAgICAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7DQogICAgICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FkZE1vZHVsZSc6DQogICAgICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGUoY21kLnZhbHVlLm5hbWUsIGNtZC52YWx1ZS5qcyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGF1bmNoJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSByZXF1aXJlKGNtZC52YWx1ZS5tb2R1bGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdWx0ID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWVzc2FnZSc6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdCgnbWVzc2FnZScsIGNtZC52YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnX2Rpc2Nvbm5lY3QnOg0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3RpbmcuLi4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXhpdCc6DQogICAgICAgICAgICAgICAgICAgICAgICB0cnkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuZW1pdCgnZXhpdCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVlKQ0KICAgICAgICAgICAgICAgICAgICAgICAgeyB9DQogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLl9leGl0KDApOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICB9Ow0KfQ0KDQoNCm1vZHVsZS5leHBvcnRzID0gbmV3IGNoaWxkQ29udGFpbmVyKCk7', 'base64').toString());"); // message-box, refer to modules/message-box.js char *_messagebox = ILibMemory_Allocate(87229, 0, NULL, NULL); diff --git a/microscript/ILibDuktape_net.c b/microscript/ILibDuktape_net.c index e51ec10..2b31212 100644 --- a/microscript/ILibDuktape_net.c +++ b/microscript/ILibDuktape_net.c @@ -956,9 +956,20 @@ BOOL ILibDuktape_server_ipc_ReadSink(void *chain, HANDLE h, ILibWaitHandle_Error else { // I/O Errors + if (winIPC->mServer != NULL) { winIPC->clientConnected = 0; } if (winIPC->reservedState != NULL) { ILibChain_WaitHandle_DestroySavedState(chain, winIPC->reservedState); winIPC->reservedState = NULL; } ILibDuktape_DuplexStream_Closed(winIPC->ds); + + duk_push_heapptr(winIPC->ctx, winIPC->mServer); // [server] + if (duk_has_prop_string(winIPC->ctx, -1, ILibDuktape_net_server_closed_needEmit)) + { + ILibDuktape_EventEmitter_SetupEmit(winIPC->ctx, winIPC->mServer, "close"); // [server][emit][this][close] + if (duk_pcall_method(winIPC->ctx, 1) != 0) { ILibDuktape_Process_UncaughtExceptionEx(winIPC->ctx, "net.ipcServer.onClose() Error: "); } + duk_pop(winIPC->ctx); // [server] + } + duk_pop(winIPC->ctx); // ... + return(FALSE); } } diff --git a/modules/child-container.js b/modules/child-container.js index b1af59f..3c7d2a9 100644 --- a/modules/child-container.js +++ b/modules/child-container.js @@ -20,7 +20,7 @@ function childContainer() this._ObjectID = 'child-container'; this.create = function create(options) { - if (!options || !options.launch || !options.launch.module || !options.launch.method || !options.launch.args) { throw ('Invalid Parameters'); } + if (!options || (!options.user && !options.uid) || !options.launch || !options.launch.module || !options.launch.method || !options.launch.args) { throw ('Invalid Parameters'); } var ipcInteger; @@ -60,7 +60,7 @@ function childContainer() } }); ret._ipc = require('net').createServer(); ret._ipc.parent = ret; - ret._ipc.on('close', function () { console.log('Child Container Process Closed'); }); + ret._ipc.on('close', function () { this.parent.emit('exit'); }); while (true) { @@ -89,6 +89,7 @@ function childContainer() var script = Buffer.from("console.log('CHILD/START');require('child-container').connect('" + ipcInteger + "');").toString('base64'); ret._ipc.once('connection', function onConnect(s) { + this.close(); s.descriptorMetadata = 'child-container'; this.parent._client = s; this.parent._client._parent = this; @@ -179,7 +180,27 @@ function childContainer() this.connect = function (ipcNumber) { var ipcPath = '\\\\.\\pipe\\taskRedirection-' + ipcNumber; - this._ipcClient = require('net').createConnection({ path: ipcPath }, function () + this._ipcClient = require('net').createConnection({ path: ipcPath }); + this._ipcClient._parent = this; + require('events').EventEmitter.call(this, true) + .createEvent('message') + .createEvent('exit') + .addMethod('message', function (msg) + { + this.send({ command: 'message', value: msg }); + }) + .addMethod('send', function (data) + { + if (!this._ipcClient) { throw ('Not Connected'); } + var d, h = Buffer.alloc(4); + + d = Buffer.from(JSON.stringify(data)); + h.writeUInt32LE(d.length + 4); + this._ipcClient.write(h); + this._ipcClient.write(d); + }); + Object.defineProperty(this, 'child', { value: true }); + this._ipcClient.on('connect', function () { this.on('close', function () { process._exit(0); }); this.on('data', function (c) @@ -219,25 +240,6 @@ function childContainer() if (cLen < c.length) { this.unshift(c.slice(cLen)); } }); }); - this._ipcClient._parent = this; - - require('events').EventEmitter.call(this, true) - .createEvent('message') - .createEvent('exit') - .addMethod('message', function (msg) - { - this.send({ command: 'message', value: msg }); - }) - .addMethod('send', function (data) - { - if (!this._ipcClient) { throw ('Not Connected'); } - var d, h = Buffer.alloc(4); - - d = Buffer.from(JSON.stringify(data)); - h.writeUInt32LE(d.length + 4); - this._ipcClient.write(h); - this._ipcClient.write(d); - }); }; } diff --git a/modules/power-monitor.js b/modules/power-monitor.js index c428c66..300afe7 100644 --- a/modules/power-monitor.js +++ b/modules/power-monitor.js @@ -14,6 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ +var WM_SYSCOMMAND = 0x0112; +var SC_MONITORPOWER = 0xF170; +var HWND_BROADCAST = 0xffff; +var ES_DISPLAY_REQUIRED = 0x00000002; + function powerMonitor() { this._ObjectID = 'power-monitor'; @@ -115,6 +120,16 @@ function powerMonitor() } if (process.platform == 'darwin') { + Object.defineProperty(this, "_caffeinate", { + value: (function () + { + var child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stdin.write('whereis caffeinate\nexit\n'); + child.waitExit(); + return (child.stdout.str.trim()); + })() + }); this._getBatteryLevel = function _getBatteryLevel() { var child = require('child_process').execFile('/bin/sh', ['sh']); @@ -165,6 +180,92 @@ function powerMonitor() }, 300000, this); } } + this.sleepDisplay = function sleepDispay(force) + { + var promise = require('promise'); + p = new promise(function (res, rej) { this._res = res; this._rej = rej; }); + if (process.platform != 'win32') { p._rej('Not supported'); return (p); } + + if (require('user-sessions').getProcessOwnerName(process.pid).tsid == 0) + { + // We are running as LocalSystem, so we have to find a user session for this to work + var options = { launch: { module: 'power-monitor', method: 'sleepDisplay', args: [] } }; + try + { + options.user = require('user-sessions').getUsername(require('user-sessions').consoleUid()); + } + catch(ee) + { + p._rej('No users logged in'); + return (p); + } + p.child = require('child-container').create(options); + p.child.promise = p; + p.child.on('exit', function () { this.promise._res(); }); + } + else + { + if (require('child-container').child) { require('win-console').hide(); } + var GM = require('_GenericMarshal'); + var user32 = GM.CreateNativeProxy('User32.dll'); + user32.CreateMethod('SendMessageA'); + user32.SendMessageA(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2); + p._res(); + if (require('child-container').child) { process._exit(); } + } + return (p); + }; + this.wakeDisplay = function wakeDisplay() + { + var promise = require('promise'); + p = new promise(function (res, rej) { this._res = res; this._rej = rej; }); + switch(process.platform) + { + case 'darwin': + if (this._caffeinate) + { + p.child = require('child_process').execFile(this._caffeinate, ['caffeinate', '-u', '-t 2']); + p.child.stdout.on('data', function () { }); + p.child.stderr.on('data', function () { }); + p.child.on('exit', function (code) { this.promise._res(); }); + p.child.promise = p; + } + break; + case 'win32': + if (require('user-sessions').getProcessOwnerName(process.pid).tsid == 0) + { + // We are running as LocalSystem, so we have to find a user session for this to work + var options = { launch: { module: 'power-monitor', method: 'wakeDisplay', args: [] } }; + try + { + options.user = require('user-sessions').getUsername(require('user-sessions').consoleUid()); + } + catch (ee) + { + p._rej('No users logged in'); + return (p); + } + p.child = require('child-container').create(options); + p.child.promise = p; + p.child.on('exit', function () { this.promise._res(); }); + } + else + { + if (require('child-container').child) { require('win-console').hide(); } + var GM = require('_GenericMarshal'); + var kernel32 = GM.CreateNativeProxy('Kernel32.dll'); + kernel32.CreateMethod('SetThreadExecutionState'); + kernel32.SetThreadExecutionState(ES_DISPLAY_REQUIRED); + p._res(); + if (require('child-container').child) { process._exit(); } + } + break; + default: + p._res(); + break; + } + return (p); + }; } module.exports = new powerMonitor();