From 8ec340f8b5ec95c5872b11c1dd4913654a351d12 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Sun, 26 Apr 2020 13:41:40 -0700 Subject: [PATCH] Added cpu_name for linux --- microscript/ILibDuktape_Polyfills.c | 2 +- modules/identifiers.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 7b12b2d..c35f44b 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2217,7 +2217,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('agent-installer', Buffer.from('LyoNCkNvcHlyaWdodCAyMDIwIEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQoNCmZ1bmN0aW9uIGluc3RhbGxTZXJ2aWNlKHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLi4uSW5zdGFsbGluZyBzZXJ2aWNlJyk7DQogICAgdHJ5DQogICAgew0KICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxTZXJ2aWNlKA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG5hbWU6IHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnLA0KICAgICAgICAgICAgICAgIHRhcmdldDogcHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2hBZ2VudCcgOiAnbWVzaGFnZW50JywNCiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgYmFja2dyb3VuZCBzZXJ2aWNlJywNCiAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogcHJvY2Vzcy5leGVjUGF0aCwNCiAgICAgICAgICAgICAgICBzdGFydFR5cGU6ICdBVVRPX1NUQVJUJywNCiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMNCiAgICAgICAgICAgIH0pOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgfQ0KICAgIGNhdGNoKHNpZSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXSAnICsgc2llKTsNCiAgICAgICAgcHJvY2Vzcy5leGl0KCk7DQogICAgfQ0KICAgIHZhciBzdmMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybT09J3dpbjMyJz8nTWVzaCBBZ2VudCc6J21lc2hhZ2VudCcpOw0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgIHsNCiAgICAgICAgc3ZjLmxvYWQoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IHNldHRpbmcgdXAgbGF1bmNoIGFnZW50Li4uJyk7DQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxMYXVuY2hBZ2VudCgNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdtZXNoYWdlbnQnLA0KICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogc3ZjLmFwcExvY2F0aW9uKCksDQogICAgICAgICAgICAgICAgICAgIHN0YXJ0VHlwZTogJ0FVVE9fU1RBUlQnLA0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9uVHlwZXM6IFsnTG9naW5XaW5kb3cnXSwNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogWycta3ZtMSddDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKHNpZSkNCiAgICAgICAgew0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRVJST1JdICcgKyBzaWUpOw0KICAgICAgICB9DQogICAgfQ0KDQoNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICB2YXIgbG9jID0gc3ZjLmFwcExvY2F0aW9uKCk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBXcml0aW5nIGZpcmV3YWxsIHJ1bGVzIGZvciBNZXNoIEFnZW50IFNlcnZpY2UuLi4nKTsNCg0KICAgICAgICB2YXIgcnVsZSA9IA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lOiAnTWVzaCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMgKFRDUC0xKScsDQogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLA0KICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVENQJywNCiAgICAgICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTAsDQogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgTWFuYWdlbWVudCBUcmFmZmljJywNCiAgICAgICAgICAgICAgICBFZGdlVHJhdmVyc2FsUG9saWN5OiAnYWxsb3cnLA0KICAgICAgICAgICAgICAgIEVuYWJsZWQ6IHRydWUNCiAgICAgICAgICAgIH07DQogICAgICAgIHJlcXVpcmUoJ3dpbi1maXJld2FsbCcpLmFkZEZpcmV3YWxsUnVsZShydWxlKTsNCg0KICAgICAgICBydWxlID0gDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IE1hbmFnZW1lbnQgVHJhZmZpYyAoVENQLTIpJywNCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdpbmJvdW5kJywNCiAgICAgICAgICAgICAgICBQcm9ncmFtOiBsb2MsDQogICAgICAgICAgICAgICAgUHJvdG9jb2w6ICdUQ1AnLA0KICAgICAgICAgICAgICAgIFByb2ZpbGU6ICdQdWJsaWMsIFByaXZhdGUsIERvbWFpbicsDQogICAgICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MSwNCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogJ01lc2ggQ2VudHJhbCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMnLA0KICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICAgICAgRW5hYmxlZDogdHJ1ZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOyANCg0KICAgICAgICBydWxlID0NCiAgICAgICAgew0KICAgICAgICAgICAgRGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IFBlZXItdG8tUGVlciBUcmFmZmljIChVRFAtMSknLA0KICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICBQcm9ncmFtOiBsb2MsDQogICAgICAgICAgICBQcm90b2NvbDogJ1VEUCcsDQogICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MCwNCiAgICAgICAgICAgIERlc2NyaXB0aW9uOiAnTWVzaCBDZW50cmFsIEFnZW50IFBlZXItdG8tUGVlciBUcmFmZmljJywNCiAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICBFbmFibGVkOiB0cnVlDQogICAgICAgIH07DQogICAgICAgIHJlcXVpcmUoJ3dpbi1maXJld2FsbCcpLmFkZEZpcmV3YWxsUnVsZShydWxlKTsNCg0KICAgICAgICBydWxlID0NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMgKFVEUC0yKScsDQogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnaW5ib3VuZCcsDQogICAgICAgICAgICAgICAgUHJvZ3JhbTogbG9jLA0KICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVURQJywNCiAgICAgICAgICAgICAgICBQcm9maWxlOiAnUHVibGljLCBQcml2YXRlLCBEb21haW4nLA0KICAgICAgICAgICAgICAgIExvY2FsUG9ydDogMTY5OTEsDQogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMnLA0KICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsDQogICAgICAgICAgICAgICAgRW5hYmxlZDogdHJ1ZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOw0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgfQ0KICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBTdGFydGluZyBzZXJ2aWNlLi4uJyk7DQogICAgdHJ5DQogICAgew0KICAgICAgICBzdmMuc3RhcnQoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbT0tdXG4nKTsNCiAgICB9DQogICAgY2F0Y2goZWUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgIH0NCg0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpIHsgc3ZjLmNsb3NlKCk7IH0NCiAgICBwcm9jZXNzLmV4aXQoKTsNCn0NCg0KZnVuY3Rpb24gdW5pbnN0YWxsU2VydmljZTMocGFyYW1zKQ0Kew0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBsYXVuY2ggYWdlbnQuLi4nKTsNCiAgICAgICAgdHJ5DQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBsYXVuY2hhZ2VudCA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0TGF1bmNoQWdlbnQoJ21lc2hhZ2VudCcpOw0KICAgICAgICAgICAgbGF1bmNoYWdlbnQudW5sb2FkKCk7DQogICAgICAgICAgICByZXF1aXJlKCdmcycpLnVubGlua1N5bmMobGF1bmNoYWdlbnQucGxpc3QpOw0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRE9ORV1cbicpOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoIChlKQ0KICAgICAgICB7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChwYXJhbXMgIT0gbnVsbCkNCiAgICB7DQogICAgICAgIGluc3RhbGxTZXJ2aWNlKHBhcmFtcyk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIHByb2Nlc3MuZXhpdCgpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gdW5pbnN0YWxsU2VydmljZTIocGFyYW1zKQ0Kew0KICAgIHZhciBzZWNvbmRhcnlhZ2VudCA9IGZhbHNlOw0KDQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBwcmV2aW91cyBpbnN0YWxsYXRpb24uLi4nKTsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIudW5pbnN0YWxsU2VydmljZShwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaCBBZ2VudCcgOiAnbWVzaGFnZW50Jyk7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsNCiAgICB9DQogICAgY2F0Y2ggKGUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOw0KICAgIH0NCg0KICAgIC8vIENoZWNrIGZvciBzZWNvbmRhcnkgYWdlbnQNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBDaGVja2luZyBmb3Igc2Vjb25kYXJ5IGFnZW50Li4uJyk7DQogICAgICAgIHZhciBzID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKCdtZXNoYWdlbnREaWFnbm9zdGljJyk7DQogICAgICAgIHZhciBsb2MgPSBzLmFwcExvY2F0aW9uKCk7DQogICAgICAgIHMuY2xvc2UoKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRk9VTkRdXG4nKTsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgICAgIC0+IFVuaW5zdGFsbGluZyBzZWNvbmRhcnkgYWdlbnQuLi4nKTsNCiAgICAgICAgc2Vjb25kYXJ5YWdlbnQgPSB0cnVlOw0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci51bmluc3RhbGxTZXJ2aWNlKCdtZXNoYWdlbnREaWFnbm9zdGljJyk7DQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtET05FXVxuJyk7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgIH0NCiAgICB9DQogICAgY2F0Y2ggKGUpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtOT05FXVxuJyk7DQogICAgfQ0KDQogICAgaWYoc2Vjb25kYXJ5YWdlbnQpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgICAgLT4gcmVtb3Zpbmcgc2Vjb25kYXJ5IGFnZW50IGZyb20gdGFzayBzY2hlZHVsZXIuLi4nKTsNCiAgICAgICAgdmFyIHAgPSByZXF1aXJlKCd0YXNrLXNjaGVkdWxlcicpLmRlbGV0ZSgnbWVzaGFnZW50RGlhZ25vc3RpYy9wZXJpb2RpY1N0YXJ0Jyk7DQogICAgICAgIHAuX3BhcmFtcyA9IHBhcmFtczsNCiAgICAgICAgcC50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsNCiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UzKHRoaXMuX3BhcmFtcyk7DQogICAgICAgIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlMyh0aGlzLl9wYXJhbXMpOw0KICAgICAgICB9KTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgdW5pbnN0YWxsU2VydmljZTMocGFyYW1zKTsNCiAgICB9DQp9DQpmdW5jdGlvbiB1bmluc3RhbGxTZXJ2aWNlKHBhcmFtcykNCnsNCiAgICB2YXIgc3ZjID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnKTsNCiAgICBpZiAoc3ZjLmlzUnVubmluZygpKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFN0b3BwaW5nIFNlcnZpY2UuLi4nKTsNCiAgICAgICAgaWYocHJvY2Vzcy5wbGF0Zm9ybT09J3dpbjMyJykNCiAgICAgICAgew0KICAgICAgICAgICAgc3ZjLnN0b3AoKS50aGVuKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbU1RPUFBFRF1cbicpOw0KICAgICAgICAgICAgICAgIHN2Yy5jbG9zZSgpOw0KICAgICAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHRoaXMuX3BhcmFtcyk7DQogICAgICAgICAgICB9LCBmdW5jdGlvbiAoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0VSUk9SXVxuJyk7DQogICAgICAgICAgICAgICAgc3ZjLmNsb3NlKCk7DQogICAgICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIodGhpcy5fcGFyYW1zKTsNCiAgICAgICAgICAgIH0pLnBhcmVudFByb21pc2UuX3BhcmFtcyA9IHBhcmFtczsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN2Yy51bmxvYWQoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzdmMuc3RvcCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbU1RPUFBFRF1cbicpOw0KICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIocGFyYW1zKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKSB7IHN2Yy5jbG9zZSgpOyB9DQogICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHBhcmFtcyk7DQogICAgfQ0KfQ0KZnVuY3Rpb24gc2VydmljZUV4aXN0cyhsb2MsIHBhcmFtcykNCnsNCiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtGT1VORDogJyArIGxvYyArICddXG4nKTsNCiAgICBpZihwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpDQogICAgew0KICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgLT4gQ2hlY2tpbmcgZmlyZXdhbGwgcnVsZXMgZm9yIHByZXZpb3VzIGluc3RhbGxhdGlvbi4uLicpOw0KICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5yZW1vdmVGaXJld2FsbFJ1bGUoeyBwcm9ncmFtOiBsb2MgfSkudGhlbihmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBTVUNDRVNTDQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtERUxFVEVEXVxuJyk7DQogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHRoaXMuX3BhcmFtcyk7DQogICAgICAgIH0sIGZ1bmN0aW9uICgpDQogICAgICAgIHsNCiAgICAgICAgICAgIC8vIEZBSUxFRA0KICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTm8gUnVsZXMgRm91bmRdXG4nKTsNCiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UodGhpcy5fcGFyYW1zKTsNCiAgICAgICAgfSkucGFyZW50UHJvbWlzZS5fcGFyYW1zID0gcGFyYW1zOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHBhcmFtcyk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBmdWxsVW5pbnN0YWxsKCkNCnsNCiAgICBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkRJU0FCTEVEKTsNCg0KICAgIHRyeQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4uLkNoZWNraW5nIGZvciBwcmV2aW91cyBpbnN0YWxsYXRpb24nKTsNCiAgICAgICAgdmFyIHMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2ggQWdlbnQnIDogJ21lc2hhZ2VudCcpOw0KICAgICAgICB2YXIgbG9jID0gcy5hcHBMb2NhdGlvbigpOw0KICAgICAgICBzLmNsb3NlKCk7DQogICAgfQ0KICAgIGNhdGNoIChlKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTk9ORV1cbicpOw0KICAgICAgICBwcm9jZXNzLmV4aXQoKTsNCiAgICB9DQogICAgc2VydmljZUV4aXN0cyhsb2MsIG51bGwpOw0KfQ0KDQpmdW5jdGlvbiBmdWxsSW5zdGFsbChqc29uU3RyaW5nKQ0Kew0KICAgIGNvbnNvbGUuc2V0RGVzdGluYXRpb24oY29uc29sZS5EZXN0aW5hdGlvbnMuRElTQUJMRUQpOw0KICAgIHZhciBwYXJtcyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7DQoNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuLi5DaGVja2luZyBmb3IgcHJldmlvdXMgaW5zdGFsbGF0aW9uJyk7DQogICAgICAgIHZhciBzID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnKTsNCiAgICAgICAgdmFyIGxvYyA9IHMuYXBwTG9jYXRpb24oKTsNCiAgICAgICAgcy5jbG9zZSgpOw0KICAgIH0NCiAgICBjYXRjaCAoZSkNCiAgICB7DQogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW05PTkVdXG4nKTsNCiAgICAgICAgaW5zdGFsbFNlcnZpY2UocGFybXMpOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KICAgIHNlcnZpY2VFeGlzdHMobG9jLCBwYXJtcyk7DQp9DQoNCg0KbW9kdWxlLmV4cG9ydHMgPQ0KICAgIHsNCiAgICAgICAgZnVsbEluc3RhbGw6IGZ1bGxJbnN0YWxsLA0KICAgICAgICBmdWxsVW5pbnN0YWxsOiBmdWxsVW5pbnN0YWxsDQogICAgfTs=', 'base64').toString());"); // identifer: Refer to modules/identifers.js - duk_peval_string_noresult(ctx, "addModule('identifiers', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24NCg0KTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQpsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiovDQoNCmZ1bmN0aW9uIHRyaW1JZGVudGlmaWVycyh2YWwpDQp7DQogICAgZm9yKHZhciB2IGluIHZhbCkNCiAgICB7DQogICAgICAgIGlmICghdmFsW3ZdIHx8IHZhbFt2XSA9PSAnTm9uZScgfHwgdmFsW3ZdID09ICcnKSB7IGRlbGV0ZSB2YWxbdl07IH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGxpbnV4X2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgaWRlbnRpZmllcnMgPSB7fTsNCiAgICB2YXIgcmV0ID0ge307DQogICAgdmFyIHZhbHVlcyA9IHt9Ow0KICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvc3lzL2NsYXNzL2RtaS9pZCcpKSB7IHRocm93ICgndGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIERNSSBzdGF0aXN0aWNzJyk7IH0NCiAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvZG1pL2lkJyk7DQogICAgZm9yKHZhciBpIGluIGVudHJpZXMpDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLmlzRmlsZSgpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXRbZW50cmllc1tpXV0gPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLnRvU3RyaW5nKCkudHJpbSgpOw0KDQogICAgICAgICAgICBpZiAocmV0W2VudHJpZXNbaV1dID09ICdOb25lJykgeyBkZWxldGUgcmV0W2VudHJpZXNbaV1dO30NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZGVudGlmaWVyc1snYmlvc19kYXRlJ10gPSByZXRbJ2Jpb3NfZGF0ZSddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlbmRvciddID0gcmV0WydiaW9zX3ZlbmRvciddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlcnNpb24nXSA9IHJldFsnYmlvc192ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX25hbWUnXSA9IHJldFsnYm9hcmRfbmFtZSddOw0KICAgIGlkZW50aWZpZXJzWydib2FyZF9zZXJpYWwnXSA9IHJldFsnYm9hcmRfc2VyaWFsJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX3ZlbmRvciddID0gcmV0Wydib2FyZF92ZW5kb3InXTsNCiAgICBpZGVudGlmaWVyc1snYm9hcmRfdmVyc2lvbiddID0gcmV0Wydib2FyZF92ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ3Byb2R1Y3RfdXVpZCddID0gcmV0Wydwcm9kdWN0X3V1aWQnXTsNCg0KICAgIHZhbHVlcy5pZGVudGlmaWVycyA9IGlkZW50aWZpZXJzOw0KICAgIHZhbHVlcy5saW51eCA9IHJldDsNCiAgICB0cmltSWRlbnRpZmllcnModmFsdWVzLmlkZW50aWZpZXJzKTsNCiAgICByZXR1cm4gKHZhbHVlcyk7DQp9DQoNCmZ1bmN0aW9uIHdpbmRvd3Nfd21pY19yZXN1bHRzKHN0cikNCnsNCiAgICB2YXIgbGluZXMgPSBzdHIudHJpbSgpLnNwbGl0KCdcclxuJyk7DQogICAgdmFyIGtleXMgPSBsaW5lc1swXS5zcGxpdCgnLCcpOw0KICAgIHZhciBpLCBrZXksIGtleXZhbDsNCiAgICB2YXIgdG9rZW5zOw0KICAgIHZhciByZXN1bHQgPSBbXTsNCg0KICAgIGZvciAoaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkNCiAgICB7DQogICAgICAgIHZhciBvYmogPSB7fTsNCiAgICAgICAgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJywnKTsNCiAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBrZXlzLmxlbmd0aDsgKytrZXkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh0b2tlbnNba2V5XS50cmltKCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb2JqW2tleXNba2V5XS50cmltKCldID0gdG9rZW5zW2tleV0udHJpbSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGRlbGV0ZSBvYmouTm9kZTsNCiAgICAgICAgcmVzdWx0LnB1c2gob2JqKTsNCiAgICB9DQogICAgcmV0dXJuIChyZXN1bHQpOw0KfQ0KDQoNCmZ1bmN0aW9uIHdpbmRvd3NfaWRlbnRpZmllcnMoKQ0Kew0KICAgIHZhciByZXQgPSB7IHdpbmRvd3M6IHt9fTsgdmFsdWVzID0ge307IHZhciBpdGVtczsgdmFyIGk7IHZhciBpdGVtOw0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnYmlvcycsICdnZXQnLCAnL1ZBTFVFJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGl0ZW1zID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXHJcclxuJyk7DQogICAgZm9yKGkgaW4gaXRlbXMpDQogICAgew0KICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsNCiAgICB9DQoNCiAgICByZXRbJ2lkZW50aWZpZXJzJ10gPSB7fTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2Jpb3NfZGF0ZSddID0gdmFsdWVzWydSZWxlYXNlRGF0ZSddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYmlvc192ZW5kb3InXSA9IHZhbHVlc1snTWFudWZhY3R1cmVyJ107DQogICAgcmV0WydpZGVudGlmaWVycyddWydiaW9zX3ZlcnNpb24nXSA9IHZhbHVlc1snU01CSU9TQklPU1ZlcnNpb24nXTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdCQVNFQk9BUkQnLCAnZ2V0JywgJy9WQUxVRSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBpdGVtcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xyXHJcbicpOw0KICAgIGZvciAoaSBpbiBpdGVtcykNCiAgICB7DQogICAgICAgIGl0ZW0gPSBpdGVtc1tpXS5zcGxpdCgnPScpOw0KICAgICAgICB2YWx1ZXNbaXRlbVswXV0gPSBpdGVtWzFdOw0KICAgIH0NCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX25hbWUnXSA9IHZhbHVlc1snUHJvZHVjdCddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfc2VyaWFsJ10gPSB2YWx1ZXNbJ1NlcmlhbE51bWJlciddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfdmVuZG9yJ10gPSB2YWx1ZXNbJ01hbnVmYWN0dXJlciddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYm9hcmRfdmVyc2lvbiddID0gdmFsdWVzWydWZXJzaW9uJ107DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnQ1NQcm9kdWN0JywgJ2dldCcsICcvVkFMVUUnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICB2YXIgaXRlbXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcclxyXG4nKTsNCiAgICBmb3IgKGkgaW4gaXRlbXMpDQogICAgew0KICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsNCiAgICB9DQogICAgcmV0WydpZGVudGlmaWVycyddWydwcm9kdWN0X3V1aWQnXSA9IHZhbHVlc1snVVVJRCddOw0KICAgIHRyaW1JZGVudGlmaWVycyhyZXQuaWRlbnRpZmllcnMpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ01FTU9SWUNISVAnLCAnTElTVCcsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5tZW1vcnkgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdPUycsICdHRVQnLCAnL0ZPUk1BVDpDU1YnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LndpbmRvd3Mub3NpbmZvID0gd2luZG93c193bWljX3Jlc3VsdHMoY2hpbGQuc3Rkb3V0LnN0cilbMF07DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnUEFSVElUSU9OJywgJ0xJU1QnLCAnL0ZPUk1BVDpDU1YnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LndpbmRvd3MucGFydGl0aW9ucyA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ0NQVScsICdMSVNUJywgJ0JSSUVGJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLmNwdSA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ1BBVEgnLCAnV2luMzJfVmlkZW9Db250cm9sbGVyJywgJ0dFVCcsICdOYW1lLEN1cnJlbnRIb3Jpem9udGFsUmVzb2x1dGlvbixDdXJyZW50VmVydGljYWxSZXNvbHV0aW9uJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLmdwdSA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ2Rpc2tkcml2ZScsICdMSVNUJywgJ0JSSUVGJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLmRyaXZlcyA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpOw0KDQoNCiAgICB0cnkgeyByZXQuaWRlbnRpZmllcnMuY3B1X25hbWUgPSByZXQud2luZG93cy5jcHVbMF0uTmFtZTsgfSBjYXRjaCAoeCkgeyB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KZnVuY3Rpb24gbWFjb3NfaWRlbnRpZmllcnMoKQ0Kew0KICAgIHZhciByZXQgPSB7IGlkZW50aWZpZXJzOiB7fSB9Ow0KICAgIHZhciBjaGlsZDsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBib2FyZC1pZCB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX25hbWUgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBJT1BsYXRmb3JtU2VyaWFsTnVtYmVyIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfc2VyaWFsID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgbWFudWZhY3R1cmVyIHwgYXdrIC1GPSBcJ3sgc3BsaXQoJDIsIHJlcywgIlxcIiIpOyBwcmludCByZXNbMl07IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQuaWRlbnRpZmllcnMuYm9hcmRfdmVuZG9yID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgdmVyc2lvbiB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX3ZlcnNpb24gPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ2lvcmVnIC1kMiAtYyBJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlIHwgZ3JlcCBJT1BsYXRmb3JtVVVJRCB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLnByb2R1Y3RfdXVpZCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgdHJpbUlkZW50aWZpZXJzKHJldC5pZGVudGlmaWVycyk7DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCnsNCiAgICBjYXNlICdsaW51eCc6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBfT2JqZWN0SUQ6ICdpZGVudGlmaWVycycsIGdldDogbGludXhfaWRlbnRpZmllcnMgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnd2luMzInOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgX09iamVjdElEOiAnaWRlbnRpZmllcnMnLCBnZXQ6IHdpbmRvd3NfaWRlbnRpZmllcnMgfTsNCiAgICAgICAgYnJlYWs7DQogICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IF9PYmplY3RJRDogJ2lkZW50aWZpZXJzJywgZ2V0OiBtYWNvc19pZGVudGlmaWVycyB9Ow0KICAgICAgICBicmVhazsNCiAgICBkZWZhdWx0Og0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHRocm93ICgnVW5zdXBwb3J0ZWQgUGxhdGZvcm0nKTsgfSB9Ow0KICAgICAgICBicmVhazsNCn0NCm1vZHVsZS5leHBvcnRzLmlzRG9ja2VyID0gZnVuY3Rpb24gaXNEb2NrZXIoKQ0Kew0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9ICdsaW51eCcpIHsgcmV0dXJuIChmYWxzZSk7IH0NCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCJjYXQgL3Byb2Mvc2VsZi9jZ3JvdXAgfCB0ciAnXG4nICdgJyB8IGF3ayAtRidgJyAneyBzcGxpdCgkMSwgcmVzLCAiICsgJyIvIik7IGlmKHJlc1syXT09ImRvY2tlciIpe3ByaW50ICIxIjt9IH1cJ1xuZXhpdFxuJyk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXR1cm4gKGNoaWxkLnN0ZG91dC5zdHIgIT0gJycpOw0KfTsNCm1vZHVsZS5leHBvcnRzLmlzVk0gPSBmdW5jdGlvbiBpc1ZNKCkNCnsNCiAgICB2YXIgcmV0ID0gZmFsc2U7DQogICAgdmFyIGlkID0gdGhpcy5nZXQoKTsNCiAgICBpZiAoaWQubGludXggJiYgaWQubGludXguc3lzX3ZlbmRvcikNCiAgICB7DQogICAgICAgIHN3aXRjaCAoaWQubGludXguc3lzX3ZlbmRvcikNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnVk13YXJlLCBJbmMuJzoNCiAgICAgICAgICAgIGNhc2UgJ1FFTVUnOg0KICAgICAgICAgICAgY2FzZSAnWGVuJzoNCiAgICAgICAgICAgICAgICByZXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAoaWQuaWRlbnRpZmllcnMuYmlvc192ZW5kb3IpDQogICAgew0KICAgICAgICBzd2l0Y2goaWQuaWRlbnRpZmllcnMuYmlvc192ZW5kb3IpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgJ1ZNd2FyZSwgSW5jLic6DQogICAgICAgICAgICBjYXNlICdYZW4nOg0KICAgICAgICAgICAgY2FzZSAnU2VhQklPUyc6DQogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJvYXJkX3ZlbmRvciAmJiBpZC5pZGVudGlmaWVycy5ib2FyZF92ZW5kb3IgPT0gJ1ZNd2FyZSwgSW5jLicpIHsgcmV0ID0gdHJ1ZTsgfQ0KICAgIGlmIChpZC5pZGVudGlmaWVycy5ib2FyZF9uYW1lKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoIChpZC5pZGVudGlmaWVycy5ib2FyZF9uYW1lKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdWaXJ0dWFsQm94JzoNCiAgICAgICAgICAgIGNhc2UgJ1ZpcnR1YWwgTWFjaGluZSc6DQogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoIXJldCkgeyByZXQgPSB0aGlzLmlzRG9ja2VyKCk7IH0NCiAgICByZXR1cm4gKHJldCk7DQp9Ow0KDQoNCi8vIGJpb3NfZGF0ZSA9IEJJT1MtPlJlbGVhc2VEYXRlDQovLyBiaW9zX3ZlbmRvciA9IEJJT1MtPk1hbnVmYWN0dXJlcg0KLy8gYmlvc192ZXJzaW9uID0gQklPUy0+U01CSU9TQklPU1ZlcnNpb24NCi8vIGJvYXJkX25hbWUgPSBCQVNFQk9BUkQtPlByb2R1Y3QgPSBpb3JlZy9ib2FyZC1pZA0KLy8gYm9hcmRfc2VyaWFsID0gQkFTRUJPQVJELT5TZXJpYWxOdW1iZXIgPSBpb3JlZy9zZXJpYWwtbnVtYmVyIHwgaW9yZWcvSU9QbGF0Zm9ybVNlcmlhbE51bWJlcg0KLy8gYm9hcmRfdmVuZG9yID0gQkFTRUJPQVJELT5NYW51ZmFjdHVyZXIgPSBpb3JlZy9tYW51ZmFjdHVyZXINCi8vIGJvYXJkX3ZlcnNpb24gPSBCQVNFQk9BUkQtPlZlcnNpb24NCg0K', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('identifiers', Buffer.from('LyoNCkNvcHlyaWdodCAyMDE5LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24NCg0KTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCg0KICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQpsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiovDQoNCmZ1bmN0aW9uIHRyaW1JZGVudGlmaWVycyh2YWwpDQp7DQogICAgZm9yKHZhciB2IGluIHZhbCkNCiAgICB7DQogICAgICAgIGlmICghdmFsW3ZdIHx8IHZhbFt2XSA9PSAnTm9uZScgfHwgdmFsW3ZdID09ICcnKSB7IGRlbGV0ZSB2YWxbdl07IH0NCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGxpbnV4X2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgaWRlbnRpZmllcnMgPSB7fTsNCiAgICB2YXIgcmV0ID0ge307DQogICAgdmFyIHZhbHVlcyA9IHt9Ow0KICAgIGlmICghcmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvc3lzL2NsYXNzL2RtaS9pZCcpKSB7IHRocm93ICgndGhpcyBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIERNSSBzdGF0aXN0aWNzJyk7IH0NCiAgICB2YXIgZW50cmllcyA9IHJlcXVpcmUoJ2ZzJykucmVhZGRpclN5bmMoJy9zeXMvY2xhc3MvZG1pL2lkJyk7DQogICAgZm9yKHZhciBpIGluIGVudHJpZXMpDQogICAgew0KICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5zdGF0U3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLmlzRmlsZSgpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZXRbZW50cmllc1tpXV0gPSByZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygnL3N5cy9jbGFzcy9kbWkvaWQvJyArIGVudHJpZXNbaV0pLnRvU3RyaW5nKCkudHJpbSgpOw0KDQogICAgICAgICAgICBpZiAocmV0W2VudHJpZXNbaV1dID09ICdOb25lJykgeyBkZWxldGUgcmV0W2VudHJpZXNbaV1dO30NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZGVudGlmaWVyc1snYmlvc19kYXRlJ10gPSByZXRbJ2Jpb3NfZGF0ZSddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlbmRvciddID0gcmV0WydiaW9zX3ZlbmRvciddOw0KICAgIGlkZW50aWZpZXJzWydiaW9zX3ZlcnNpb24nXSA9IHJldFsnYmlvc192ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX25hbWUnXSA9IHJldFsnYm9hcmRfbmFtZSddOw0KICAgIGlkZW50aWZpZXJzWydib2FyZF9zZXJpYWwnXSA9IHJldFsnYm9hcmRfc2VyaWFsJ107DQogICAgaWRlbnRpZmllcnNbJ2JvYXJkX3ZlbmRvciddID0gcmV0Wydib2FyZF92ZW5kb3InXTsNCiAgICBpZGVudGlmaWVyc1snYm9hcmRfdmVyc2lvbiddID0gcmV0Wydib2FyZF92ZXJzaW9uJ107DQogICAgaWRlbnRpZmllcnNbJ3Byb2R1Y3RfdXVpZCddID0gcmV0Wydwcm9kdWN0X3V1aWQnXTsNCg0KICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdjYXQgL3Byb2MvY3B1aW5mbyB8IGdyZXAgIm1vZGVsIG5hbWUiIHwgJyArICJ0ciAnXFxuJyAnOicgfCBhd2sgLUY6ICd7IHByaW50ICQyIH0nXG5leGl0XG4iKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIGlkZW50aWZpZXJzWydjcHVfbmFtZSddID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICB2YWx1ZXMuaWRlbnRpZmllcnMgPSBpZGVudGlmaWVyczsNCiAgICB2YWx1ZXMubGludXggPSByZXQ7DQogICAgdHJpbUlkZW50aWZpZXJzKHZhbHVlcy5pZGVudGlmaWVycyk7DQogICAgcmV0dXJuICh2YWx1ZXMpOw0KfQ0KDQpmdW5jdGlvbiB3aW5kb3dzX3dtaWNfcmVzdWx0cyhzdHIpDQp7DQogICAgdmFyIGxpbmVzID0gc3RyLnRyaW0oKS5zcGxpdCgnXHJcbicpOw0KICAgIHZhciBrZXlzID0gbGluZXNbMF0uc3BsaXQoJywnKTsNCiAgICB2YXIgaSwga2V5LCBrZXl2YWw7DQogICAgdmFyIHRva2VuczsNCiAgICB2YXIgcmVzdWx0ID0gW107DQoNCiAgICBmb3IgKGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpDQogICAgew0KICAgICAgICB2YXIgb2JqID0ge307DQogICAgICAgIHRva2VucyA9IGxpbmVzW2ldLnNwbGl0KCcsJyk7DQogICAgICAgIGZvciAoa2V5ID0gMDsga2V5IDwga2V5cy5sZW5ndGg7ICsra2V5KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAodG9rZW5zW2tleV0udHJpbSgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9ialtrZXlzW2tleV0udHJpbSgpXSA9IHRva2Vuc1trZXldLnRyaW0oKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBkZWxldGUgb2JqLk5vZGU7DQogICAgICAgIHJlc3VsdC5wdXNoKG9iaik7DQogICAgfQ0KICAgIHJldHVybiAocmVzdWx0KTsNCn0NCg0KDQpmdW5jdGlvbiB3aW5kb3dzX2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgcmV0ID0geyB3aW5kb3dzOiB7fX07IHZhbHVlcyA9IHt9OyB2YXIgaXRlbXM7IHZhciBpOyB2YXIgaXRlbTsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ2Jpb3MnLCAnZ2V0JywgJy9WQUxVRSddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBpdGVtcyA9IGNoaWxkLnN0ZG91dC5zdHIuc3BsaXQoJ1xyXHJcbicpOw0KICAgIGZvcihpIGluIGl0ZW1zKQ0KICAgIHsNCiAgICAgICAgaXRlbSA9IGl0ZW1zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgIHZhbHVlc1tpdGVtWzBdXSA9IGl0ZW1bMV07DQogICAgfQ0KDQogICAgcmV0WydpZGVudGlmaWVycyddID0ge307DQogICAgcmV0WydpZGVudGlmaWVycyddWydiaW9zX2RhdGUnXSA9IHZhbHVlc1snUmVsZWFzZURhdGUnXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2Jpb3NfdmVuZG9yJ10gPSB2YWx1ZXNbJ01hbnVmYWN0dXJlciddOw0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsnYmlvc192ZXJzaW9uJ10gPSB2YWx1ZXNbJ1NNQklPU0JJT1NWZXJzaW9uJ107DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnQkFTRUJPQVJEJywgJ2dldCcsICcvVkFMVUUnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQoNCiAgICB2YXIgaXRlbXMgPSBjaGlsZC5zdGRvdXQuc3RyLnNwbGl0KCdcclxyXG4nKTsNCiAgICBmb3IgKGkgaW4gaXRlbXMpDQogICAgew0KICAgICAgICBpdGVtID0gaXRlbXNbaV0uc3BsaXQoJz0nKTsNCiAgICAgICAgdmFsdWVzW2l0ZW1bMF1dID0gaXRlbVsxXTsNCiAgICB9DQogICAgcmV0WydpZGVudGlmaWVycyddWydib2FyZF9uYW1lJ10gPSB2YWx1ZXNbJ1Byb2R1Y3QnXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3NlcmlhbCddID0gdmFsdWVzWydTZXJpYWxOdW1iZXInXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3ZlbmRvciddID0gdmFsdWVzWydNYW51ZmFjdHVyZXInXTsNCiAgICByZXRbJ2lkZW50aWZpZXJzJ11bJ2JvYXJkX3ZlcnNpb24nXSA9IHZhbHVlc1snVmVyc2lvbiddOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ0NTUHJvZHVjdCcsICdnZXQnLCAnL1ZBTFVFJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgdmFyIGl0ZW1zID0gY2hpbGQuc3Rkb3V0LnN0ci5zcGxpdCgnXHJcclxuJyk7DQogICAgZm9yIChpIGluIGl0ZW1zKQ0KICAgIHsNCiAgICAgICAgaXRlbSA9IGl0ZW1zW2ldLnNwbGl0KCc9Jyk7DQogICAgICAgIHZhbHVlc1tpdGVtWzBdXSA9IGl0ZW1bMV07DQogICAgfQ0KICAgIHJldFsnaWRlbnRpZmllcnMnXVsncHJvZHVjdF91dWlkJ10gPSB2YWx1ZXNbJ1VVSUQnXTsNCiAgICB0cmltSWRlbnRpZmllcnMocmV0LmlkZW50aWZpZXJzKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdNRU1PUllDSElQJywgJ0xJU1QnLCAnL0ZPUk1BVDpDU1YnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LndpbmRvd3MubWVtb3J5ID0gd2luZG93c193bWljX3Jlc3VsdHMoY2hpbGQuc3Rkb3V0LnN0cik7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcd2JlbVxcd21pYy5leGUnLCBbJ3dtaWMnLCAnT1MnLCAnR0VUJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLm9zaW5mbyA9IHdpbmRvd3Nfd21pY19yZXN1bHRzKGNoaWxkLnN0ZG91dC5zdHIpWzBdOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcU3lzdGVtMzJcXHdiZW1cXHdtaWMuZXhlJywgWyd3bWljJywgJ1BBUlRJVElPTicsICdMSVNUJywgJy9GT1JNQVQ6Q1NWJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC53aW5kb3dzLnBhcnRpdGlvbnMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdDUFUnLCAnTElTVCcsICdCUklFRicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5jcHUgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdQQVRIJywgJ1dpbjMyX1ZpZGVvQ29udHJvbGxlcicsICdHRVQnLCAnTmFtZSxDdXJyZW50SG9yaXpvbnRhbFJlc29sdXRpb24sQ3VycmVudFZlcnRpY2FsUmVzb2x1dGlvbicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5ncHUgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFx3YmVtXFx3bWljLmV4ZScsIFsnd21pYycsICdkaXNrZHJpdmUnLCAnTElTVCcsICdCUklFRicsICcvRk9STUFUOkNTViddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICByZXQud2luZG93cy5kcml2ZXMgPSB3aW5kb3dzX3dtaWNfcmVzdWx0cyhjaGlsZC5zdGRvdXQuc3RyKTsNCg0KDQogICAgdHJ5IHsgcmV0LmlkZW50aWZpZXJzLmNwdV9uYW1lID0gcmV0LndpbmRvd3MuY3B1WzBdLk5hbWU7IH0gY2F0Y2ggKHgpIHsgfQ0KICAgIHJldHVybiAocmV0KTsNCn0NCmZ1bmN0aW9uIG1hY29zX2lkZW50aWZpZXJzKCkNCnsNCiAgICB2YXIgcmV0ID0geyBpZGVudGlmaWVyczoge30gfTsNCiAgICB2YXIgY2hpbGQ7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgYm9hcmQtaWQgfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC5pZGVudGlmaWVycy5ib2FyZF9uYW1lID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgSU9QbGF0Zm9ybVNlcmlhbE51bWJlciB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX3NlcmlhbCA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2UgfCBncmVwIG1hbnVmYWN0dXJlciB8IGF3ayAtRj0gXCd7IHNwbGl0KCQyLCByZXMsICJcXCIiKTsgcHJpbnQgcmVzWzJdOyB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0LmlkZW50aWZpZXJzLmJvYXJkX3ZlbmRvciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KDQogICAgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnaW9yZWcgLWQyIC1jIElPUGxhdGZvcm1FeHBlcnREZXZpY2UgfCBncmVwIHZlcnNpb24gfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC5pZGVudGlmaWVycy5ib2FyZF92ZXJzaW9uID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQoNCiAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdpb3JlZyAtZDIgLWMgSU9QbGF0Zm9ybUV4cGVydERldmljZSB8IGdyZXAgSU9QbGF0Zm9ybVVVSUQgfCBhd2sgLUY9IFwneyBzcGxpdCgkMiwgcmVzLCAiXFwiIik7IHByaW50IHJlc1syXTsgfVwnXG5leGl0XG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIHJldC5pZGVudGlmaWVycy5wcm9kdWN0X3V1aWQgPSBjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKTsNCg0KICAgIHRyaW1JZGVudGlmaWVycyhyZXQuaWRlbnRpZmllcnMpOw0KICAgIHJldHVybiAocmV0KTsNCn0NCg0Kc3dpdGNoKHByb2Nlc3MucGxhdGZvcm0pDQp7DQogICAgY2FzZSAnbGludXgnOg0KICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHsgX09iamVjdElEOiAnaWRlbnRpZmllcnMnLCBnZXQ6IGxpbnV4X2lkZW50aWZpZXJzIH07DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgJ3dpbjMyJzoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IF9PYmplY3RJRDogJ2lkZW50aWZpZXJzJywgZ2V0OiB3aW5kb3dzX2lkZW50aWZpZXJzIH07DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgJ2Rhcndpbic6DQogICAgICAgIG1vZHVsZS5leHBvcnRzID0geyBfT2JqZWN0SUQ6ICdpZGVudGlmaWVycycsIGdldDogbWFjb3NfaWRlbnRpZmllcnMgfTsNCiAgICAgICAgYnJlYWs7DQogICAgZGVmYXVsdDoNCiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7IGdldDogZnVuY3Rpb24gKCkgeyB0aHJvdyAoJ1Vuc3VwcG9ydGVkIFBsYXRmb3JtJyk7IH0gfTsNCiAgICAgICAgYnJlYWs7DQp9DQptb2R1bGUuZXhwb3J0cy5pc0RvY2tlciA9IGZ1bmN0aW9uIGlzRG9ja2VyKCkNCnsNCiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPSAnbGludXgnKSB7IHJldHVybiAoZmFsc2UpOyB9DQoNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgiY2F0IC9wcm9jL3NlbGYvY2dyb3VwIHwgdHIgJ1xuJyAnYCcgfCBhd2sgLUYnYCcgJ3sgc3BsaXQoJDEsIHJlcywgIiArICciLyIpOyBpZihyZXNbMl09PSJkb2NrZXIiKXtwcmludCAiMSI7fSB9XCdcbmV4aXRcbicpOw0KICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyICE9ICcnKTsNCn07DQptb2R1bGUuZXhwb3J0cy5pc1ZNID0gZnVuY3Rpb24gaXNWTSgpDQp7DQogICAgdmFyIHJldCA9IGZhbHNlOw0KICAgIHZhciBpZCA9IHRoaXMuZ2V0KCk7DQogICAgaWYgKGlkLmxpbnV4ICYmIGlkLmxpbnV4LnN5c192ZW5kb3IpDQogICAgew0KICAgICAgICBzd2l0Y2ggKGlkLmxpbnV4LnN5c192ZW5kb3IpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgJ1ZNd2FyZSwgSW5jLic6DQogICAgICAgICAgICBjYXNlICdRRU1VJzoNCiAgICAgICAgICAgIGNhc2UgJ1hlbic6DQogICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQogICAgaWYgKGlkLmlkZW50aWZpZXJzLmJpb3NfdmVuZG9yKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoKGlkLmlkZW50aWZpZXJzLmJpb3NfdmVuZG9yKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdWTXdhcmUsIEluYy4nOg0KICAgICAgICAgICAgY2FzZSAnWGVuJzoNCiAgICAgICAgICAgIGNhc2UgJ1NlYUJJT1MnOg0KICAgICAgICAgICAgICAgIHJldCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChpZC5pZGVudGlmaWVycy5ib2FyZF92ZW5kb3IgJiYgaWQuaWRlbnRpZmllcnMuYm9hcmRfdmVuZG9yID09ICdWTXdhcmUsIEluYy4nKSB7IHJldCA9IHRydWU7IH0NCiAgICBpZiAoaWQuaWRlbnRpZmllcnMuYm9hcmRfbmFtZSkNCiAgICB7DQogICAgICAgIHN3aXRjaCAoaWQuaWRlbnRpZmllcnMuYm9hcmRfbmFtZSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnVmlydHVhbEJveCc6DQogICAgICAgICAgICBjYXNlICdWaXJ0dWFsIE1hY2hpbmUnOg0KICAgICAgICAgICAgICAgIHJldCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgaWYgKCFyZXQpIHsgcmV0ID0gdGhpcy5pc0RvY2tlcigpOyB9DQogICAgcmV0dXJuIChyZXQpOw0KfTsNCg0KDQovLyBiaW9zX2RhdGUgPSBCSU9TLT5SZWxlYXNlRGF0ZQ0KLy8gYmlvc192ZW5kb3IgPSBCSU9TLT5NYW51ZmFjdHVyZXINCi8vIGJpb3NfdmVyc2lvbiA9IEJJT1MtPlNNQklPU0JJT1NWZXJzaW9uDQovLyBib2FyZF9uYW1lID0gQkFTRUJPQVJELT5Qcm9kdWN0ID0gaW9yZWcvYm9hcmQtaWQNCi8vIGJvYXJkX3NlcmlhbCA9IEJBU0VCT0FSRC0+U2VyaWFsTnVtYmVyID0gaW9yZWcvc2VyaWFsLW51bWJlciB8IGlvcmVnL0lPUGxhdGZvcm1TZXJpYWxOdW1iZXINCi8vIGJvYXJkX3ZlbmRvciA9IEJBU0VCT0FSRC0+TWFudWZhY3R1cmVyID0gaW9yZWcvbWFudWZhY3R1cmVyDQovLyBib2FyZF92ZXJzaW9uID0gQkFTRUJPQVJELT5WZXJzaW9uDQoNCg==', 'base64').toString());"); #ifdef __APPLE__ duk_peval_string_noresult(ctx, "addModule('mac-powerutil', Buffer.from('LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIHBvd2VydXRpbCgpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ21hYy1wb3dlcnV0aWwnOwoKICAgIHRoaXMuc2xlZXAgPSBmdW5jdGlvbiBzbGVlcCgpCiAgICB7DQogICAgICAgIHZhciBjaGlsZDsNCiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gc2xlZXBcJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NsZWVwKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KICAgIHRoaXMucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2h1dGRvd24gLXIgbm93XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHRocm93ICgncmVzdGFydCgpIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtJyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9CiAgICB0aGlzLnNodXRkb3duID0gZnVuY3Rpb24gc2h1dGRvd24oKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaCAocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NodXRkb3duIC1oIG5vd1xuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NodXRkb3duKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgcG93ZXJ1dGlsKCk7', 'base64').toString());"); diff --git a/modules/identifiers.js b/modules/identifiers.js index c62e7db..b98550f 100644 --- a/modules/identifiers.js +++ b/modules/identifiers.js @@ -47,6 +47,12 @@ function linux_identifiers() identifiers['board_version'] = ret['board_version']; identifiers['product_uuid'] = ret['product_uuid']; + 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('cat /proc/cpuinfo | grep "model name" | ' + "tr '\\n' ':' | awk -F: '{ print $2 }'\nexit\n"); + child.waitExit(); + identifiers['cpu_name'] = child.stdout.str.trim(); + values.identifiers = identifiers; values.linux = ret; trimIdentifiers(values.identifiers);