diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index e901c96..7efccac 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2085,11 +2085,12 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgpmdW5jdGlvbiBkaXNwYXRjaChvcHRpb25zKQp7CiAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubW9kdWxlcyB8fCAhb3B0aW9ucy5sYXVuY2ggfHwgIW9wdGlvbnMubGF1bmNoLm1vZHVsZSB8fCAhb3B0aW9ucy5sYXVuY2gubWV0aG9kIHx8ICFvcHRpb25zLmxhdW5jaC5hcmdzKSB7IHRocm93ICgnSW52YWxpZCBQYXJhbWV0ZXJzJyk7IH0KCiAgICB2YXIgaXBjSW50ZWdlcgogICAgdmFyIHJldCA9IHsgb3B0aW9uczogb3B0aW9ucyB9OwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKS5jcmVhdGVFdmVudCgnY29ubmVjdGlvbicpOwoKICAgIHJldC5faXBjID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlU2VydmVyKCk7IHJldC5faXBjLnBhcmVudCA9IHJldDsKICAgIHJldC5faXBjMiA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYzIucGFyZW50ID0gcmV0OwogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyB9KTsKICAgIHJldC5faXBjMi5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7IH0pOwoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAgIGlwY0ludGVnZXIgPSByZXF1aXJlKCd0bHMnKS5nZW5lcmF0ZVJhbmRvbUludGVnZXIoJzEwMDAnLCAnOTk5OScpOwogICAgICAgIHJldC5faXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGNJbnRlZ2VyOwogICAgICAgIAogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsKICAgICAgICAgICAgcmV0Ll9pcGMyLmxpc3Rlbih7IHBhdGg6IHJldC5faXBjUGF0aCArICdDJywgd3JpdGFibGVBbGw6IHRydWUgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoeCkKICAgICAgICB7CiAgICAgICAgfQogICAgfQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsKICAgIHJldC5faXBjMi5vbmNlKCdjb25uZWN0aW9uJywgZnVuY3Rpb24gb25Db25uZWN0KHMpCiAgICB7DQogICAgICAgIHRoaXMucGFyZW50Ll9jb250cm9sID0gczsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NvbnRyb2wuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHRoaXMucGFyZW50Lmludm9rZSA9IGZ1bmN0aW9uIChtZXRob2QsIGFyZ3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOwogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnaW52b2tlJywgdmFsdWU6IHsgbWV0aG9kOiBtZXRob2QsIGFyZ3M6IGFyZ3MgfSB9KSk7CiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGgpOwogICAgICAgICAgICB0aGlzLl9jb250cm9sLndyaXRlKGQpOw0KICAgICAgICB9Ow0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgIH0pOwogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQogICAgewogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOwogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7CiAgICAgICAgdmFyIGQsIGggPSBCdWZmZXIuYWxsb2MoNCk7CgogICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQogICAgICAgIHsKICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsKICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7CiAgICAgICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgICAgIHMud3JpdGUoZCk7CiAgICAgICAgfQoKICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnbGF1bmNoJywgdmFsdWU6IHsgbW9kdWxlOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tb2R1bGUsIG1ldGhvZDogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubWV0aG9kLCBhcmdzOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5hcmdzIH0gfSkpOwogICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOwogICAgICAgIHMud3JpdGUoaCk7CiAgICAgICAgcy53cml0ZShkKTsKICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOwogICAgICAgIHRoaXMucGFyZW50LmVtaXQoJ2Nvbm5lY3Rpb24nLCBzKTsKICAgIH0pOwoKICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOwogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgfSk7CiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsKCiAgICBpZiAob3B0aW9ucy51c2VyKQogICAgewogICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSAnICsgb3B0aW9ucy51c2VyICsgJyAvVFIgIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJyAtYjY0ZXhlYyAnICsgc3RyICsgJyJcclxuJyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKHJlcXVpcmUoJ3VzZXItc2Vzc2lvbnMnKS5nZXRQcm9jZXNzT3duZXJOYW1lKHByb2Nlc3MucGlkKS50c2lkID09IDApCiAgICAgICAgew0KICAgICAgICAgICAgLy8gTG9jYWxTeXN0ZW0NCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9SVSBTWVNURU0gL1RSICInICsgcHJvY2Vzcy5leGVjUGF0aCArICcgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIFJ1bm5pbmcgYXMgbG9nZ2VkIGluIHVzZXINCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvQ1JFQVRFIC9GIC9UTiBNZXNoVXNlclRhc2sgL1NDIE9OQ0UgL1NUIDAwOjAwIC9UUiAiJyArIHByb2Nlc3MuZXhlY1BhdGggKyAnIC1iNjRleGVjICcgKyBzdHIgKyAnIlxyXG4nKTsNCiAgICAgICAgfQogICAgfQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9SVU4gL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsKICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvREVMRVRFIC9GIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7CiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxyXG4nKTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CiAgICAKCiAgICByZXR1cm4gKHJldCk7Cn0KCmZ1bmN0aW9uIGNvbm5lY3QoaXBjKQp7CiAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGM7CiAgICBnbG9iYWwuaXBjMkNsaWVudCA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZUNvbm5lY3Rpb24oeyBwYXRoOiBpcGNQYXRoICsgJ0MnIH0sIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjTGVuID0gYy5yZWFkVUludDMyTEUoMCk7CiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOwogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsKICAgICAgICAgICAgc3dpdGNoIChjbWQuY29tbWFuZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICdpbnZva2UnOgogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW1bY21kLnZhbHVlLm1ldGhvZF0uYXBwbHkoZ2xvYmFsLl9wcm94eVN0cmVhbSwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNMZW4gPCBjLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoYy5zbGljZShjTGVuKSk7IH0NCiAgICAgICAgfSk7DQogICAgfSk7CiAgICBnbG9iYWwuaXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkKICAgIHsKICAgICAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpCiAgICAgICAgewogICAgICAgICAgICB2YXIgY0xlbiA9IGMucmVhZFVJbnQzMkxFKDApOwogICAgICAgICAgICBpZiAoY0xlbiA+IGMubGVuZ3RoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0aGlzLnVuc2hpZnQoYyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjbWQgPSBKU09OLnBhcnNlKGMuc2xpY2UoNCwgY0xlbikudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2FkZE1vZHVsZSc6CiAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKGNtZC52YWx1ZS5uYW1lLCBjbWQudmFsdWUuanMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGF1bmNoJzoKICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gcmVxdWlyZShjbWQudmFsdWUubW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtID0gb2JqW2NtZC52YWx1ZS5tZXRob2RdLmFwcGx5KG9iaiwgY21kLnZhbHVlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGdsb2JhbC5fcHJveHlTdHJlYW0ucGlwZSh0aGlzLCB7IGVuZDogZmFsc2UgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlKGdsb2JhbC5fcHJveHlTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTsKCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChjTGVuIDwgYy5sZW5ndGgpIHsgdGhpcy51bnNoaWZ0KGMuc2xpY2UoY0xlbikpOyB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKbW9kdWxlLmV4cG9ydHMgPSB7IGRpc3BhdGNoOiBkaXNwYXRjaCwgY29ubmVjdDogY29ubmVjdCB9OwoK', 'base64').toString());"); // win-firewall is a helper to Modify Windows Firewall Filters. Refer to modules/win-firewall.js - char *_winfirewall = ILibMemory_Allocate(46481, 0, NULL, NULL); - memcpy_s(_winfirewall + 0, 26560, "LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgd2lucmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7CgovL2F0dGFjaERlYnVnZ2VyKHsgd2VicG9ydDogOTk5NSwgd2FpdDogdHJ1ZSB9KS50aGVuKGNvbnNvbGUubG9nLCBjb25zb2xlLmxvZyk7CgpmdW5jdGlvbiBuZXRzZWN1cml0eUV4aXN0cygpDQp7DQogICAgdmFyIGNoaWxkOw0KICAgIHZhciBjb21tYW5kID0gJ0dldC1Nb2R1bGUgLUxpc3RBdmFpbGFibGUgLU5hbWUgbmV0c2VjdXJpdHknOwogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIgIT0gJycpOw0KfQoKZnVuY3Rpb24gcGFyc2VDbWRsZXRPdXRwdXQoZGF0YSkKewogICAgdmFyIHRvdWNoZWQ7CiAgICB2YXIgcmV0ID0gW107CiAgICB2YXIgY2h1bmtzID0gZGF0YS50cmltKCkuc3BsaXQoJ1xyXG5cclxuJyk7CiAgICB2YXIgbGluZXMsIHgsIG9iajsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIG9iaiA9IHt9OyB0b3VjaGVkID0gZmFsc2U7CiAgICAgICAgbGluZXMgPSBjaHVua3NbaV0uc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGluZXMubGVuZ3RoOyArK3gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZCA9IGxpbmVzW3hdLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgdmFyIGtleSA9IGxpbmVzW3hdLnN1YnN0cmluZygwLCBkKS50cmltKCk7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxpbmVzW3hdLnN1YnN0cmluZyhkICsgMSkudHJpbSgpOwogICAgICAgICAgICBpZiAoa2V5ICE9ICIiKSB7IG9ialtrZXldID0gdmFsdWU7IHRvdWNoZWQgPSB0cnVlOyB9CiAgICAgICAgfQogICAgICAgIGlmICh0b3VjaGVkKSB7IHJldC5wdXNoKG9iaik7IH0KICAgIH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBmZXRjaFBvcnRGaWx0ZXJzKHJ1bGVzKQp7CiAgICB2YXIgaTsKICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpCiAgICB7CiAgICAgICAgcnVsZXMgPSBbcnVsZXNdOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgZmlsdGVyID0gd2lucmVnLlF1ZXJ5S2V5KHdpbnJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxTaGFyZWRBY2Nlc3NcXFBhcmFtZXRlcnNcXEZpcmV3YWxsUG9saWN5XFxGaXJld2FsbFJ1bGVzJywgcnVsZXNbaV0uTmFtZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGZlKQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9CiAgICAgICAgdG9rZW5zID0gZmlsdGVyLnNwbGl0KCd8Jyk7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRva2Vucy5sZW5ndGg7ICsraykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgodG9rZW5YID0gdG9rZW5zW2tdLmluZGV4T2YoJz0nKSkgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2Vuc1trXS5zdWJzdHJpbmcoMCwgdG9rZW5YKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdQcm90b2NvbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlByb3RvY29sID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTFBvcnQnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Mb2NhbFBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdSUG9ydCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlJlbW90ZVBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdBcHAnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Qcm9ncmFtID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGdldEZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHAsIHRydWUpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdmaXJld2FsbFJ1bGUnKTsKCiAgICB2YXIgcmV0VmFsID0gW10sIGZpbHRlciA9IFtdOwogICAgdmFyIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkgeyBjb21tYW5kID0gJ0dldC1OZXRGaXJld2FsbEFwcGxpY2F0aW9uRmlsdGVyIC1Qcm9ncmFtIFxcIicgKyBvcHRpb25zLlByb2dyYW0gKyAnXFwiIHwgJyArIGNvbW1hbmQ7IH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgcC5vcHRpb25zID0gb3B0aW9uczsKICAgIHAuY2hpbGQucGFyZW50ID0gcDsKICAgIHAuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKQogICAgewogICAgICAgIHZhciBjb21tYW5kOwogICAgICAgIHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsKICAgICAgICBpZih0aGlzLnBhcmVudC5wYXJlbnQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJyk+MCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBpZigoaT10aGlzLnN0ci5pbmRleE9mKCdcclxuXHJcbicpKT49MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpbHRlciwgaywgdG9rZW5zLCB0b2tlblg7CiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMuc3RyLnN1YnN0cmluZygwLCBpKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGkgKyA0KTsKCiAgICAgICAgICAgICAgICBqID0gcGFyc2VDbWRsZXRPdXRwdXQoaik7CiAgICAgICAgICAgICAgICBmZXRjaFBvcnRGaWx0ZXJzKGopOwoKICAgICAgICAgICAgICAgIGZvcihpPTA7aTxqLmxlbmd0aDsrK2kpCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5wYXJlbnQuZW1pdCgnZmlyZXdhbGxSdWxlJywgaltpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIHAuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBwLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CgogICAgcC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgICAgdmFyIGNvbW1hbmQsIGksIGosIGNoaWxkLCBmaWx0ZXI7CiAgICAgICAgaWYgKHRoaXMuc3RkZXJyLnN0ci50cmltKCkgIT0gIiIpIHsgdGhpcy5wYXJlbnQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsgcmV0dXJuOyB9CgogICAgICAgIGlmICh0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudC5fcmVzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBvYmpBcnIgPSBwYXJzZUNtZGxldE91dHB1dCh0aGlzLnN0ZG91dC5zdHIpOwogICAgICAgIGZldGNoUG9ydEZpbHRlcnMob2JqQXJyKTsKICAgICAgICB0aGlzLnBhcmVudC5fcmVzKG9iakFycik7CiAgICB9KTsKCiAgICByZXR1cm4gKHApOwp9CgoKZnVuY3Rpb24gZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgdmFyIGNvbW1hbmQgPSAnRGlzYWJsZS1OZXRGaXJld2FsbFJ1bGUnOwogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0KCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyICE9ICcnKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVqKHRoaXMuc3RkZXJyLnN0ci50cmltKCkpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgcmV0dXJuIChyZXQpOwp9CgpmdW5jdGlvbiBlbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpCnsKICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9CgogICAgdmFyIGNvbW1hbmQgPSAnRW5hYmxlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIHZlcmlmeVZhbHVlcyhvcHRpb25zSW5wdXQsIGtleU5hbWUsIGtleVZhbHVlcywgZGVmYXVsdFZhbHVlKQp7CiAgICB2YXIgaSwgaiwgdG1wLCBvazsKICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zSW5wdXQpCiAgICB7CiAgICAgICAgaWYoa2V5TmFtZS50b0xvd2VyQ2FzZSgpID09IGtleS50b0xvd2VyQ2FzZSgpKQogICAgICAgIHsKICAgICAgICAgICAgdG1wID0gb3B0aW9uc0lucHV0W2tleV07CiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zSW5wdXRba2V5XTsKCiAgICAgICAgICAgIGlmIChrZXlWYWx1ZXMgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gdG1wOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRtcCE9bnVsbCkgeyB0bXAgPSB0bXAudG9TdHJpbmcoKS5zcGxpdCgnLCcpOyB9CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG1wLmxlbmd0aDsgKytqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxrZXlWYWx1ZXMubGVuZ3RoOysraSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRtcFtqXS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zSW5wdXRba2V5TmFtZV0gPSAob3B0aW9uc0lucHV0W2tleU5hbWVdID09IG51bGwgPyBrZXlWYWx1ZXNbaV0gOiAob3B0aW9uc0lucHV0W2tleU5hbWVdICsgJywgJyArIGtleVZhbHVlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB2YWx1ZSBmb3IgWycgKyBrZXlOYW1lICsgJ106ICcgKyB0bXBbal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zSW5wdXRba2V5TmFtZV0gIT0gbnVsbCkgeyByZXR1cm47IH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuLi4gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcHV0IGluIGEgZGVmYXVsdCB2YWx1ZQogICAgaWYoZGVmYXVsdFZhbHVlICE9IG51bGwpCiAgICB7CiAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gZGVmYXVsdFZhbHVlOwogICAgfQp9CgpmdW5jdGlvbiByZW1hcFZhbHVlcyhvYmosIG9sZG5hbWUsIG5ld25hbWUsIHRhYmxlKQp7DQogICAgaWYob2JqW29sZG5hbWVdICE9IG51bGwpDQogICAgew0KICAgICAgICB2YXIgdmFsdWUgPSBvYmpbb2xkbmFtZV07DQogICAgICAgIGRlbGV0ZSBvYmpbb2xkbmFtZV0NCg0KICAgICAgICBpZighdGFibGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHZhbHVlOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJywnKSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdmFsdWVdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB2YWx1ZS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8dG9rZW5zLmxlbmd0aDsrK2kpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZihvYmpbbmV3bmFtZV0gPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdG9rZW5zW2ldLnRyaW0oKV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBvYmpbbmV3bmFtZV0gPSAob2JqW25ld25hbWVdICsgJywgJyArIHRhYmxlW3Rva2Vuc1tpXS50cmltKCldKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0KCmZ1bmN0aW9uIGNvbnZlcnROZXRzaFZhbHVlcyhvYmopCnsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSdWxlIE5hbWUnLCAnTmFtZScpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0VuYWJsZWQnLCAnRW5hYmxlZCcsIHsgTm86ICdGYWxzZScsIFllczogJ1RydWUnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGVzJywgJ1Byb2ZpbGUnLCB7IEFueTogJ0FueScsIERvbWFpbjogJ0RvbWFpbicsIFB1YmxpYzogJ1B1YmxpYycsIFByaXZhdGU6ICdQcml2YXRlJyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdFZGdlIHRyYXZlcnNhbCcsICdFZGdlVHJhdmVyc2FsUG9saWN5JywgeyBObzogJ0Jsb2NrJywgWWVzOiAnQWxsb3cnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0RpcmVjdGlvbicsICdEaXJlY3Rpb24nLCB7IEluOiAnSW5ib3VuZCcsIE91dDogJ091dGJvdW5kJyB9KTsNCn0KCmZ1bmN0aW9uIGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpCnsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnQWN0aW9uJywgWydOb3RDb25maWd1cmVkJywgJ0FsbG93JywgJ0Jsb2NrJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdBdXRoZW50aWNhdGlvbicsIFsnTm90UmVxdWlyZWQnLCAnUmVxdWlyZWQnLCAnTm9FbmNhcCddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRGVzY3JpcHRpb24nKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRGlyZWN0aW9uJywgWydJbmJvdW5kJywgJ091dGJvdW5kJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEaXNwbGF5TmFtZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdEeW5hbWljVGFyZ2V0JywgWydBbnknLCAnUHJveGltaXR5QXBwcycsICdQcm94", 16000); - memcpy_s(_winfirewall + 16000, 10560, "aW1pdHlTaGFyaW5nJywgJ1dpZmlEaXJlY3RQcmludGluZycsICdXaWZpRGlyZWN0RGlzcGxheScsICdXaWZpRGlyZWN0RGV2aWNlcyddLCAnQW55Jyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VkZ2VUcmF2ZXJzYWxQb2xpY3knLCBbJ0Jsb2NrJywgJ0FsbG93JywgJ0RlZmVyVG9Vc2VyJywgJ0RlZmVyVG9BcHAnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuYWJsZWQnLCBbJ1RydWUnLCAnRmFsc2UnXSwgJ1RydWUnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRW5jcnlwdGlvbicsIFsnTm90UmVxdWlyZWQnLCAnUmVxdWlyZWQnLCAnRHluYW1pYyddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnSW50ZXJmYWNlVHlwZScsIFsnQW55JywgJ1dpcmVkJywgJ1dpcmVsZXNzJywgJ1JlbW90ZUFjY2Vzc10nXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbEFkZHJlc3MnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9jYWxPbmx5TWFwcGluZycsIFsnVHJ1ZScsICdGYWxzZSddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9jYWxQb3J0Jyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsVXNlcicpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb29zZVNvdXJjZU1hcHBpbmcnLCBbJ1RydWUnLCAnRmFsc2UnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ05hbWUnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3ZlcnJpZGVCbG9ja1J1bGVzJywgWydUcnVlJywgJ0ZhbHNlJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdPd25lcicpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQYWNrYWdlJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BsYXRmb3JtJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1BvbGljeVN0b3JlJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb2ZpbGUnLCBbJ0FueScsICdEb21haW4nLCAnUHJpdmF0ZScsICdQdWJsaWMnLCAnTm90QXBwbGljYWJsZSddLCAnQW55Jyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb2dyYW0nKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUHJvdG9jb2wnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUmVtb3RlQWRkcmVzcycpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVNYWNoaW5lJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1JlbW90ZVBvcnQnKTsKICAgIAogICAgcmV0dXJuIChvcHRpb25zKTsKfQoKZnVuY3Rpb24gcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgaWYgKHR5cGVvZiAob3B0aW9ucykgPT0gJ3N0cmluZycpIHsgb3B0aW9ucyA9IHsgTmFtZTogb3B0aW9ucyB9OyB9DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0KDQogICAgdmFyIGNvbW1hbmQgPSAnUmVtb3ZlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQogICAgew0KICAgICAgICBjb21tYW5kID0gJ0dldC1OZXRGaXJld2FsbEFwcGxpY2F0aW9uRmlsdGVyIC1Qcm9ncmFtIFxcIicgKyBvcHRpb25zLlByb2dyYW0gKyAnXFwiIHwgJyArIGNvbW1hbmQ7DQogICAgfQogICAgZWxzZQogICAgew0KICAgICAgICB2YXIga2V5LCB2YWx1ZTsNCiAgICAgICAgZm9yKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpDQogICAgew0KICAgICAgICByZXQuY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwogICAgcmV0dXJuIChyZXQpOw0KfQoKZnVuY3Rpb24gYWRkRmlyZXdhbGxSdWxlKG9wdGlvbnMpCnsKICAgIHZhciBjb21tYW5kID0gJ05ldy1OZXRGaXJld2FsbFJ1bGUnOwogICAgdmFyIHZhbCA9IGNvbnZlcnRPcHRpb25zKG9wdGlvbnMpOwogICAgdmFyIGtleTsKCiAgICBmb3IgKGtleSBpbiB2YWwpCiAgICB7CiAgICAgICAgaWYgKHZhbFtrZXldLnRvU3RyaW5nKCkuaW5kZXhPZignICcpID49IDApCiAgICAgICAgewogICAgICAgICAgICBjb21tYW5kICs9ICgnIC0nICsga2V5ICsgJyBcXCInICsgdmFsW2tleV0gKyAnXFwiJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCcgLScgKyBrZXkgKyAnICcgKyB2YWxba2V5XSArICcnKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIGNoaWxkOwogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQogICAgewogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQoKICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7CgogICAgaWYoY2hpbGQuc3RkZXJyLnN0ci50cmltKCkgIT0gJycpCiAgICB7CiAgICAgICAgdGhyb3cgKGNoaWxkLnN0ZGVyci5zdHIudHJpbSgpKTsKICAgIH0KfQoKZnVuY3Rpb24gbmV0c2hfcGFyc2VSZXN1bHRzKHN0cikKew0KICAgIHZhciByZXQgPSBbXTsNCiAgICB2YXIgaSwgaiwgaywgb2JqLCB0b2tlbnM7DQogICAgdmFyIGJsb2NrcyA9IHN0ci5zcGxpdCgnXHJcblxyXG4nKTsNCiAgICBmb3IoaT0wO2k8YmxvY2tzLmxlbmd0aDsrK2kpDQogICAgew0KICAgICAgICBvYmogPSB7fTsNCiAgICAgICAgdG9rZW5zID0gYmxvY2tzW2ldLnNwbGl0KCdcclxuJyk7DQogICAgICAgIGZvcihqPTA7ajx0b2tlbnMubGVuZ3RoOysraikNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKChrID0gdG9rZW5zW2pdLmluZGV4T2YoJzonKSkgPiAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialt0b2tlbnNbal0uc3Vic3RyaW5nKDAsIGspLnRyaW0oKV0gPSB0b2tlbnNbal0uc3Vic3RyaW5nKGsgKyAxKS50cmltKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY29udmVydE5ldHNoVmFsdWVzKG9iaik7DQogICAgICAgIHJldC5wdXNoKG9iaik7DQogICAgfQ0KICAgIHJldHVybiAocmV0KTsNCn0KCmZ1bmN0aW9uIG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucykNCnsNCiAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocCwgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOwoNCiAgICB2YXIgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzaG93IHJ1bGUgbmFtZT1hbGwgdmVyYm9zZSc7CiAgICBwLm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHAuX3Jlc3VsdHMgPSBbXTsNCiAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICBwLmNoaWxkLnJldCA9IHA7DQogICAgcC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7IHAuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBwLmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChiKQ0KICAgIHsNCiAgICAgICAgdmFyIGtleSwgb2s7DQogICAgICAgIHRoaXMuc3RyICs9IGIudG9TdHJpbmcoKTsNCiAgICAgICAgdmFyIGVYID0gdGhpcy5zdHIubGFzdEluZGV4T2YoJ1xyXG5cclxuJyk7DQoNCiAgICAgICAgaWYgKGVYID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBydWxlcyA9IG5ldHNoX3BhcnNlUmVzdWx0cyh0aGlzLnN0ci5zdWJzdHJpbmcoMCwgZVgpKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcnVsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIHRoaXMucGFyZW50LnJldC5vcHRpb25zKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wYXJlbnQucmV0Lm9wdGlvbnNba2V5XSA9PSBudWxsIHx8IHRoaXMucGFyZW50LnJldC5vcHRpb25zW2tleV0gIT0gcnVsZXNbaV1ba2V5XSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChvaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5yZXQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJykgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZXQuZW1pdCgnZmlyZXdhbGxSdWxlJywgcnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucmV0Ll9yZXN1bHRzLnB1c2gocnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5zdHIubGVuZ3RoIC0gZVggPiA0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGVYICsgNCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIGlmICh0aGlzLnJldC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKHRoaXMucmV0Ll9yZXN1bHRzLmxlbmd0aD4wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZXModGhpcy5yZXQuX3Jlc3VsdHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZWooJ05vIG1hdGNoZXMnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgICByZXR1cm4gKHApOw0KfQ0KZnVuY3Rpb24gbmV0c2hfZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykNCnsNCg0KfQ0KZnVuY3Rpb24gbmV0c2hfZW5hYmxlRmlyZXdhbGxSdWxlcyhvcHRpb25zKQ0Kew0KDQp9DQpmdW5jdGlvbiBuZXRzaF9hZGRGaXJld2FsbFJ1bGUob3B0aW9ucykNCnsNCg0KfQ0KZnVuY3Rpb24gbmV0c2hfcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQoNCn0NCmZ1bmN0aW9uIG5ldHNoX25ldHNlY3VyaXR5RXhpc3RzKG9wdGlvbnMpCnsNCg0KfQoKCmlmIChuZXRzZWN1cml0eUV4aXN0cygpKQ0Kew0KICAgIG1vZHVsZS5leHBvcnRzID0KICAgICAgICB7DQogICAgICAgICAgICBnZXRGaXJld2FsbFJ1bGVzOiAgICAgICBnZXRGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBkaXNhYmxlRmlyZXdhbGxSdWxlczogICBkaXNhYmxlRmlyZXdhbGxSdWxlcywKICAgICAgICAgICAgZW5hYmxlRmlyZXdhbGxSdWxlczogICAgZW5hYmxlRmlyZXdhbGxSdWxlcywKICAgICAgICAgICAgYWRkRmlyZXdhbGxSdWxlOiAgICAgICAgYWRkRmlyZXdhbGxSdWxlLAogICAgICAgICAgICByZW1vdmVGaXJld2FsbFJ1bGU6ICAgICByZW1vdmVGaXJld2FsbFJ1bGUsCiAgICAgICAgICAgIG5ldHNlY3VyaXR5RXhpc3RzOiAgICAgIG5ldHNlY3VyaXR5RXhpc3RzDQogICAgICAgIH07DQp9DQplbHNlDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQogICAgICAgIHsNCiAgICAgICAgICAgIGdldEZpcmV3YWxsUnVsZXM6ICAgICAgIG5ldHNoX2dldEZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGRpc2FibGVGaXJld2FsbFJ1bGVzOiAgIG5ldHNoX2Rpc2FibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBlbmFibGVGaXJld2FsbFJ1bGVzOiAgICBuZXRzaF9lbmFibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBhZGRGaXJld2FsbFJ1bGU6ICAgICAgICBuZXRzaF9hZGRGaXJld2FsbFJ1bGUsCiAgICAgICAgICAgIHJlbW92ZUZpcmV3YWxsUnVsZTogICAgIG5ldHNoX3JlbW92ZUZpcmV3YWxsUnVsZSwKICAgICAgICAgICAgbmV0c2VjdXJpdHlFeGlzdHM6ICAgICAgbmV0c2hfbmV0c2VjdXJpdHlFeGlzdHMNCiAgICAgICAgfTsNCn0=", 10560); - ILibBase64DecodeEx((unsigned char*)_winfirewall, 26560, (unsigned char*)_winfirewall + 26560); - duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "win-firewall"); duk_push_string(ctx, _winfirewall + 26560); + char *_winfirewall = ILibMemory_Allocate(59472, 0, NULL, NULL); + memcpy_s(_winfirewall + 0, 33984, "LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCnZhciBwcm9taXNlID0gcmVxdWlyZSgncHJvbWlzZScpOwp2YXIgd2lucmVnID0gcmVxdWlyZSgnd2luLXJlZ2lzdHJ5Jyk7CgovL2F0dGFjaERlYnVnZ2VyKHsgd2VicG9ydDogOTk5NSwgd2FpdDogdHJ1ZSB9KS50aGVuKGNvbnNvbGUubG9nLCBjb25zb2xlLmxvZyk7CgpmdW5jdGlvbiBuZXRzZWN1cml0eUV4aXN0cygpDQp7DQogICAgdmFyIGNoaWxkOw0KICAgIHZhciBjb21tYW5kID0gJ0dldC1Nb2R1bGUgLUxpc3RBdmFpbGFibGUgLU5hbWUgbmV0c2VjdXJpdHknOwogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgfQ0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIgIT0gJycpOw0KfQoKZnVuY3Rpb24gc3RyaXBVbnJlY29nbml6ZWRLZXlzKG9iaiwgYWxsb3dlZEtleXMpCnsNCiAgICBmb3IodmFyIGtleSBpbiBvYmopDQogICAgew0KICAgICAgICBpZighYWxsb3dlZEtleXMuaW5jbHVkZXMoa2V5KSkNCiAgICAgICAgew0KICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldOw0KICAgICAgICB9DQogICAgfQ0KfQoKZnVuY3Rpb24gcGFyc2VDbWRsZXRPdXRwdXQoZGF0YSkKewogICAgdmFyIHRvdWNoZWQ7CiAgICB2YXIgcmV0ID0gW107CiAgICB2YXIgY2h1bmtzID0gZGF0YS50cmltKCkuc3BsaXQoJ1xyXG5cclxuJyk7CiAgICB2YXIgbGluZXMsIHgsIG9iajsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIG9iaiA9IHt9OyB0b3VjaGVkID0gZmFsc2U7CiAgICAgICAgbGluZXMgPSBjaHVua3NbaV0uc3BsaXQoJ1xyXG4nKTsKICAgICAgICBmb3IgKHggPSAwOyB4IDwgbGluZXMubGVuZ3RoOyArK3gpCiAgICAgICAgewogICAgICAgICAgICB2YXIgZCA9IGxpbmVzW3hdLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgdmFyIGtleSA9IGxpbmVzW3hdLnN1YnN0cmluZygwLCBkKS50cmltKCk7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxpbmVzW3hdLnN1YnN0cmluZyhkICsgMSkudHJpbSgpOwogICAgICAgICAgICBpZiAoa2V5ICE9ICIiKSB7IG9ialtrZXldID0gdmFsdWU7IHRvdWNoZWQgPSB0cnVlOyB9CiAgICAgICAgfQogICAgICAgIGlmICh0b3VjaGVkKSB7IHJldC5wdXNoKG9iaik7IH0KICAgIH0KICAgIHJldHVybiAocmV0KTsKfQpmdW5jdGlvbiBmZXRjaFBvcnRGaWx0ZXJzKHJ1bGVzKQp7CiAgICB2YXIgaTsKICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpCiAgICB7CiAgICAgICAgcnVsZXMgPSBbcnVsZXNdOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgKytpKQogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgZmlsdGVyID0gd2lucmVnLlF1ZXJ5S2V5KHdpbnJlZy5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXFNlcnZpY2VzXFxTaGFyZWRBY2Nlc3NcXFBhcmFtZXRlcnNcXEZpcmV3YWxsUG9saWN5XFxGaXJld2FsbFJ1bGVzJywgcnVsZXNbaV0uTmFtZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoKGZlKQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9CiAgICAgICAgdG9rZW5zID0gZmlsdGVyLnNwbGl0KCd8Jyk7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRva2Vucy5sZW5ndGg7ICsraykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgodG9rZW5YID0gdG9rZW5zW2tdLmluZGV4T2YoJz0nKSkgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2Vuc1trXS5zdWJzdHJpbmcoMCwgdG9rZW5YKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdQcm90b2NvbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlByb3RvY29sID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTFBvcnQnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Mb2NhbFBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdSUG9ydCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLlJlbW90ZVBvcnQgPSB0b2tlbnNba10uc3Vic3RyaW5nKHRva2VuWCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdBcHAnOgogICAgICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5Qcm9ncmFtID0gdG9rZW5zW2tdLnN1YnN0cmluZyh0b2tlblggKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGdldEZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHAgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlci5jYWxsKHAsIHRydWUpCiAgICAgICAgLmNyZWF0ZUV2ZW50KCdmaXJld2FsbFJ1bGUnKTsKCiAgICB2YXIgcmV0VmFsID0gW10sIGZpbHRlciA9IFtdOwogICAgdmFyIGNvbW1hbmQgPSAnR2V0LU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5wcm9ncmFtKSB7IG9wdGlvbnMuUHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbTsgZGVsZXRlIG9wdGlvbnMucHJvZ3JhbTsgfQogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkgeyBjb21tYW5kID0gJ0dldC1OZXRGaXJld2FsbEFwcGxpY2F0aW9uRmlsdGVyIC1Qcm9ncmFtIFxcIicgKyBvcHRpb25zLlByb2dyYW0gKyAnXFwiIHwgJyArIGNvbW1hbmQ7IH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgcC5vcHRpb25zID0gb3B0aW9uczsKICAgIHAuY2hpbGQucGFyZW50ID0gcDsKICAgIHAuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKQogICAgewogICAgICAgIHZhciBjb21tYW5kOwogICAgICAgIHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsKICAgICAgICBpZih0aGlzLnBhcmVudC5wYXJlbnQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJyk+MCkKICAgICAgICB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBpZigoaT10aGlzLnN0ci5pbmRleE9mKCdcclxuXHJcbicpKT49MCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGZpbHRlciwgaywgdG9rZW5zLCB0b2tlblg7CiAgICAgICAgICAgICAgICB2YXIgaiA9IHRoaXMuc3RyLnN1YnN0cmluZygwLCBpKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGkgKyA0KTsKCiAgICAgICAgICAgICAgICBqID0gcGFyc2VDbWRsZXRPdXRwdXQoaik7CiAgICAgICAgICAgICAgICBmZXRjaFBvcnRGaWx0ZXJzKGopOwoKICAgICAgICAgICAgICAgIGZvcihpPTA7aTxqLmxlbmd0aDsrK2kpCiAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5wYXJlbnQuZW1pdCgnZmlyZXdhbGxSdWxlJywgaltpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KTsKICAgIHAuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBwLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CgogICAgcC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgICAgdmFyIGNvbW1hbmQsIGksIGosIGNoaWxkLCBmaWx0ZXI7CiAgICAgICAgaWYgKHRoaXMuc3RkZXJyLnN0ci50cmltKCkgIT0gIiIpIHsgdGhpcy5wYXJlbnQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsgcmV0dXJuOyB9CgogICAgICAgIGlmICh0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnBhcmVudC5fcmVzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBvYmpBcnIgPSBwYXJzZUNtZGxldE91dHB1dCh0aGlzLnN0ZG91dC5zdHIpOwogICAgICAgIGZldGNoUG9ydEZpbHRlcnMob2JqQXJyKTsKICAgICAgICB0aGlzLnBhcmVudC5fcmVzKG9iakFycik7CiAgICB9KTsKCiAgICByZXR1cm4gKHApOwp9CgoKZnVuY3Rpb24gZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykKewogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgdmFyIGNvbW1hbmQgPSAnRGlzYWJsZS1OZXRGaXJld2FsbFJ1bGUnOwogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0KCiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpDQogICAgew0KICAgICAgICBpZiAodGhpcy5zdGRlcnIuc3RyICE9ICcnKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVqKHRoaXMuc3RkZXJyLnN0ci50cmltKCkpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgICAgICB9DQogICAgfSk7CgogICAgcmV0dXJuIChyZXQpOwp9CgpmdW5jdGlvbiBlbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpCnsKICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9CgogICAgdmFyIGNvbW1hbmQgPSAnRW5hYmxlLU5ldEZpcmV3YWxsUnVsZSc7CiAgICBpZiAob3B0aW9ucy5Qcm9ncmFtKQ0KICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHZhciBrZXksIHZhbHVlOw0KICAgICAgICBmb3IgKGtleSBpbiBvcHRpb25zKQ0KICAgICAgICB7DQogICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsNCiAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcgJykgPj0gMCkgeyB2YWx1ZSA9ICdcXCInICsgb3B0aW9uc1trZXldICsgJ1xcIic7IH0NCiAgICAgICAgICAgIGNvbW1hbmQgKz0gKCctJyArIGtleSArICcgJyArIHZhbHVlKTsNCiAgICAgICAgfQ0KICAgIH0KCiAgICBpZiAocmVxdWlyZSgnb3MnKS5hcmNoKCkgPT0gJ3g2NCcpCiAgICB7CiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICByZXQuY2hpbGQucmV0ID0gcmV0OwogICAgcmV0LmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsKICAgIHJldC5jaGlsZC5vbignZXhpdCcsIGZ1bmN0aW9uICgpCiAgICB7DQogICAgICAgIGlmKHRoaXMuc3RkZXJyLnN0ciAhPSAnJykNCiAgICAgICAgew0KICAgICAgICAgICAgdGhpcy5yZXQuX3Jlaih0aGlzLnN0ZGVyci5zdHIudHJpbSgpKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgIH0pOwoKICAgIHJldHVybiAocmV0KTsKfQoKCmZ1bmN0aW9uIHZlcmlmeVZhbHVlcyhvcHRpb25zSW5wdXQsIGtleU5hbWUsIGtleVZhbHVlcywgZGVmYXVsdFZhbHVlKQp7CiAgICB2YXIgaSwgaiwgdG1wLCBvazsKICAgIGZvciAodmFyIGtleSBpbiBvcHRpb25zSW5wdXQpCiAgICB7CiAgICAgICAgaWYoa2V5TmFtZS50b0xvd2VyQ2FzZSgpID09IGtleS50b0xvd2VyQ2FzZSgpKQogICAgICAgIHsKICAgICAgICAgICAgdG1wID0gb3B0aW9uc0lucHV0W2tleV07CiAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zSW5wdXRba2V5XTsKCiAgICAgICAgICAgIGlmIChrZXlWYWx1ZXMgPT0gbnVsbCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gdG1wOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHRtcCE9bnVsbCkgeyB0bXAgPSB0bXAudG9TdHJpbmcoKS5zcGxpdCgnLCcpOyB9CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdG1wLmxlbmd0aDsgKytqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxrZXlWYWx1ZXMubGVuZ3RoOysraSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZXNbaV0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IHRtcFtqXS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zSW5wdXRba2V5TmFtZV0gPSAob3B0aW9uc0lucHV0W2tleU5hbWVdID09IG51bGwgPyBrZXlWYWx1ZXNbaV0gOiAob3B0aW9uc0lucHV0W2tleU5hbWVdICsgJywgJyArIGtleVZhbHVlc1tpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICgnSW52YWxpZCB2YWx1ZSBmb3IgWycgKyBrZXlOYW1lICsgJ106ICcgKyB0bXBbal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zSW5wdXRba2V5TmFtZV0gIT0gbnVsbCkgeyByZXR1cm47IH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuLi4gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcHV0IGluIGEgZGVmYXVsdCB2YWx1ZQogICAgaWYoZGVmYXVsdFZhbHVlICE9IG51bGwpCiAgICB7CiAgICAgICAgb3B0aW9uc0lucHV0W2tleU5hbWVdID0gZGVmYXVsdFZhbHVlOwogICAgfQp9CgpmdW5jdGlvbiByZW1hcFZhbHVlcyhvYmosIG9sZG5hbWUsIG5ld25hbWUsIHRhYmxlKQp7DQogICAgaWYob2JqW29sZG5hbWVdICE9IG51bGwpDQogICAgew0KICAgICAgICB2YXIgdmFsdWUgPSBvYmpbb2xkbmFtZV07DQogICAgICAgIGRlbGV0ZSBvYmpbb2xkbmFtZV0NCg0KICAgICAgICBpZighdGFibGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG9ialtuZXduYW1lXSA9IHZhbHVlOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJywnKSA8IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdmFsdWVdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSB2YWx1ZS5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8dG9rZW5zLmxlbmd0aDsrK2kpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZihvYmpbbmV3bmFtZV0gPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2JqW25ld25hbWVdID0gdGFibGVbdG9rZW5zW2ldLnRyaW0oKV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBvYmpbbmV3bmFtZV0gPSAob2JqW25ld25hbWVdICsgJywnICsgdGFibGVbdG9rZW5zW2ldLnRyaW0oKV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQoKZnVuY3Rpb24gY29udmVydE5ldHNoVmFsdWVzKG9iaikKew0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1J1bGUgTmFtZScsICdOYW1lJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRW5hYmxlZCcsICdFbmFibGVkJywgeyBObzogJ0ZhbHNlJywgWWVzOiAnVHJ1ZScgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnUHJvZmlsZXMnLCAnUHJvZmlsZScsIHsgQW55OiAnQW55JywgRG9tYWluOiAnRG9tYWluJywgUHVibGljOiAnUHVibGljJywgUHJpdmF0ZTogJ1ByaXZhdGUnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0VkZ2UgdHJhdmVyc2FsJywgJ0VkZ2VUcmF2ZXJzYWxQb2xpY3knLCB7IE5vOiAnQmxvY2snLCBZZXM6ICdBbGxvdycgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRGlyZWN0aW9uJywgJ0RpcmVjdGlvbicsIHsgSW46ICdJbmJvdW5kJywgT3V0OiAnT3V0Ym91bmQnIH0pOw0KfQpmdW5jdGlvbiBjb252ZXJ0TmV0U2VjdXJpdHlWYWx1ZXMob2JqKQp7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnQWN0aW9uJywgJ2FjdGlvbicsIHsgQWxsb3c6ICdhbGxvdycsIEJsb2NrOiAnYmxvY2snIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rlc2NyaXB0aW9uJywgJ2Rlc2NyaXB0aW9uJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRGlyZWN0aW9uJywgJ2RpcicsIHsgSW5ib3VuZDogJ2luJywg", 16000); + memcpy_s(_winfirewall + 16000, 17984, "T3V0Ym91bmQ6ICdvdXQnIH0pOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0Rpc3BsYXlOYW1lJywgJ2Rpc3BsYXluYW1lJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRW5hYmxlZCcsICdlbmFibGVkJywgeyBGYWxzZTogJ25vJywgVHJ1ZTogJ3llcycgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm9ncmFtJywgJ3Byb2dyYW0nKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdQcm90b2NvbCcsICdwcm90b2NvbCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ1Byb2ZpbGUnLCAncHJvZmlsZScsIHsgQW55OiAnYW55JywgRG9tYWluOiAnZG9tYWluJywgUHJpdmF0ZTogJ3ByaXZhdGUnLCBQdWJsaWM6ICdwdWJsaWMnLCBOb3RBcHBsaWNhYmxlOiAnYW55JyB9KTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdJbnRlcmZhY2VUeXBlJywgJ2ludGVyZmFjZXR5cGUnLCB7IEFueTogJ2FueScsIFdpcmVkOiAnbGFuJywgV2lyZWxlc3M6ICd3aXJlbGVzcycsIFJlbW90ZUFjY2VzczogJ3JhcycgfSk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnRWRnZVRyYXZlcnNhbFBvbGljeScsICdlZGdlJywgeyBBbGxvdzogJ3llcycsIEJsb2NrOiAnbm8nLCBEZWZlclRvVXNlcjogJ2RlZmVydXNlcicsIERlZmVyVG9BcHA6ICdkZWZlcmFwcCcgfSk7DQoNCiAgICByZW1hcFZhbHVlcyhvYmosICdMb2NhbEFkZHJlc3MnLCAnbG9jYWxpcCcpOw0KICAgIHJlbWFwVmFsdWVzKG9iaiwgJ0xvY2FsUG9ydCcsICdsb2NhbHBvcnQnKTsNCiAgICByZW1hcFZhbHVlcyhvYmosICdSZW1vdGVBZGRyZXNzJywgJ3JlbW90ZWlwJyk7DQogICAgcmVtYXBWYWx1ZXMob2JqLCAnUmVtb3RlUG9ydCcsICdyZW1vdGVwb3J0Jyk7DQp9CgpmdW5jdGlvbiBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKQp7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0FjdGlvbicsIFsnTm90Q29uZmlndXJlZCcsICdBbGxvdycsICdCbG9jayddLCAnQWxsb3cnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnQXV0aGVudGljYXRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ05vRW5jYXAnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0Rlc2NyaXB0aW9uJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0RpcmVjdGlvbicsIFsnSW5ib3VuZCcsICdPdXRib3VuZCddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRGlzcGxheU5hbWUnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnRHluYW1pY1RhcmdldCcsIFsnQW55JywgJ1Byb3hpbWl0eUFwcHMnLCAnUHJveGltaXR5U2hhcmluZycsICdXaWZpRGlyZWN0UHJpbnRpbmcnLCAnV2lmaURpcmVjdERpc3BsYXknLCAnV2lmaURpcmVjdERldmljZXMnXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdFZGdlVHJhdmVyc2FsUG9saWN5JywgWydCbG9jaycsICdBbGxvdycsICdEZWZlclRvVXNlcicsICdEZWZlclRvQXBwJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdFbmFibGVkJywgWydUcnVlJywgJ0ZhbHNlJ10sICdUcnVlJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0VuY3J5cHRpb24nLCBbJ05vdFJlcXVpcmVkJywgJ1JlcXVpcmVkJywgJ0R5bmFtaWMnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0ludGVyZmFjZVR5cGUnLCBbJ0FueScsICdXaXJlZCcsICdXaXJlbGVzcycsICdSZW1vdGVBY2Nlc3NdJ10sICdBbnknKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9jYWxBZGRyZXNzJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsT25seU1hcHBpbmcnLCBbJ1RydWUnLCAnRmFsc2UnXSk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ0xvY2FsUG9ydCcpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdMb2NhbFVzZXInKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnTG9vc2VTb3VyY2VNYXBwaW5nJywgWydUcnVlJywgJ0ZhbHNlJ10pOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdOYW1lJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ092ZXJyaWRlQmxvY2tSdWxlcycsIFsnVHJ1ZScsICdGYWxzZSddKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnT3duZXInKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUGFja2FnZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQbGF0Zm9ybScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQb2xpY3lTdG9yZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQcm9maWxlJywgWydBbnknLCAnRG9tYWluJywgJ1ByaXZhdGUnLCAnUHVibGljJywgJ05vdEFwcGxpY2FibGUnXSwgJ0FueScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdQcm9ncmFtJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1Byb3RvY29sJyk7CiAgICB2ZXJpZnlWYWx1ZXMob3B0aW9ucywgJ1JlbW90ZUFkZHJlc3MnKTsKICAgIHZlcmlmeVZhbHVlcyhvcHRpb25zLCAnUmVtb3RlTWFjaGluZScpOwogICAgdmVyaWZ5VmFsdWVzKG9wdGlvbnMsICdSZW1vdGVQb3J0Jyk7CiAgICAKICAgIHJldHVybiAob3B0aW9ucyk7Cn0KCmZ1bmN0aW9uIHJlbW92ZUZpcmV3YWxsUnVsZShvcHRpb25zKQ0Kew0KICAgIGlmICh0eXBlb2YgKG9wdGlvbnMpID09ICdzdHJpbmcnKSB7IG9wdGlvbnMgPSB7IE5hbWU6IG9wdGlvbnMgfTsgfQ0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAoYSwgcikgeyB0aGlzLl9yZXMgPSBhOyB0aGlzLl9yZWogPSByOyB9KTsKICAgIGlmIChvcHRpb25zLnByb2dyYW0pIHsgb3B0aW9ucy5Qcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtOyBkZWxldGUgb3B0aW9ucy5wcm9ncmFtOyB9Cg0KICAgIHZhciBjb21tYW5kID0gJ1JlbW92ZS1OZXRGaXJld2FsbFJ1bGUnOwogICAgaWYgKG9wdGlvbnMuUHJvZ3JhbSkKICAgIHsNCiAgICAgICAgY29tbWFuZCA9ICdHZXQtTmV0RmlyZXdhbGxBcHBsaWNhdGlvbkZpbHRlciAtUHJvZ3JhbSBcXCInICsgb3B0aW9ucy5Qcm9ncmFtICsgJ1xcIiB8ICcgKyBjb21tYW5kOw0KICAgIH0KICAgIGVsc2UKICAgIHsNCiAgICAgICAgdmFyIGtleSwgdmFsdWU7DQogICAgICAgIGZvcihrZXkgaW4gb3B0aW9ucykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsdWUgPSBvcHRpb25zW2tleV07DQogICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignICcpID49IDApIHsgdmFsdWUgPSAnXFwiJyArIG9wdGlvbnNba2V5XSArICdcXCInOyB9DQogICAgICAgICAgICBjb21tYW5kICs9ICgnLScgKyBrZXkgKyAnICcgKyB2YWx1ZSk7DQogICAgICAgIH0NCiAgICB9CgogICAgaWYgKHJlcXVpcmUoJ29zJykuYXJjaCgpID09ICd4NjQnKQ0KICAgIHsNCiAgICAgICAgcmV0LmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgIH0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICB9CgogICAgcmV0LmNoaWxkLnJldCA9IHJldDsKICAgIHJldC5jaGlsZC5zdGRvdXQuc3RyID0gJyc7IHJldC5jaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOwogICAgcmV0LmNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgcmV0LmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICByZXQuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoKQogICAgew0KICAgICAgICBpZih0aGlzLnN0ZGVyci5zdHIgIT0gJycpDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZWoodGhpcy5zdGRlcnIuc3RyLnRyaW0oKSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgICAgIH0NCiAgICB9KTsKICAgIHJldHVybiAocmV0KTsNCn0KCmZ1bmN0aW9uIGFkZEZpcmV3YWxsUnVsZShvcHRpb25zKQp7CiAgICB2YXIgY29tbWFuZCA9ICdOZXctTmV0RmlyZXdhbGxSdWxlJzsKICAgIHZhciB2YWwgPSBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKTsKICAgIHZhciBrZXk7CgogICAgZm9yIChrZXkgaW4gdmFsKQogICAgewogICAgICAgIGlmICh2YWxba2V5XS50b1N0cmluZygpLmluZGV4T2YoJyAnKSA+PSAwKQogICAgICAgIHsKICAgICAgICAgICAgY29tbWFuZCArPSAoJyAtJyArIGtleSArICcgXFwiJyArIHZhbFtrZXldICsgJ1xcIicpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBjb21tYW5kICs9ICgnIC0nICsga2V5ICsgJyAnICsgdmFsW2tleV0gKyAnJyk7CiAgICAgICAgfQogICAgfQoKICAgIHZhciBjaGlsZDsKICAgIGlmIChyZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykKICAgIHsKICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsKICAgIH0KCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC5zdGRlcnIuc3RyID0gJyc7IGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7CiAgICBjaGlsZC53YWl0RXhpdCgpOwoKICAgIGlmKGNoaWxkLnN0ZGVyci5zdHIudHJpbSgpICE9ICcnKQogICAgewogICAgICAgIHRocm93IChjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSk7CiAgICB9Cn0KCmZ1bmN0aW9uIG5ldHNoX3BhcnNlUmVzdWx0cyhzdHIpCnsNCiAgICB2YXIgcmV0ID0gW107DQogICAgdmFyIGksIGosIGssIG9iaiwgdG9rZW5zOw0KICAgIHZhciBibG9ja3MgPSBzdHIuc3BsaXQoJ1xyXG5cclxuJyk7DQogICAgZm9yKGk9MDtpPGJsb2Nrcy5sZW5ndGg7KytpKQ0KICAgIHsNCiAgICAgICAgb2JqID0ge307DQogICAgICAgIHRva2VucyA9IGJsb2Nrc1tpXS5zcGxpdCgnXHJcbicpOw0KICAgICAgICBmb3Ioaj0wO2o8dG9rZW5zLmxlbmd0aDsrK2opDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICgoayA9IHRva2Vuc1tqXS5pbmRleE9mKCc6JykpID4gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvYmpbdG9rZW5zW2pdLnN1YnN0cmluZygwLCBrKS50cmltKCldID0gdG9rZW5zW2pdLnN1YnN0cmluZyhrICsgMSkudHJpbSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGNvbnZlcnROZXRzaFZhbHVlcyhvYmopOw0KICAgICAgICByZXQucHVzaChvYmopOw0KICAgIH0NCiAgICByZXR1cm4gKHJldCk7DQp9CgpmdW5jdGlvbiBuZXRzaF9nZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgaWYgKG9wdGlvbnMucHJvZ3JhbSkgeyBvcHRpb25zLlByb2dyYW0gPSBvcHRpb25zLnByb2dyYW07IGRlbGV0ZSBvcHRpb25zLnByb2dyYW07IH0NCiAgICB2YXIgcCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocCwgdHJ1ZSkKICAgICAgICAuY3JlYXRlRXZlbnQoJ2ZpcmV3YWxsUnVsZScpOwoNCiAgICB2YXIgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzaG93IHJ1bGUgbmFtZT1hbGwgdmVyYm9zZSc7CiAgICBwLm9wdGlvbnMgPSBvcHRpb25zOw0KICAgIHAuX3Jlc3VsdHMgPSBbXTsNCiAgICBwLmNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICBwLmNoaWxkLnJldCA9IHA7DQogICAgcC5jaGlsZC5zdGRlcnIuc3RyID0gJyc7IHAuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBwLmNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICBwLmNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChiKQ0KICAgIHsNCiAgICAgICAgdmFyIGtleSwgb2s7DQogICAgICAgIHRoaXMuc3RyICs9IGIudG9TdHJpbmcoKTsNCiAgICAgICAgdmFyIGVYID0gdGhpcy5zdHIubGFzdEluZGV4T2YoJ1xyXG5cclxuJyk7DQoNCiAgICAgICAgaWYgKGVYID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBydWxlcyA9IG5ldHNoX3BhcnNlUmVzdWx0cyh0aGlzLnN0ci5zdWJzdHJpbmcoMCwgZVgpKTsNCiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcnVsZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIHRoaXMucGFyZW50LnJldC5vcHRpb25zKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5wYXJlbnQucmV0Lm9wdGlvbnNba2V5XSA9PSBudWxsIHx8IHRoaXMucGFyZW50LnJldC5vcHRpb25zW2tleV0gIT0gcnVsZXNbaV1ba2V5XSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChvaykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5yZXQubGlzdGVuZXJDb3VudCgnZmlyZXdhbGxSdWxlJykgPiAwKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5yZXQuZW1pdCgnZmlyZXdhbGxSdWxlJywgcnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQucmV0Ll9yZXN1bHRzLnB1c2gocnVsZXNbaV0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5zdHIubGVuZ3RoIC0gZVggPiA0KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMuc3RyID0gdGhpcy5zdHIuc3Vic3RyaW5nKGVYICsgNCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCiAgICBwLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIGlmICh0aGlzLnJldC5saXN0ZW5lckNvdW50KCdmaXJld2FsbFJ1bGUnKSA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHRoaXMucmV0Ll9yZXMoKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmKHRoaXMucmV0Ll9yZXN1bHRzLmxlbmd0aD4wKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZXModGhpcy5yZXQuX3Jlc3VsdHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRoaXMucmV0Ll9yZWooJ05vIG1hdGNoZXMnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0pOw0KDQoNCiAgICByZXR1cm4gKHApOw0KfQ0KZnVuY3Rpb24gbmV0c2hfZGlzYWJsZUZpcmV3YWxsUnVsZXMob3B0aW9ucykNCnsNCiAgICB2YXIgcmV0ID0gbmV3IHByb21pc2UoZnVuY3Rpb24gKGEsIHIpIHsgdGhpcy5fcmVzID0gYTsgdGhpcy5fcmVqID0gcjsgfSk7CiAgICByZXQuZ2V0cCA9IG5ldHNoX2dldEZpcmV3YWxsUnVsZXMob3B0aW9ucyk7DQogICAgcmV0LmdldHAucmV0ID0gcmV0Ow0KICAgIHJldC5nZXRwLnRoZW4oZnVuY3Rpb24gKHJ1bGVzKQ0KICAgIHsNCiAgICAgICAgdmFyIGNoaWxkOw0KICAgICAgICB2YXIgY29tbWFuZDsNCiAgICAgICAgZm9yICh2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBzZXQgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJyArICcgbmV3IGVuYWJsZT1ubyc7CiAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxjbWQuZXhlJywgWycvQyAiJyArIGNvbW1hbmQgKyAnIiddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5yZXQuX3JlcygpOw0KICAgIH0sIGZ1bmN0aW9uIChlKQ0KICAgIHsNCiAgICAgICAgdGhpcy5yZXQuX3JlaihlKTsNCiAgICB9KTsNCiAgICByZXR1cm4gKHJldCk7DQp9DQpmdW5jdGlvbiBuZXRzaF9lbmFibGVGaXJld2FsbFJ1bGVzKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmV0LmdldHAgPSBuZXRzaF9nZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpOw0KICAgIHJldC5nZXRwLnJldCA9IHJldDsNCiAgICByZXQuZ2V0cC50aGVuKGZ1bmN0aW9uIChydWxlcykNCiAgICB7DQogICAgICAgIHZhciBjaGlsZDsNCiAgICAgICAgdmFyIGNvbW1hbmQ7DQogICAgICAgIGZvciAodmFyIGkgaW4gcnVsZXMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgc2V0IHJ1bGUgbmFtZT0iJyArIHJ1bGVzW2ldLk5hbWUgKyAnIicgKyAnIG5ldyBlbmFibGU9eWVzJzsKICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgfSwgZnVuY3Rpb24gKGUpDQogICAgew0KICAgICAgICB0aGlzLnJldC5fcmVqKGUpOw0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCmZ1bmN0aW9uIG5ldHNoX2FkZEZpcmV3YWxsUnVsZShvcHRpb25zKQ0Kew0KICAgIHZhciB2YWwgPSBjb252ZXJ0T3B0aW9ucyhvcHRpb25zKTsNCiAgICBjb252ZXJ0TmV0U2VjdXJpdHlWYWx1ZXModmFsKTsNCg0KICAgIGlmICghdmFsLm5hbWUpDQogICAgew0KICAgICAgICBpZih2YWwuZGlzcGxheW5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhbC5uYW1lID0gdmFsLmRpc3BsYXluYW1lICsgJyAnICsgcmVxdWlyZSgndXVpZC92NCcpKCk7DQogICAgICAgICAgICBkZWxldGUgdmFsLmRpc3BsYXluYW1lOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgdmFsLm5hbWUgPSByZXF1aXJlKCd1dWlkL3Y0JykoKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBzdHJpcFVucmVjb2duaXplZEtleXModmFsLCBbJ25hbWUnLCAnZGlyJywgJ2FjdGlvbicsICdwcm9ncmFtJywgJ3NlcnZpY2UnLCAnZGVzY3JpcHRpb24nLCAnZW5hYmxlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2ZpbGUnLCAnbG9jYWxpcCcsICdyZW1vdGVpcCcsICdsb2NhbHBvcnQnLCAncmVtb3RlcG9ydCcsICdwcm90b2NvbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcmZhY2V0eXBlJywgJ3JtdGNvbXB1dGVyZ3JwJywgJ3JtdHVzcmdycCcsICdlZGdlJywgJ3NlY3VyaXR5J10pOw0KDQogICAgdmFyIGNvbW1hbmQgPSAnbmV0c2ggYWR2ZmlyZXdhbGwgZmlyZXdhbGwgYWRkIHJ1bGUgbmFtZT0iJyArIHZhbC5uYW1lICsgJyInCiAgICBkZWxldGUgdmFsLm5hbWU7CgogICAgZm9yICh2YXIgaSBpbiB2YWwpDQogICAgew0KICAgICAgICBpZiAodmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignICcpID49IDAgfHwgdmFsW2ldLnRvU3RyaW5nKCkuaW5kZXhPZignLCcpID49IDApIHsgdmFsW2ldID0gKCciJyArIHZhbFtpXSArICciJyk7IH0NCiAgICAgICAgY29tbWFuZCArPSAoJyAnICsgaSArICc9JyArIHZhbFtpXSk7CiAgICB9Cg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcY21kLmV4ZScsIFsnL0MgIicgKyBjb21tYW5kICsgJyInXSk7DQogICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KfQ0KZnVuY3Rpb24gbmV0c2hfcmVtb3ZlRmlyZXdhbGxSdWxlKG9wdGlvbnMpDQp7DQogICAgdmFyIHJldCA9IG5ldyBwcm9taXNlKGZ1bmN0aW9uIChhLCByKSB7IHRoaXMuX3JlcyA9IGE7IHRoaXMuX3JlaiA9IHI7IH0pOwogICAgcmV0Lm9wdGlvbnMgPSBvcHRpb25zOwogICAgcmV0LmdldHAgPSBuZXRzaF9nZXRGaXJld2FsbFJ1bGVzKG9wdGlvbnMpOw0KICAgIHJldC5nZXRwLnJldCA9IHJldDsNCiAgICByZXQuZ2V0cC50aGVuKGZ1bmN0aW9uIChydWxlcykNCiAgICB7DQogICAgICAgIHZhciBjaGlsZCwgY29tbWFuZCwga2V5LCB2YWx1ZTsNCiAgICAgICAgY29udmVydE5ldFNlY3VyaXR5VmFsdWVzKHRoaXMucmV0Lm9wdGlvbnMpOw0KDQogICAgICAgIGZvcih2YXIgaSBpbiBydWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgY29tbWFuZCA9ICduZXRzaCBhZHZmaXJld2FsbCBmaXJld2FsbCBkZWxldGUgcnVsZSBuYW1lPSInICsgcnVsZXNbaV0uTmFtZSArICciJzsKICAgICAgICAgICAgZm9yKGtleSBpbiB0aGlzLnJldC5vcHRpb25zKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHZhbHVlID0g", 16000); + memcpy_s(_winfirewall + 32000, 1984, "dGhpcy5yZXQub3B0aW9uc1trZXldLnRvU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJyAnKSA+PSAwKSB7IHZhbHVlID0gKCciJyArIHZhbHVlICsgJyInKTsgfQ0KICAgICAgICAgICAgICAgIGNvbW1hbmQgKz0gKCcgJyArIGtleSArICc9JyArIHZhbHVlKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXGNtZC5leGUnLCBbJy9DICInICsgY29tbWFuZCArICciJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnJldC5fcmVzKCk7DQogICAgfSwgZnVuY3Rpb24gKGUpIHsgdGhpcy5yZXQuX3JlaihlKTsgfSk7DQogICAgcmV0dXJuKHJldCk7DQp9CgoKaWYgKG5ldHNlY3VyaXR5RXhpc3RzKCkpDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQogICAgICAgIHsNCiAgICAgICAgICAgIGdldEZpcmV3YWxsUnVsZXM6ICAgICAgIGdldEZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGRpc2FibGVGaXJld2FsbFJ1bGVzOiAgIGRpc2FibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBlbmFibGVGaXJld2FsbFJ1bGVzOiAgICBlbmFibGVGaXJld2FsbFJ1bGVzLAogICAgICAgICAgICBhZGRGaXJld2FsbFJ1bGU6ICAgICAgICBhZGRGaXJld2FsbFJ1bGUsCiAgICAgICAgICAgIHJlbW92ZUZpcmV3YWxsUnVsZTogICAgIHJlbW92ZUZpcmV3YWxsUnVsZSwKICAgICAgICAgICAgbmV0c2VjdXJpdHlFeGlzdHM6ICAgICAgbmV0c2VjdXJpdHlFeGlzdHMNCiAgICAgICAgfTsNCn0NCmVsc2UNCnsNCiAgICBtb2R1bGUuZXhwb3J0cyA9CiAgICAgICAgew0KICAgICAgICAgICAgZ2V0RmlyZXdhbGxSdWxlczogICAgICAgbmV0c2hfZ2V0RmlyZXdhbGxSdWxlcywKICAgICAgICAgICAgZGlzYWJsZUZpcmV3YWxsUnVsZXM6ICAgbmV0c2hfZGlzYWJsZUZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGVuYWJsZUZpcmV3YWxsUnVsZXM6ICAgIG5ldHNoX2VuYWJsZUZpcmV3YWxsUnVsZXMsCiAgICAgICAgICAgIGFkZEZpcmV3YWxsUnVsZTogICAgICAgIG5ldHNoX2FkZEZpcmV3YWxsUnVsZSwKICAgICAgICAgICAgcmVtb3ZlRmlyZXdhbGxSdWxlOiAgICAgbmV0c2hfcmVtb3ZlRmlyZXdhbGxSdWxlLAogICAgICAgICAgICBuZXRzZWN1cml0eUV4aXN0czogICAgICBuZXRzZWN1cml0eUV4aXN0cw0KICAgICAgICB9Ow0Kff==", 1984); + ILibBase64DecodeEx((unsigned char*)_winfirewall, 33984, (unsigned char*)_winfirewall + 33984); + duk_push_global_object(ctx); duk_get_prop_string(ctx, -1, "addModule"); duk_swap_top(ctx, -2); duk_push_string(ctx, "win-firewall"); duk_push_string(ctx, _winfirewall + 33984); duk_pcall_method(ctx, 2); duk_pop(ctx); free(_winfirewall); #endif diff --git a/modules/win-firewall.js b/modules/win-firewall.js index fba86f7..95b33d6 100644 --- a/modules/win-firewall.js +++ b/modules/win-firewall.js @@ -38,6 +38,17 @@ function netsecurityExists() return (child.stdout.str != ''); } +function stripUnrecognizedKeys(obj, allowedKeys) +{ + for(var key in obj) + { + if(!allowedKeys.includes(key)) + { + delete obj[key]; + } + } +} + function parseCmdletOutput(data) { var touched; @@ -339,7 +350,7 @@ function remapValues(obj, oldname, newname, table) } else { - obj[newname] = (obj[newname] + ', ' + table[tokens[i].trim()]); + obj[newname] = (obj[newname] + ',' + table[tokens[i].trim()]); } } } @@ -355,10 +366,29 @@ function convertNetshValues(obj) remapValues(obj, 'Edge traversal', 'EdgeTraversalPolicy', { No: 'Block', Yes: 'Allow' }); remapValues(obj, 'Direction', 'Direction', { In: 'Inbound', Out: 'Outbound' }); } +function convertNetSecurityValues(obj) +{ + remapValues(obj, 'Action', 'action', { Allow: 'allow', Block: 'block' }); + remapValues(obj, 'Description', 'description'); + remapValues(obj, 'Direction', 'dir', { Inbound: 'in', Outbound: 'out' }); + remapValues(obj, 'DisplayName', 'displayname'); + remapValues(obj, 'Enabled', 'enabled', { False: 'no', True: 'yes' }); + + remapValues(obj, 'Program', 'program'); + remapValues(obj, 'Protocol', 'protocol'); + remapValues(obj, 'Profile', 'profile', { Any: 'any', Domain: 'domain', Private: 'private', Public: 'public', NotApplicable: 'any' }); + remapValues(obj, 'InterfaceType', 'interfacetype', { Any: 'any', Wired: 'lan', Wireless: 'wireless', RemoteAccess: 'ras' }); + remapValues(obj, 'EdgeTraversalPolicy', 'edge', { Allow: 'yes', Block: 'no', DeferToUser: 'deferuser', DeferToApp: 'deferapp' }); + + remapValues(obj, 'LocalAddress', 'localip'); + remapValues(obj, 'LocalPort', 'localport'); + remapValues(obj, 'RemoteAddress', 'remoteip'); + remapValues(obj, 'RemotePort', 'remoteport'); +} function convertOptions(options) { - verifyValues(options, 'Action', ['NotConfigured', 'Allow', 'Block']); + verifyValues(options, 'Action', ['NotConfigured', 'Allow', 'Block'], 'Allow'); verifyValues(options, 'Authentication', ['NotRequired', 'Required', 'NoEncap']); verifyValues(options, 'Description'); verifyValues(options, 'Direction', ['Inbound', 'Outbound']); @@ -499,6 +529,7 @@ function netsh_parseResults(str) function netsh_getFirewallRules(options) { + if (options.program) { options.Program = options.program; delete options.program; } var p = new promise(function (a, r) { this._res = a; this._rej = r; }); require('events').EventEmitter.call(p, true) .createEvent('firewallRule'); @@ -573,23 +604,116 @@ function netsh_getFirewallRules(options) } function netsh_disableFirewallRules(options) { - + var ret = new promise(function (a, r) { this._res = a; this._rej = r; }); + ret.getp = netsh_getFirewallRules(options); + ret.getp.ret = ret; + ret.getp.then(function (rules) + { + var child; + var command; + for (var i in rules) + { + command = 'netsh advfirewall firewall set rule name="' + rules[i].Name + '"' + ' new enable=no'; + child = require('child_process').execFile(process.env['windir'] + '\\System32\\cmd.exe', ['/C "' + command + '"']); + child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.waitExit(); + } + this.ret._res(); + }, function (e) + { + this.ret._rej(e); + }); + return (ret); } function netsh_enableFirewallRules(options) { - + var ret = new promise(function (a, r) { this._res = a; this._rej = r; }); + ret.getp = netsh_getFirewallRules(options); + ret.getp.ret = ret; + ret.getp.then(function (rules) + { + var child; + var command; + for (var i in rules) + { + command = 'netsh advfirewall firewall set rule name="' + rules[i].Name + '"' + ' new enable=yes'; + child = require('child_process').execFile(process.env['windir'] + '\\System32\\cmd.exe', ['/C "' + command + '"']); + child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.waitExit(); + } + this.ret._res(); + }, function (e) + { + this.ret._rej(e); + }); + return (ret); } function netsh_addFirewallRule(options) { + var val = convertOptions(options); + convertNetSecurityValues(val); + if (!val.name) + { + if(val.displayname) + { + val.name = val.displayname + ' ' + require('uuid/v4')(); + delete val.displayname; + } + else + { + val.name = require('uuid/v4')(); + } + } + stripUnrecognizedKeys(val, ['name', 'dir', 'action', 'program', 'service', 'description', 'enable', + 'profile', 'localip', 'remoteip', 'localport', 'remoteport', 'protocol', + 'interfacetype', 'rmtcomputergrp', 'rmtusrgrp', 'edge', 'security']); + + var command = 'netsh advfirewall firewall add rule name="' + val.name + '"' + delete val.name; + + for (var i in val) + { + if (val[i].toString().indexOf(' ') >= 0 || val[i].toString().indexOf(',') >= 0) { val[i] = ('"' + val[i] + '"'); } + command += (' ' + i + '=' + val[i]); + } + + var child = require('child_process').execFile(process.env['windir'] + '\\System32\\cmd.exe', ['/C "' + command + '"']); + child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.waitExit(); } function netsh_removeFirewallRule(options) { + var ret = new promise(function (a, r) { this._res = a; this._rej = r; }); + ret.options = options; + ret.getp = netsh_getFirewallRules(options); + ret.getp.ret = ret; + ret.getp.then(function (rules) + { + var child, command, key, value; + convertNetSecurityValues(this.ret.options); -} -function netsh_netsecurityExists(options) -{ + for(var i in rules) + { + command = 'netsh advfirewall firewall delete rule name="' + rules[i].Name + '"'; + for(key in this.ret.options) + { + value = this.ret.options[key].toString(); + if (value.indexOf(' ') >= 0) { value = ('"' + value + '"'); } + command += (' ' + key + '=' + value); + } + child = require('child_process').execFile(process.env['windir'] + '\\System32\\cmd.exe', ['/C "' + command + '"']); + child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.waitExit(); + } + this.ret._res(); + }, function (e) { this.ret._rej(e); }); + return(ret); } @@ -614,6 +738,6 @@ else enableFirewallRules: netsh_enableFirewallRules, addFirewallRule: netsh_addFirewallRule, removeFirewallRule: netsh_removeFirewallRule, - netsecurityExists: netsh_netsecurityExists + netsecurityExists: netsecurityExists }; } \ No newline at end of file