{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSubDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipSubDialog.vue","mtime":1705895419251},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\babel.config.js","mtime":1725536844935},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9yZWFkT25seUVycm9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2J6emdqLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3JlYWRPbmx5RXJyb3IuanMiOwppbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2J6emdqLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvYnp6Z2otZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyI7CmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0ICJyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmRvdC1hbGwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3kuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgeyBtYXBTdGF0ZSB9IGZyb20gJ3Z1ZXgnOwppbXBvcnQgdXRpbHMgZnJvbSAnQC91dGlscy5qcyc7CmltcG9ydCBob3RlbnRVaVV0aWxzIGZyb20gJ0AvaG90ZW50LXVpLXV0aWwuanMnOwppbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnZWxlbWVudC11aSc7CmltcG9ydCByZXEgZnJvbSAnQC9yZXF1ZXN0LmpzJzsKaW1wb3J0IHN1Yl9waW9fbWl4aW4gZnJvbSAnQC9zdWItcGVybWlzc2lvbi1taXhpbi5qcyc7CmltcG9ydCBFaXBUYWcgZnJvbSAnQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwVGFnLnZ1ZSc7CmltcG9ydCBFaXBTZWxlY3REaWEgZnJvbSAnQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwU2VsZWN0RGlhLnZ1ZSc7CmV4cG9ydCBkZWZhdWx0IHsKICBjb21wb25lbnRzOiB7CiAgICBFaXBUYWc6IEVpcFRhZywKICAgIEVpcFNlbGVjdERpYTogRWlwU2VsZWN0RGlhCiAgfSwKICBuYW1lOiAnZWlwLWRpYWxvZycsCiAgcHJvcHM6IFsndmFsaWRhdGUnLCAndmFsdWUnLCAnbmFtZScsICdwZXJtaXNzaW9uJywgJ2F0dGVyJywgJ3NpbmdsZScsICdzZWxlY3RvcmNvbmZpZycsICdjdXN0ZGlhbG9nJywgJ3BsYWNlaG9sZGVyJywgJ3Rvb2x0aXBwbGFjZW1lbnQnLCAnaW5pdEZpbGxEYXRhJywgJ2luaXRGaWxsRGF0YVR5cGUnLCAncmVsYXRpb24nLCAnbWF4Um93J10sCiAgbWl4aW5zOiBbc3ViX3Bpb19taXhpbl0sCiAgLy/mt7flhaXmlrnlvI/lvJXlhaXooajljZXnu4Tku7bkuK3lhazlhbHlsZ7mgKfvvIzlpITnkIblrZDooajjgIHlrZnooajooYzlhoXogZTliqjvvIjliIfpnaLkv67mlLlwZXJtaXNzaW9uX3N1Yu+8iQogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBkYXRhOiB7CiAgICAgICAgcXhkZDoge30KICAgICAgfSwKICAgICAgaW5wdXRTdWZmaXhXaWR0aDogMCwKICAgICAgcGxhY2Vob2xkZXJCbzogJycsCiAgICAgIHF1aWNrU2VhcmNoOiAnJywKICAgICAgLy/loavlhpnmj5DnpLoKICAgICAgY29uZGl0aW9uQmluZDogW10sCiAgICAgIC8v5Y+C5pWw5p+l6K+i5a2X5q61CiAgICAgIG5vZGVLZXk6ICdJRF8nLAogICAgICAvL+agkeW9ouaVsOaNrueItklkCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dMaXN0OiBmYWxzZSwKICAgICAgY3VzdG9tRGlhbG9nU2hvd1RyZWU6IGZhbHNlLAogICAgICBzZWxlY3RPcmdQcm9wczogewogICAgICAgIGxhYmVsOiAnbmFtZScKICAgICAgfSwKICAgICAgc3R5bGU6ICcnLAogICAgICAvL+WvueivneahhuWuvemrmAogICAgICBzZWxlY3RPcmdzOiBudWxsLAogICAgICBpbnB1dFN1ZmZpeEhlaWdodDogMzMsCiAgICAgIGNvbmZpZzogbnVsbCwKICAgICAgdXBkYXRpbmc6IGZhbHNlLAogICAgICBkaXNwbGF5ZmllbGQ6IFtdLAogICAgICAvL+aYvuekuuWtl+autQogICAgICBjdXN0b21EaWFsb2c6IHt9LAogICAgICBxdWVyeVBhcmFtOiAnJywKICAgICAgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwKICAgICAgcHJvcHMxOiBbXSwKICAgICAgc2hvd0RhdGE6IFtdLAogICAgICBjaGVja0JveERhdGFBbGw6IFtdLAogICAgICAvL+mAieS4reWvueixoeeahOmbhuWQiAogICAgICBkZWZhdWx0UHJvcHM6IHsKICAgICAgICBjaGlsZHJlbjogJ2NoaWxkcmVuJywKICAgICAgICBsYWJlbDogJ2xhYmVsJwogICAgICB9LAogICAgICBwcm9wc0RhdGE6IFtdLAogICAgICBxdWVyeXNTaG93OiBmYWxzZSwKICAgICAgLy/mmK/lkKbmmL7npLrmkJzntKLmoYYKICAgICAgdW5kZWZpbmVkYTogJycsCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsCiAgICAgIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVCiAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICB0b3RhbDogMAogICAgICB9LAogICAgICBwYXJhbTogW10sCiAgICAgIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgIHRyZWVMaXN0OiBbXSwKICAgICAgZGlzcGxheUZpZWxkOiB7fSwKICAgICAgcXVlcnlQYXJhbXM6IFtdLAogICAgICBwbGFjZWhvbGRlcnM6IFtdLAogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwKICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sCiAgICAgIGNvbWJpVHJlZURpc3BsYXlGaWVsZDogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sCiAgICAgIHRvZ2dsZUJ0bjogJ2VsLWljb24tYXJyb3ctbGVmdCcsCiAgICAgIHRyZWVTaG93OiB0cnVlLAogICAgICB0cmFuc3Rpb25XaWR0aDogJzI1JScsCiAgICAgIGxlZnRUcmVlVGl0bGU6ICcnLAogICAgICB3cml0ZWFibGU6IHRydWUsCiAgICAgIGlzU2hvdzogdHJ1ZQogICAgfTsKICB9LAogIHdhdGNoOiB7CiAgICBwcm9wczE6IGZ1bmN0aW9uIHByb3BzMShuZXdWYWwsIG9sZFZhbCkgewogICAgICAvL+agkeW9ogogICAgICBpZiAodGhpcy5zaG93RGF0YSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaG93RGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgZGF0YS5wdXNoKHRoaXMuc2hvd0RhdGFbaV0pOwogICAgICAgIH0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkYXRhLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQoZGF0YVtfaV0sIHRydWUpOwogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtfaV0sIHRoaXNfKTsKICAgICAgICAgIH0KICAgICAgICB9LCAyMDApOwogICAgICB9CiAgICB9CiAgfSwKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgdmFyIHJlcXVlc3RUeXBlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5zcGxpdCgnLycpOwogICAgdmFyIGlzRG9uZUxpc3QgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnLycpOwogICAgaWYgKHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDFdID09ICdnZXQnIHx8IHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDJdID09ICdnZXQnIHx8IGlzRG9uZUxpc3RbaXNEb25lTGlzdC5sZW5ndGggLSAxXSA9PSAnZG9uZUxpc3QnKSB7CiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAodGhpcy5pbml0RmlsbERhdGEgPT0gJ3RydWUnKSB7CiAgICAgICAgdGhpcy5pbml0VGVtcGxhdGVEYXRhKCk7CiAgICAgIH0KICAgIH0KICB9LAogIGNvbXB1dGVkOiBtYXBTdGF0ZSh7CiAgICB0b3RhbDogZnVuY3Rpb24gdG90YWwoc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy50b3RhbDsKICAgIH0sCiAgICBkaWFsb2dEYXRhOiBmdW5jdGlvbiBkaWFsb2dEYXRhKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cucm93czsKICAgIH0sCiAgICBpbnB1dFZhbDogZnVuY3Rpb24gaW5wdXRWYWwoKSB7CiAgICAgIGlmICghdGhpcy52YWx1ZSB8fCB0aGlzLnZhbHVlID09ICd8fFtdJykgewogICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gW107CiAgICAgICAgLy8gdGhpcy5zaG93RGF0YSA9IFtdOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgnLCcpOwogICAgICAgIGlmICh0aGlzLnZhbHVlLmluZGV4T2YoJ3x8JykgPiAwKSB7CiAgICAgICAgICBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgnfHwnKVswXS5zcGxpdCgnLCcpOwogICAgICAgICAgLy8gdGhpcy5zaG93RGF0YT1KU09OLnBhcnNlKHRoaXMudmFsdWUuc3BsaXQoInx8IilbMV0pOwogICAgICAgIH0KICAgICAgICAvLyAgdGhpcy5zaG93RGF0YSA9dGhpcy5zZWxlY3RPcmdzOwogICAgICAgIHZhciBpZEFyeSA9IG51bGw7CiAgICAgICAgdmFyIGFjY291bnRBcnkgPSBudWxsOwogICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICBuYW1lQXJ5LmZvckVhY2goZnVuY3Rpb24gKG0sIGkpIHsKICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICB2YWx1ZTogbQogICAgICAgICAgfTsKICAgICAgICAgIHJlc3VsdC5wdXNoKG4pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0sCiAgICBpbnB1dFdyaXRlYWJsZTogZnVuY3Rpb24gaW5wdXRXcml0ZWFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLndyaXRlYWJsZSA/IHV0aWxzLmdldFdyaXRlYWJsZSh0aGlzLnBlcm1pc3Npb25fc3ViKSA6IHRoaXMud3JpdGVhYmxlOwogICAgfSwKICAgIGlucHV0VmFsaWRhdGU6IGZ1bmN0aW9uIGlucHV0VmFsaWRhdGUoKSB7CiAgICAgIHZhciB2YWxpZGF0ZU9iaiA9IHRoaXMuJHN0b3JlLnN0YXRlLmluZGV4LnZhbGlkYXRlOwogICAgICByZXR1cm4gdXRpbHMuYWRkUmVxdWlyZWRPck5vdCh0aGlzLnBlcm1pc3Npb25fc3ViLCB0aGlzLnZhbGlkYXRlLCB2YWxpZGF0ZU9iaiwgdGhpcyk7CiAgICB9LAogICAgaW5wdXROYW1lOiBmdW5jdGlvbiBpbnB1dE5hbWUoKSB7CiAgICAgIHZhciBsYWJlbGRlc2MgPSAnJzsKICAgICAgaWYgKHRoaXMuJHNsb3RzICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzYyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW4gJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQpIHsKICAgICAgICBsYWJlbGRlc2MgPSB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dDsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpICsgJy0nICsgbGFiZWxkZXNjOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCk7CiAgICAgIH0KICAgIH0sCiAgICAvLyDmmK/lkKbmnInlm57loavorr7nva4KICAgIGJpbmRTZXQ6IGZ1bmN0aW9uIGJpbmRTZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yY29uZmlnID8gdGhpcy5zZWxlY3RvcmNvbmZpZy5iaW5kIDogbnVsbDsKICAgIH0KICB9KSwKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkgewogICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKSB7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9ICfor7fpgInmi6nlhoXlrrknOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5wbGFjZWhvbGRlckJvID0gdGhpcy5wbGFjZWhvbGRlcjsKICAgIH0KICAgIHRoaXMuJHZhbGlkYXRvciA9IHRoaXMuJHJvb3QuJHZhbGlkYXRvcjsKICB9LAogIG1ldGhvZHM6IHsKICAgIHNlbGVjdEFsbDogZnVuY3Rpb24gc2VsZWN0QWxsKHNlbGVjdGlvbikgewogICAgICBpZiAodGhpcy5vbGRzZWxlY3RPcmdzICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNlbGVjdGlvbi5sZW5ndGg7IHgrKykgewogICAgICAgICAgaWYgKHRoaXMuaW5kZXhBcnJheSh0aGlzLm9sZHNlbGVjdE9yZ3MsIHNlbGVjdGlvblt4XSkgPT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMub2xkc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvblt4XSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMub2xkc2VsZWN0T3Jncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAoc2VsZWN0aW9uKTsKICAgICAgfQogICAgfSwKICAgIGNoZWNrTm9kZTogZnVuY3Rpb24gY2hlY2tOb2RlKGRhdGEsIHRoaXNfLCBwbm9kZSkgewogICAgICBpZiAoZGF0YS5QaWQpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShkYXRhLlBpZCk7CiAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICBpZiAobm9kZS5kYXRhLlBpZCkgewogICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmluZGV0ZXJtaW5hdGUgPSB0cnVlOwogICAgICAgICAgdGhpcy5jaGVja05vZGUodGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmRhdGEsIHRoaXNfLCB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUuaW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocG5vZGUgJiYgIXBub2RlLmluZGV0ZXJtaW5hdGUpIHsKICAgICAgICBwbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgfQogICAgfSwKICAgIC8v5Zue6L2m5p+l6K+iCiAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24gc2VhcmNoRW50ZXJGdW4oZSkgewogICAgICB2YXIga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IGUua2V5Q29kZSA6IGUud2hpY2g7CiAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgfQogICAgfSwKICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVNpemVDaGFuZ2Uoc2l6ZSkgewogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgIC8v5q+P6aG15LiL5ouJ5pi+56S65pWw5o2uCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemU7CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgaGFuZGxlQ3VycmVudENoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ3VycmVudENoYW5nZShjdXJyZW50UGFnZSkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmNoZWNrQm94RGF0YUFsbCwgcm93KTsKICAgICAgICAgIGlmIChyZXMgPT0gLTEpIHsKICAgICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgIC8v54K55Ye756ys5Yeg6aG1CiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gY3VycmVudFBhZ2U7CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgY2hlY2tMaXN0OiBmdW5jdGlvbiBjaGVja0xpc3QoKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIC8v5YiX6KGoCiAgICAgICAgaWYgKHRoaXNfLmNoZWNrQm94RGF0YUFsbCAhPSB1bmRlZmluZWQgJiYgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXNfLmluZGV4QXJyYXkodGhpc18uZGlhbG9nRGF0YSwgcm93KTsKICAgICAgICAgICAgdGhpc18udW5kZWZpbmVkYSA9IHJlczsKICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgewogICAgICAgICAgICAgIHRoaXNfLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgdGhpc18udG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwgMzAwKTsKICAgIH0sCiAgICB0b2dnbGVSb3dTZWxlY3Rpb246IGZ1bmN0aW9uIHRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHZhbCkgewogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbih0aGlzLmRpYWxvZ0RhdGFbcmVzXSwgdmFsKTsKICAgIH0sCiAgICBzaG93RGlhbG9nOiBmdW5jdGlvbiBzaG93RGlhbG9nKGl0ZW0pIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIC8v56ys5LqM5qyh54K55Ye75a2Q6KGo5Zue5aGr5a+56K+d5qGGIOesrOS4gOasoemAieS4reeahOaVsOaNruS4jeaYr+mAieS4reeKtuaAgQogICAgICBpZiAodGhpc18uc2VsZWN0T3JncykgewogICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MuZW1wdHkoKTsKICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZW1wdHkoKTsKICAgICAgfQogICAgICB2YXIgYWxpYXMgPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5hbGlhczsKICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnlBbGlhcycsIGFsaWFzKS50aGVuKGZ1bmN0aW9uIChjdXN0b21EaWFsb2cpIHsKICAgICAgICBpZiAoIWN1c3RvbURpYWxvZyB8fCAhY3VzdG9tRGlhbG9nLmFsaWFzKSB7CiAgICAgICAgICBNZXNzYWdlLmVycm9yKCflr7nor53moYbliKvlkI3jgJAnICsgYWxpYXMgKyAn44CR5LiN5a2Y5Zyo77yBJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgewogICAgICAgICAgdmFyIGRpc3BsYXlsaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgIHRoaXNfLm5vZGVLZXkgPSBkaXNwbGF5bGlzdC5pZDsKICAgICAgICB9CiAgICAgICAgLy/lr7nor53moYbmjInooajljZXlrZfmrrXmn6Xor6LvvIjlj4LmlbDkvKDlhaXnmoTvvIkKICAgICAgICB2YXIgYmluZExpc3QgPSB0aGlzXy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuY29uZGl0aW9uczsKICAgICAgICB0aGlzXy5wYXJhbSA9IFtdOyAvL+e7keWumueahOihqOWNleWtl+autQogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMycgJiYgZWxlLmJpbmQpIHsKICAgICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkOwogICAgICAgICAgICAgIG9iai5iaW5kID0gZWxlLmJpbmQ7CiAgICAgICAgICAgICAgdGhpc18ucGFyYW0ucHVzaChvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy/liKTmlq3lr7nor53moYbmn6Xor6LmmK/lkKbmnInmnaHku7YKICAgICAgICB2YXIgdXNlcklucHV0TGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICB0aGlzXy5xdWlja1NlYXJjaCA9ICcnOyAvL+Whq+WGmeaPkOekuiBwbGFjZWhvbGRlcgogICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQgPSBbXTsKICAgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBbXTsKICAgICAgICB2YXIgcGxhY2Vob2xkZXJzID0gW107CiAgICAgICAgaWYgKHVzZXJJbnB1dExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgdXNlcklucHV0TGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAvL+adoeS7tuafpeivouWPguaVsO+8iOeUqOaIt+i+k+WFpeeahO+8iSDmlofmnKzmoYbovpPlhaUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMScpIHsKICAgICAgICAgICAgICBvYmpbZWxlLmZpZWxkXSA9ICcnOwogICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2gob2JqKTsKICAgICAgICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kLnB1c2goZWxlKTsKICAgICAgICAgICAgICBwbGFjZWhvbGRlcnMucHVzaCgn6K+36L6T5YWlJyArIGVsZS5jb21tZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBfdGhpczIuJHNldChfdGhpczIsICdxdWVyeVBhcmFtcycsIHF1ZXJ5UGFyYW1zKTsKICAgICAgICAgIF90aGlzMi4kc2V0KF90aGlzMiwgJ3BsYWNlaG9sZGVycycsIHBsYWNlaG9sZGVycyk7CiAgICAgICAgfQogICAgICAgIC8v5Yik5pat5piv5ZCm5pi+56S65p2h5Lu25p+l6K+i6L6T5YWl5qGGCiAgICAgICAgaWYgKHRoaXNfLnF1aWNrU2VhcmNoICE9ICcnKSB7CiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJ+ivt+i+k+WFpScgKyBfdGhpczIucXVpY2tTZWFyY2ggKyAn5p+l6K+iJzsKICAgICAgICB0aGlzXy5zdHlsZSA9ICdoZWlnaHQ6JyArIGN1c3RvbURpYWxvZy5oZWlnaHQgKyAncHgnOwogICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmhlaWdodCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA8PSA5MDApIHsKICAgICAgICAgIF90aGlzMi5zdHlsZSA9ICdoZWlnaHQ6NDQwcHgnOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDAgfHwgY3VzdG9tRGlhbG9nLnN0eWxlID09IDIpIHsKICAgICAgICAgIC8v5YiX6KGoCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93KHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgewogICAgICAgICAgLy/moJHlvaIKICAgICAgICAgIHRoaXNfLnBhZ2VQYXJhbSA9IHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZyA9IGN1c3RvbURpYWxvZzsKICAgICAgICAgIHZhciBwYXJhbSA9IHt9OwogICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gW107CiAgICAgICAgICAvL+WIpOaWreaYr+WQpuWtmOWcqOadoeS7tgogICAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgICB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIC8v5Yik5pat5p2h5Lu25a2X5q615piv5ZCm5piv5Yqo5oCB5Lyg5YWl77yIZGVmYXVsdFR5cGXvvJo077ya5Yqo5oCB5Lyg5YWl77yMMu+8muWbuuWumuWAvCDvvIkKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZGVmYXVsdFR5cGUgPT0gJzQnKSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtW3RoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5maWVsZF0gPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uY29tbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8v5pyJ5Yqo5oCB5Lyg5YWl55qE5a2X5q61CiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocGFyYW0pICE9ICd7fScpIHsKICAgICAgICAgICAgdGhpc18uZGlhbG9nVmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL+aXoOWKqOaAgeS8oOWFpeeahOWtl+autQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dUcmVlU2hvdyh0aGlzXy5wYWdlUGFyYW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgLy/liKTmlq3mlbDmja7mmK/lkKbljIXlkKvmn5DkuKrlr7nosaHvvIzlubbov5Tlm57mlbDmja7ljIXlkKvlr7nosaHnmoTkuIvmoIcKICAgIGluZGV4QXJyYXk6IGZ1bmN0aW9uIGluZGV4QXJyYXkoYXJyYXksIGl0ZW0pIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYXJyYXlbaV0pID09IEpTT04uc3RyaW5naWZ5KGl0ZW0pKSB7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfSwKICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5Liq5aSN6YCJ5qGG5pe26Kem5Y+RCiAgICBvblRhYmxlU2VsZWN0OiBmdW5jdGlvbiBvblRhYmxlU2VsZWN0KHJvd3MsIHJvdykgewogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IGZhbHNlOwogICAgICAvL+WIpOaWreeCueWHu+WIl+ihqOaVsOaNruaXtuWkjemAieahhuaYr+WQpuWLvumAiSAgc2VsZWN0ZWTvvJp0cnVl5LiN5Yu+6YCJ77yMZmFsc2Xli77pgIkKICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5zZWxlY3RPcmdzICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xOwogICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdyk7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOwogICAgICB9CiAgICB9LAogICAgLy/ngrnlh7vliJfooajmn5DkuIDmnaHmlbDmja7ml7bop6blj5EKICAgIG9yZ1Jvd0NsaWNrOiBmdW5jdGlvbiBvcmdSb3dDbGljayhyb3csIGNvbHVtbiwgZXZlbnQpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldC5jaGlsZHJlblswXS5jaGlsZHJlblswXS5jaGlsZHJlblswXSkudHJpZ2dlcignY2xpY2snKTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChyb3cpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxKSB7CiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsKICAgICAgICAvL+WIpOaWreeCueWHu+WIl+ihqOaVsOaNruaXtuWkjemAieahhuaYr+WQpuWLvumAiSAgc2VsZWN0ZWTvvJp0cnVl5LiN5Yu+6YCJ77yMZmFsc2Xli77pgIkKICAgICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdE9yZ3MgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYgdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KSAhPT0gLTE7CiAgICAgICAgaWYgKHNlbGVjdGVkKSB7CiAgICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICB2YXIgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KTsKICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS50b2dnbGVSb3dTZWxlY3Rpb24ocm93KTsKICAgICAgfQogICAgfSwKICAgIC8v5YiX6KGo5aSN6YCJ5qGG5pyJ5pS55Y+Y5pe26Kem5Y+RCiAgICBvcmdUYWJsZVNlbGVjdGlvbjogZnVuY3Rpb24gb3JnVGFibGVTZWxlY3Rpb24oc2VsZWN0aW9uKSB7CiAgICAgIC8v5YWo6YCJ55qE5oOF5Ya154m55q6K5aSE55CGKOS4uuS6huS4juWOn+acrOWKn+iDvemAu+i+keS4jeWGsueqgSzlhYjlpI3liLbkuIDku73ml6fnmoTpgInkuK3mlbDmja4u54S25ZCO5ou/5Yiw5YWo6YCJ5LqL5Lu25Lit5Y676K6h566XKQogICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLnNlbGVjdE9yZ3MpOwogICAgICAvL+WkmumAiQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEgJiYgIXRoaXMuaXNDdXJyZW50Q2hhbmdlKSB7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSAmJiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IHNlbGVjdGlvbjsKICAgICAgICAgIH0gZWxzZSBpZiAoKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncykgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzZWxlY3Rpb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25baV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDdXJyZW50Q2hhbmdlICYmIHNlbGVjdGlvbi5sZW5ndGggPj0gMTApIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBmb3IgKHZhciB1ID0gdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCAtIDE7IHUgPj0gMDsgdS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5pbmRleEFycmF5KHNlbGVjdGlvbiwgdGhpcy5zZWxlY3RPcmdzW3VdKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBzZWxlY3Rpb24ubGVuZ3RoOyBfaTIrKykgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltfaTJdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgX2kzID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IF9pMyA+PSAwOyBfaTMtLSkgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltfaTNdKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGRpYWxvZ0NvbmZpcm06IGZ1bmN0aW9uIGRpYWxvZ0NvbmZpcm0oKSB7CiAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+mAieaLqeaVsOaNruWbnuWhqycpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSAnJzsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOwogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgfSwKICAgIC8v6YeN572uCiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICB0aGlzLnF1ZXJ5UGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtT2JqKSB7CiAgICAgICAgZm9yICh2YXIga2V5IGluIHBhcmFtT2JqKSB7CiAgICAgICAgICBfdGhpczMucXVlcnlQYXJhbXNba2V5XSA9ICcnOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8v57uE5ZCI5qCR6YeN572uCiAgICAgIGlmICh0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZSkgewogICAgICAgIHZhciBub2RlcyA9IHRoaXMuJHJlZnMuY29tYmluYXRpb25UcmVlLnN0b3JlLm5vZGVzTWFwOwogICAgICAgIGZvciAodmFyIGtleSBpbiBub2RlcykgewogICAgICAgICAgbm9kZXNba2V5XS5leHBhbmRlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHRoaXMuc2VhcmNoKHRydWUpOwogICAgfSwKICAgIC8v5p+l6K+iCiAgICBzZWFyY2g6IGZ1bmN0aW9uIHNlYXJjaChyZXNldFBhZ2ludGlvbikgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgdmFyIHF1ZXJ5cyA9IFtdOyAvL+afpeivouadoeS7tgogICAgICB2YXIgcXVlcnlGaWx0ZXIgPSB7fTsKICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMucGFnaW5hdGlvbikgPT0gJ3t9JykgewogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJwogICAgICAgIH07CiAgICAgIH0KICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24KICAgICAgfTsKICAgICAgaWYgKHJlc2V0UGFnaW50aW9uKSB7CiAgICAgICAgcGFnZUJlYW4ucGFnZUJlYW4gPSB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScKICAgICAgICB9OwogICAgICB9CiAgICAgIC8v55So5oi36L6T5YWl55qECiAgICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zLmxlbmd0aCAhPSAwICYmIHRoaXMucXVlcnlQYXJhbXNbMF0gIT0gJycpIHsKICAgICAgICB0aGlzLmNvbmRpdGlvbkJpbmQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsCiAgICAgICAgICAgIHZhbHVlOiBfdGhpczQucXVlcnlQYXJhbXNbaXRlbS5maWVsZF0sCiAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsCiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLAogICAgICAgICAgICByZWxhdGlvbjogJ0FORCcKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8v5Y+C5pWw5Lyg5YWl55qE5p+l6K+i5ou85o6lCiAgICAgIGlmICh0aGlzLnBhcmFtKSB7CiAgICAgICAgdmFyIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICAgIHRoaXMucGFyYW0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwKICAgICAgICAgICAgdmFsdWU6IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBpdGVtLmJpbmQpLAogICAgICAgICAgICBncm91cDogJ21haW4nLAogICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywKICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+adpeiHque7hOWQiOWvueivneahhueahAogICAgICBpZiAodGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDApIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5c1tpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChxdWVyeXMubGVuZ3RoID4gMCkgewogICAgICAgIHF1ZXJ5RmlsdGVyID0gewogICAgICAgICAgcGFnZUJlYW46IHBhZ2VCZWFuLnBhZ2VCZWFuLAogICAgICAgICAgcXVlcnlzOiBxdWVyeXMKICAgICAgICB9OwogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcXVlcnlGaWx0ZXI7CiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRsaXN0SnNvbicsIHRoaXMuY3VzdG9tRGlhbG9nKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzNC5jaGVja0xpc3QoKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHBhZ2VCZWFuOwogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvZ2V0bGlzdEpzb24nLCB0aGlzLmN1c3RvbURpYWxvZykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczQuY2hlY2tMaXN0KCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBkb1F1ZXJ5OiBmdW5jdGlvbiBkb1F1ZXJ5KHBhcmFtKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwogICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgdmFyIHBhcmFtTG9hZERhdGEsIHBJbnN0LCBpLCBiaW5kVmFsLCBvYmosIHF1ZXJ5VXJsLCByZXF1ZXN0TWV0aG9kOwogICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIHBhcmFtTG9hZERhdGEgPSBbXTsKICAgICAgICAgICAgICBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShfdGhpczUpOyAvL+iOt+WPluWFs+iBlOafpeivoue7keWumueahOihqOWNleWPguaVsAogICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbS5jb25kaXRpb25maWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCAhPSAnJykgewogICAgICAgICAgICAgICAgICBiaW5kVmFsID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgIG9iaiA9IHsKICAgICAgICAgICAgICAgICAgICBrZXk6IHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBiaW5kVmFsCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHBhcmFtTG9hZERhdGEucHVzaChvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBxdWVyeVVybCA9IHBhcmFtLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyAnJHtmb3JtfS9mb3JtL2N1c3RvbVF1ZXJ5L3YxL2RvUXVlcnk/YWxpYXM9JyArIHBhcmFtLmFsaWFzICsgJyZwYWdlPTEnIDogcGFyYW0udXJsOwogICAgICAgICAgICAgIHJlcXVlc3RNZXRob2QgPSAnUE9TVCc7IC8v5aaC5p6c5YWz6IGU5pWw5o2u5YiX6KGo5p+l6K+i5pWw5o2u5LiN5piv5pWw5o2u5rqQ5YiZ6K+35rGC5pa55rOV5Li6cmVzdGZ1bOmFjee9rueahOivt+axguaWueW8jwogICAgICAgICAgICAgIGlmIChwYXJhbS5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kID0gcGFyYW0ucmVxdWVzdFR5cGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8v5p+l6K+i5pWw5o2uCiAgICAgICAgICAgICAgcmVxLnJlcXVlc3QoewogICAgICAgICAgICAgICAgdXJsOiBxdWVyeVVybCwKICAgICAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdE1ldGhvZCwKICAgICAgICAgICAgICAgIGRhdGE6IHBhcmFtTG9hZERhdGEKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5YWz6IGU5p+l6K+i5pWw5o2u6L+U5ZueCiAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlvID0gMDsgaW8gPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCAhPSAnJykgewogICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXMuZGF0YS5yb3dzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzW2pdW3BhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKyByZXMuZGF0YS5yb3dzW2pdW3BhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZF0gKyAnLCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAvL+S4u+ihqAogICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJEYXRhLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooajmsqHmlbDmja7nmoTmg4XlhrUKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViVGFiTmFtZSA9IHBhdGhBcnJbMl0ucmVwbGFjZSgnc3ViXycsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+W+l+WIsOWtkOihqOeahOaJgOacieWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJJbml0RGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/miormlbDnu4Tph4zpnaLnmoTlgLzkuLogbnVsbCDovazmjaLkuLrnqbrlrZfnrKbkuLIKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gSlNPTi5zdHJpbmdpZnkoc3ViSW5pdERhdGEpLnJlcGxhY2UoL251bGwvZywgJyIiJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9zdWJEYXRhID0gSlNPTi5wYXJzZShzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBfc3ViRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZnooajmmK/lkKbmnInlgLwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignc3ViXycpID09IDAgJiYgX3N1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJEYXRhW2tleV0gPSBbXTsgLy/mnInliJnmuIXnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v54K55re75Yqg5pe25Yik5pat6KaB5paw5aKe5a2Q6KGo6K6w5b2V5Lit55qE5a2X5q615piv5ZCm5pyJ5YC8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N1YkRhdGFba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3ViRGF0YVtrZXldID0gJyc7IC8v5pyJ5YiZ5riF56m6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5paw5aKe5LiA5p2h5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXS5wdXNoKF9zdWJEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5pyJ5pWw5o2u55qE5oOF5Ya1CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBzdWJEYXRhLmxlbmd0aDsgcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvL+ayoeaciei/lOWbnueahOWAvOWImea4heepugogICAgICAgICAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsAogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpb3AgPSAwOyBpb3AgPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgX3BhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aC5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKF9wYXRoQXJyLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Li76KGoCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCwgJycsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfcGF0aEFyci5sZW5ndGggPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N1YkRhdGEyID0gcEluc3QuZGF0YVtfcGF0aEFyclsxXV1bX3BhdGhBcnJbMl1dOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfcCA9IDA7IF9wIDwgX3N1YkRhdGEyLmxlbmd0aDsgX3ArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAnJywgX3ApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUpOwogICAgICB9KSkoKTsKICAgIH0sCiAgICAvLyDlkIzmraXpgInmi6nnu5PmnpwKICAgIHN5bmNJbnB1dFZhbHVlOiBmdW5jdGlvbiBzeW5jSW5wdXRWYWx1ZSgpIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgdmFyIGlkcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5maWVsZC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICBpZiAodGhpc18uY2hlY2tCb3hEYXRhQWxsIHx8IHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPCAxKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpOwogICAgICAgIH0gZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkodGhpc18uaW5kZXhBcnJheSkuaW5kZXhPZihKU09OLnN0cmluZ2lmeShyb3cpKSA9PSAtMSkgewogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0T3JnczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbMF1bZmllbGRbaV1dKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgaWRzLnB1c2goc1swXS5pZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICAgICAgaWRzLnB1c2goc1tpXS5pZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByZXR1cm5EYXRhID0gc3RyOwogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIC8v5aSE55CG6Ieq5Yqo5Zue5aGr6YWN572uCiAgICAgIHRoaXMuaW5zdElkID0gZm9ybUluc3QuJHBhcmVudC5pbnN0SWQ7CiAgICAgIHZhciBjdXN0RGlhbG9nID0gdGhpcy5jdXN0ZGlhbG9nOwogICAgICB2YXIgZmlsbE9yZyA9IHt9OwogICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcgJiYgY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSAmJiB0aGlzLmZpbGxPcmcuaWQpIHsKICAgICAgICB2YXIgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIG9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGZpbGxPcmdbb3JnTmFtZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5uYW1lOwogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgdmFyIGlkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmlkLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW29yZ0lkRmllbGRdID0gdGhpcy5maWxsT3JnLmlkOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSkgewogICAgICAgICAgdmFyIGNvZGVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuY29kZS5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgZmlsbE9yZ1tvcmdDb2RlRmllbGRdID0gdGhpcy5maWxsT3JnLmNvZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpIHsKICAgICAgICB2YXIgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOwogICAgICAgIHZhciBpbnN0SWRGaWVsZCA9IGluc3RJZFBhdGhbaW5zdElkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICBmaWxsT3JnW2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aDsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqAogICAgICAgIGlmIChfdGhpcy5yZWxhdGlvbiAmJiBfdGhpcy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICBpZiAocmV0dXJuU2l6ZSA+IDEpIHsKICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+S4gOWvueS4gOWtkOihqOWPquiDvemAieaLqeS4gOadoeaVsOaNricpOwogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fTsKICAgICAgICAgIF90aGlzNi5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdKSB7CiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgdmFyIGZyb20gPSAnJzsKICAgICAgICAgICAgICBpZiAoX3RoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsKICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChyb3dbZnJvbV0gPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBmcm9tID0gZnJvbS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSBkZWNvZGVVUklDb21wb25lbnQocm93W2Zyb21dKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgdmFyIHN1YkJvID0gZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dOwogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtkOihqOaVsOaNruacgOWkp+ihjOaVsAogICAgICAgICAgICBpZiAodGhpc18ubWF4Um93ICE9IDAgJiYgc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSA+IHRoaXNfLm1heFJvdykgewogICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCflrZDooajmlbDmja7lt7LotoXov4fmnIDlpKfooYzmlbDjgJAnICsgdGhpc18ubWF4Um93ICsgJ+OAkScpOwogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuZEl0ZXJhdGl2ZScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL+WtkOihqOS4reeahOWtmeihqOWunuS9k++8iOWPr+iDveWtmOWcqOWkmuS4qu+8iQogICAgICAgICAgICB2YXIgc3VuQm9zID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KF90aGlzLiRlbCwgJ3N1bkJvcycpOwogICAgICAgICAgICAvL+WmguaenOWtmOWcqOWtmeihqOWunuS9k+WImeaJi+WKqOa3u+WKoOepuuWtmeihqOaVsOe7hOWvueixoQogICAgICAgICAgICBpZiAoc3VuQm9zKSB7CiAgICAgICAgICAgICAgdmFyIGFycmF5Qm8gPSBzdW5Cb3Muc3BsaXQoJywnKTsKICAgICAgICAgICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBhcnJheUJvLmxlbmd0aDsgX2k0KyspIHsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSAnc3ViXycgKyBhcnJheUJvW19pNF07CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXcgQXJyYXkoKTsKICAgICAgICAgICAgICAgIHN1YkxpbmVEYXRhW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZDooagKICAgICAgICAgICAgaWYgKF90aGlzLnJlbGF0aW9uICYmIF90aGlzLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsKICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmaWxsT3JnICYmIEpTT04uc3RyaW5naWZ5KGZpbGxPcmcpICE9ICd7fScpIHsKICAgICAgICAgICAgICBzdWJMaW5lRGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3ViTGluZURhdGEpLCBmaWxsT3JnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgICAgICAgcmV0dXJuU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKGUubWVzc2FnZSAhPSAnRW5kSXRlcmF0aXZlJykgdGhyb3cgZTsKICAgICAgfQogICAgfSwKICAgIC8v5Y+W5raI5oyJ6ZKuCiAgICBkaWFsb2dDYW5jZWw6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbCgpIHsKICAgICAgdmFyIF90aGlzNyA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHRoaXNfLnF1ZXJ5UGFyYW0gPSAnJzsKICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv54K55Ye75LqG56Gu6K6k5YaN54K55Ye75Y+W5raI55qEICBpbnB1dFZhbOayoeacieWAvOWImeihqOekuuebtOaOpeeCueWHu+eahOWPlua2iAogICAgICAgIGlmICghdGhpc18uaW5wdXRWYWwpIHsKICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzXy5zaG93RGF0YSk7CiAgICAgICAgICBfdGhpczcuY2hlY2tCb3hEYXRhQWxsID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXNfLnNlbGVjdE9yZ3MpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgZGlhbG9nVHJlZUNvbmZpcm06IGZ1bmN0aW9uIGRpYWxvZ1RyZWVDb25maXJtKCkgewogICAgICB2YXIgX3RoaXM4ID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXNfLnByb3BzRGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCfor7fpgInmi6nmlbDmja7lm57loasnKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pOwogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQ7CiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YVswXTsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YTsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJzsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1trXVtmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgICB9CiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdmFyIHJldHVybkRhdGEgPSBzdHI7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmV0dXJuU2l6ZSA9IHJldHVybkRhdGEubGVuZ3RoOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Q6KGoCiAgICAgICAgaWYgKHRoaXNfLnJlbGF0aW9uICYmIHRoaXNfLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsKICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgewogICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcign5LiA5a+55LiA5a2Q6KGo5Y+q6IO96YCJ5oup5LiA5p2h5pWw5o2uJyk7CiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbDsKICAgICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IHt9OwogICAgICAgICAgX3RoaXM4LmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGZ1bmN0aW9uIChjb24pIHsKICAgICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsKICAgICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoJy4nKTsKICAgICAgICAgICAgICB2YXIgZnJvbSA9ICcnOwogICAgICAgICAgICAgIGlmICh0aGlzXy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgewogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHJvd1tmcm9tXSA9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGZyb20gPSBmcm9tLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IGRlY29kZVVSSUNvbXBvbmVudChyb3dbZnJvbV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgewogICAgICAgICAgICB2YXIgc3ViQm8gPSBmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV07CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5aSn5LqO5a2Q6KGo5pWw5o2u5pyA5aSn6KGM5pWwCiAgICAgICAgICAgIGlmICh0aGlzXy5tYXhSb3cgIT0gMCAmJiBzdWJCby5sZW5ndGggKyByZXR1cm5TaXplID4gdGhpc18ubWF4Um93KSB7CiAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoJ+WtkOihqOaVsOaNruW3sui2hei/h+acgOWkp+ihjOaVsOOAkCcgKyB0aGlzXy5tYXhSb3cgKyAn44CRJyk7CiAgICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlOwogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW5kSXRlcmF0aXZlJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8v5a2Q6KGo5Lit55qE5a2Z6KGo5a6e5L2T77yI5Y+v6IO95a2Y5Zyo5aSa5Liq77yJCiAgICAgICAgICAgIHZhciBzdW5Cb3MgPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpc18uJGVsLCAnc3VuQm9zJyk7CiAgICAgICAgICAgIC8v5aaC5p6c5a2Y5Zyo5a2Z6KGo5a6e5L2T5YiZ5omL5Yqo5re75Yqg56m65a2Z6KGo5pWw57uE5a+56LGhCiAgICAgICAgICAgIGlmIChzdW5Cb3MpIHsKICAgICAgICAgICAgICB2YXIgYXJyYXlCbyA9IHN1bkJvcy5zcGxpdCgnLCcpOwogICAgICAgICAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IGFycmF5Qm8ubGVuZ3RoOyBfaTUrKykgewogICAgICAgICAgICAgICAgdmFyIGtleSA9ICdzdWJfJyArIGFycmF5Qm9bX2k1XTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICAgICAgc3ViTGluZURhdGFba2V5XSA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqAogICAgICAgICAgICBpZiAodGhpc18ucmVsYXRpb24gJiYgdGhpc18ucmVsYXRpb24gPT0gJ29uZXRvb25lJykgewogICAgICAgICAgICAgIHN1YkJvLmVtcHR5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ViQm8ucHVzaChzdWJMaW5lRGF0YSk7CiAgICAgICAgICAgIHJldHVyblNpemUtLTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gZmFsc2U7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZS5tZXNzYWdlICE9ICdFbmRJdGVyYXRpdmUnKSB0aHJvdyBlOwogICAgICB9CiAgICB9LAogICAgZGlhbG9nQ2FuY2VsVHJlZTogZnVuY3Rpb24gZGlhbG9nQ2FuY2VsVHJlZSgpIHsKICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pOwogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gZmFsc2U7CiAgICB9LAogICAgZ2V0Q2hlY2tlZDogZnVuY3Rpb24gZ2V0Q2hlY2tlZChkYXRhLCBjaGVja2VkLCBpbmRldGVybWluYXRlKSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdOwogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSB0aGlzLiRyZWZzLnRyZWUuZ2V0Q2hlY2tlZE5vZGVzKCk7CiAgICAgIH0KICAgIH0sCiAgICB0cmVlQ2xpY2s6IGZ1bmN0aW9uIHRyZWVDbGljayhkYXRhLCBuLCBpKSB7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdOwogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSk7CiAgICAgIH0KICAgIH0sCiAgICBjbGVhckFsbFNlbGVjdE9yZ3M6IGZ1bmN0aW9uIGNsZWFyQWxsU2VsZWN0T3JncygpIHsKICAgICAgdGhpcy5zZWxlY3RPcmdzID0gbnVsbDsKICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS5jbGVhclNlbGVjdGlvbigpOwogICAgfSwKICAgIHJlbW92ZVNlbGVjdE9yZzogZnVuY3Rpb24gcmVtb3ZlU2VsZWN0T3JnKGl0ZW0pIHsKICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsICcnKTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuaW5wdXRWYWwuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIC8vIGxldCByZW1vdmVJZCA9IHRoaXMuc2hvd0RhdGFbaXRlbV07CiAgICAgICAgLy/moJHlvaIKICAgICAgICBpZiAodGhpcy5wcm9wc0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5wcm9wc0RhdGEuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB9CiAgICAgICAgLy/liJfooagKICAgICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IG51bGwpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbC5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgIC8vIGlmKGl0ZW0uaWQgPT1yZW1vdmVJZCApewogICAgICAgICAgICBfdGhpczkuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgX3RoaXM5LnRvZ2dsZVJvd1NlbGVjdGlvbihyb3csIGZhbHNlKTsKICAgICAgICAgICAgLy8gfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpOwogICAgICAgIHZhciB2YWx1ZSA9ICcnOwogICAgICAgIHRoaXMuaW5wdXRWYWwuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICB2YWx1ZSArPSB2YWwudmFsdWUgKyAnLCc7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgIT0gJycpIHsKICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnfHwnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5zaG93RGF0YSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpOwogICAgICB9CiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsKICAgIH0sCiAgICBjYWxhY0lucHV0U3VmZml4SGVpZ2h0OiBmdW5jdGlvbiBjYWxhY0lucHV0U3VmZml4SGVpZ2h0KCkgewogICAgICB2YXIgX3RoaXMxMCA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghX3RoaXMxMC4kcmVmcy50YWdTcGFucykgcmV0dXJuOwogICAgICAgIGlmIChfdGhpczEwLiRyZWZzLnRhZ1NwYW5zLm9mZnNldEhlaWdodCkgewogICAgICAgICAgX3RoaXMxMC5pbnB1dFN1ZmZpeEhlaWdodCA9IF90aGlzMTAuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0ICsgNTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMxMC5pbnB1dFN1ZmZpeEhlaWdodCA9IDMwOwogICAgICAgIH0KICAgICAgICAvLyDop6blj5Hpqozor4EKICAgICAgICBfdGhpczEwLiR2YWxpZGF0b3IudmFsaWRhdGUoKTsKICAgICAgfSwgMCk7CiAgICB9LAogICAgY3VzdG9tRGlhbG9nU2hvdzogZnVuY3Rpb24gY3VzdG9tRGlhbG9nU2hvdyhwYWdlUGFyYW0pIHsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nID0gcGFnZVBhcmFtLmN1c3RvbURpYWxvZzsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cucXVlcnlVcmwgPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9JyArIHRoaXMuY3VzdG9tRGlhbG9nLmFsaWFzICsgJyZtYXBQYXJhbT0nICsgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAnJykgOiB0aGlzLmN1c3RvbURpYWxvZy51cmw7CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoIDwgMSkgewogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJwogICAgICAgIH07CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJykgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3VzdG9tRGlhbG9nVHJlZVNob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgewogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBjdXN0b21EaWFsb2cgPSB0aGlzLmN1c3RvbURpYWxvZzsKICAgICAgdmFyIG1hcFBhcmFtID0gJyc7CiAgICAgIGlmIChwYWdlUGFyYW0ucGFyYW0gIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbWFwUGFyYW0gPSBKU09OLnN0cmluZ2lmeShwYWdlUGFyYW0ucGFyYW0pOwogICAgICAgIG1hcFBhcmFtID0gbWFwUGFyYW0uc3Vic3RyaW5nKDEsIG1hcFBhcmFtLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICAgIHZhciByZXF1ZXN0VHlwZSA9IGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gJ0dFVCcgOiBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgPyBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgOiAnUE9TVCc7CiAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsgcGFnZVBhcmFtLmFsaWFzICsgJyZtYXBQYXJhbT0nICsgbWFwUGFyYW07CiAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7CiAgICAgICAgdXJsID0gY3VzdG9tRGlhbG9nLnVybDsKICAgICAgICB2YXIgdGVtcGxhdGVQYSA9IGN1c3RvbURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpIHsKICAgICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCdcXHsnICsgY29uLmZpZWxkICsgJ1xcfScsICdnJyksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBsakNoYXIgPSB1cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnOwogICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICc9JyArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByZXF1ZXN0UGFyYW1zID0ge307CiAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqID0gcGFyYW1zT2JqOwogICAgICB0aGlzLnNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcyk7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlOwogICAgfSwKICAgIC8v5qCR5b2i5p+l6K+iCiAgICBzZWFyY2hUcmVlOiBmdW5jdGlvbiBzZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdmFyIHF1ZXJ5ID0gcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9PSAnUE9TVCcgPyByZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCwgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmopIDogcmVxLmdldChyZXF1ZXN0UGFyYW1zLnVybCk7CiAgICAgIHF1ZXJ5LnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgLy/mmL7npLrlrZfmrrXphY3nva4KICAgICAgICB2YXIgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQ7CiAgICAgICAgLy/miorlr7nor53moYbphY3nva7nmoTmmL7npLrlrZfmrrXmmL7npLrlkI3np7DotYvlgLznu5nmoJHlvaLnmoTmmL7npLrlgLwKICAgICAgICB0aGlzXy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgdGhpc18udHJlZUxpc3QgPSByZXNwb25zZS5kYXRhOwogICAgICAgIC8v5b6X5Yiw6KaB5Yqg6L295qCR55qE5L+h5oGvCiAgICAgICAgdGhpc18ucHJvcHMxID0gdGhpc18udG9UcmVlRGF0YShyZXNwb25zZS5kYXRhLCBkaXNwbGF5ZmllbGQuaWQsIGRpc3BsYXlmaWVsZC5waWQsIGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZSwgZGlzcGxheWZpZWxkLnB2YWx1ZSA/IGRpc3BsYXlmaWVsZC5wdmFsdWUgOiAwKTsKICAgICAgfSk7CiAgICB9LAogICAgLy/liqDovb3moJHnmoTkv6Hmga8KICAgIHRvVHJlZURhdGE6IGZ1bmN0aW9uIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7CiAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKTsKICAgIH0sCiAgICB0cmFuc2xhdGVEYXRhVG9UcmVlOiBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvL+aKiuagkeaVsOaNruacieWtkOiKgueCueeahOaVsOaNruWFqOmDqOi/h+a7pOaOie+8iOWPqueVmeeItuiKgueCueeahOaVsOaNru+8iQogICAgICB2YXIgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZVtpZF0gPT0gdmFsdWVbcGlkXSB8fCB2YWx1ZVtwaWRdID09IG51bGwgfHwgdmFsdWVbcGlkXSA9PSBwdmFsdWU7CiAgICAgIH0pOwogICAgICBpZiAoIXBhcmVudHMpIHsKICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWVbcGlkXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWVbcGlkXSAhPSBudWxsICYmIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBwYXJlbnRzOwogICAgfSwKICAgIGxvYWRUcmVlOiBmdW5jdGlvbiBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7CiAgICAgIHZhciBfdGhpczExID0gdGhpczsKICAgICAgaWYgKG5vZGUpIHsKICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSB0aGlzXy5jdXN0b21EaWFsb2cuc3R5bGUgPT0gMiA/IHRoaXNfLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA6IHRoaXNfLmRpc3BsYXlGaWVsZDsKICAgICAgICByZXNvbHZlKHRoaXMudHJlZUxpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW2Rpc3BsYXlGaWVsZC5waWRdID09PSBub2RlLmRhdGFbZGlzcGxheUZpZWxkLmlkXTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMxMS5zaG93RGF0YS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgaWYgKHYuUGlkID09IG5vZGUua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQodiwgdHJ1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgYWZ0ZXJPcGVuOiBmdW5jdGlvbiBhZnRlck9wZW4oKSB7CiAgICAgIC8v5omT5byA5a+56K+d5qGG5LmL5ZCO5Yqg6L295qCRCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpOwogICAgfSwKICAgIGxvYWRDb21iaW5hdGlvblRyZWU6IGZ1bmN0aW9uIGxvYWRDb21iaW5hdGlvblRyZWUoKSB7CiAgICAgIHZhciBfdGhpczEyID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsKICAgICAgdGhpcy5jb21iaW5hdGlvblJ1bGUgPSBjb21iaW5hdGlvblJ1bGU7CiAgICAgIHZhciB0cmVlQWxpYXMgPSBjb21iaW5hdGlvblJ1bGUubGVmdFRyZWU7CiAgICAgIC8v6I635Y+W5a+56K+d5qGG5pWw5o2uCiAgICAgIHJlcS5nZXQoJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0nICsgdHJlZUFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHRyZWVEaWFsb2cgPSByZXNwLmRhdGE7CiAgICAgICAgX3RoaXMxMi5sZWZ0VHJlZVRpdGxlID0gdHJlZURpYWxvZy5uYW1lOwogICAgICAgIHZhciByZXFQYXJhbSA9IHt9OwogICAgICAgIHZhciByZXF1ZXN0VHlwZSA9IHRyZWVEaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICdHRVQnIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZSA/IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgOiAnUE9TVCc7CiAgICAgICAgdmFyIHVybCA9ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPScgKyB0cmVlQWxpYXMgKyAnJm1hcFBhcmFtPSc7CiAgICAgICAgdmFyIHBhcmFtc09iaiA9IHt9OwogICAgICAgIGlmICh0cmVlRGlhbG9nLmRzVHlwZSAhPSAnZGF0YVNvdXJjZScpIHsKICAgICAgICAgIHVybCA9IHRyZWVEaWFsb2cudXJsOwogICAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbTsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICdQT1NUJykgewogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCdcXHsnICsgY29uLmZpZWxkICsgJ1xcfScsICdnJyksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJzsKICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICc9JyArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsKICAgICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgICBfdGhpczEyLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL2dldFRyZWVEYXRhJywgcmVxdWVzdFBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsKICAgICAgICAgICAgdmFyIGRpc3BsYXlGaWVsZCA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgICB2YXIgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAgICAgICBfdGhpczEyLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgX3RoaXMxMi50cmVlTGlzdCA9IHJlc3A7CiAgICAgICAgICAgIF90aGlzMTIuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkOwogICAgICAgICAgICBfdGhpczEyLmNvbWJpbmF0aW9uVHJlZURhdGEgPSBfdGhpczEyLnRvVHJlZURhdGEocmVzcCwgZGlzcGxheUZpZWxkLmlkLCBkaXNwbGF5RmllbGQucGlkLCBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlGaWVsZC5wdmFsdWUgPyBkaXNwbGF5RmllbGQucHZhbHVlIDogJzAnLCByZXN1bHRmaWVsZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKICAgIGNvbWJpVHJlZUNsaWNrOiBmdW5jdGlvbiBjb21iaVRyZWVDbGljayhwYXJhbU9iaiwgbm9kZSwgbm9kZUNvbXBvbmVudCkgewogICAgICAvL+e7hOWQiOWvueivneahhueCueWHu+W3puagkQogICAgICAvL+a4heepuuaXp+eahAogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIGlmICghY29tYmluYXRpb25SdWxlLnJ1bGVzIHx8IGNvbWJpbmF0aW9uUnVsZS5ydWxlcy5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXM7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbU9ialtydWxlc1tpXS50cmVlRmllbGRdOwogICAgICAgIHZhciBwcm9wZXJ0eSA9IHJ1bGVzW2ldLmxpc3RGaWVsZDsKICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5wdXNoKHsKICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGdyb3VwOiAndHJlZUdyb3VwJywKICAgICAgICAgIG9wZXJhdGlvbjogdGhpcy5nZXRPcGVyYXRpb24ocnVsZXNbaV0uY29uZGl0aW9uKSwKICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgLy/ojrflj5bov5DnrpfnrKblj7cKICAgIGdldE9wZXJhdGlvbjogZnVuY3Rpb24gZ2V0T3BlcmF0aW9uKG9sZCkgewogICAgICBpZiAoIW9sZCkgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgICBpZiAob2xkID09ICdFUScpIHsKICAgICAgICByZXR1cm4gJ0VRVUFMJzsKICAgICAgfQogICAgICBpZiAob2xkID09ICdMSycpIHsKICAgICAgICByZXR1cm4gJ0xJS0UnOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gJ0xGSycpIHsKICAgICAgICByZXR1cm4gJ0xJS0UnOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gJ0lOJykgewogICAgICAgIHJldHVybiAnSU4nOwogICAgICB9CiAgICB9LAogICAgdG9nZ2xlVHJlZTogZnVuY3Rpb24gdG9nZ2xlVHJlZSgpIHsKICAgICAgaWYgKHRoaXMudHJlZVNob3cpIHsKICAgICAgICB0aGlzLnRyZWVTaG93ID0gZmFsc2U7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICcwJSc7CiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAnZWwtaWNvbi1hcnJvdy1yaWdodCc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IHRydWU7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICcyNSUnOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gJ2VsLWljb24tYXJyb3ctbGVmdCc7CiAgICAgIH0KICAgIH0sCiAgICBpbml0VGVtcGxhdGVEYXRhOiBmdW5jdGlvbiBpbml0VGVtcGxhdGVEYXRhKCkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgY3VzdGRpYWxvZyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nOwogICAgICBpZiAoIWN1c3RkaWFsb2cgfHwgIWN1c3RkaWFsb2cubWFwcGluZ0NvbmYgfHwgY3VzdGRpYWxvZy5tYXBwaW5nQ29uZi5sZW5ndGggPCAxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciB0YXJnZXRQYXRoID0gdGhpcy5nZXRUYXJnZXRQYXRoKGN1c3RkaWFsb2cubWFwcGluZ0NvbmYpOwogICAgICB2YXIgcGF0aHMgPSB0YXJnZXRQYXRoLnNwbGl0KCcuJyk7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgaWYgKCFmb3JtSW5zdC5pbml0RmlsbERhdGEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy/lpoLmnpzlt7LmnInmlbDmja7liJnkuI3pnIDopoHlho3mrKHliJ3lp4vljJYKICAgICAgdmFyIGN1ckRhdGEgPSBmb3JtSW5zdFsnZGF0YSddW3BhdGhzWzBdXVtwYXRoc1sxXV07CiAgICAgIHZhciBpbml0VHlwZSA9IHRoaXMuaW5pdEZpbGxEYXRhVHlwZTsKICAgICAgaWYgKCghaW5pdFR5cGUgfHwgaW5pdFR5cGUgPT0gJ2VtcHR5JykgJiYgY3VyRGF0YS5sZW5ndGggPiAwICYmICEoY3VyRGF0YS5sZW5ndGggPT0gMSAmJiBKU09OLnN0cmluZ2lmeShjdXJEYXRhWzBdKSA9PSAnW10nKSkgewogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmIChpbml0VHlwZSA9PSAnY292ZXInKSB7CiAgICAgICAgZm9ybUluc3RbJ2RhdGEnXVtwYXRoc1swXV1bcGF0aHNbMV1dID0gW107CiAgICAgIH0KICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHsKICAgICAgICBsb2NrOiB0cnVlLAogICAgICAgIHRleHQ6ICfmraPlnKjliJ3lp4vljJbloavmiqXmqKHmnb8uLi4nLAogICAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICAgIH0pOwogICAgICB2YXIgbXlDdXN0b21EaWFsb2cgPSBudWxsOwogICAgICB0aGlzLiRodHRwLmdldCgnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRCeUFsaWFzP2FsaWFzPScgKyBjdXN0ZGlhbG9nLmFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgbXlDdXN0b21EaWFsb2cgPSByZXNwLmRhdGE7CiAgICAgICAgX3RoaXMuY3VzdG9tRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogJ+iOt+WPluiHquWumuS5ieWvueivneahhuWksei0pe+8gScsCiAgICAgICAgICB0eXBlOiAnZXJyb3InCiAgICAgICAgfSk7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjdXJyZW50VXNlciA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudFVzZXInKSk7CiAgICAgICAgaWYgKCFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5jb2RlICYmICFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmICFfdGhpcy5jdXN0ZGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMsIG15Q3VzdG9tRGlhbG9nLmRzVHlwZSwgZm9ybUluc3RbJ2RhdGEnXSk7CiAgICAgICAgfSBlbHNlIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY3VyRmlsbE9yZ18nICsgY3VycmVudFVzZXIuYWNjb3VudCkpIHsKICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgIF90aGlzLmZpbGxPcmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjdXJGaWxsT3JnXycgKyBjdXJyZW50VXNlci5hY2NvdW50KSk7CiAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcywgbXlDdXN0b21EaWFsb2cuZHNUeXBlLCBmb3JtSW5zdFsnZGF0YSddKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMuJGh0dHAuZ2V0KCcke3VjfS9hcGkvb3JnL3YxL29yZy9nZXRGaWxsT3JnJykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgICAgIHZhciByZXAgPSByZXNwLmRhdGE7CiAgICAgICAgICAgIGlmIChyZXAuc3RhdGUpIHsKICAgICAgICAgICAgICBfdGhpcy5maWxsT3JnID0gcmVwLnZhbHVlOwogICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjdXJGaWxsT3JnXycgKyBjdXJyZW50VXNlci5hY2NvdW50LCBKU09OLnN0cmluZ2lmeShyZXAudmFsdWUpKTsKICAgICAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcywgbXlDdXN0b21EaWFsb2cuZHNUeXBlLCBmb3JtSW5zdFsnZGF0YSddKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXAubWVzc2FnZSwKICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgbWVzc2FnZTogJ+iOt+WPluW9k+WJjeeUqOaIt+Whq+WItuWNleS9jeWksei0pe+8gScsCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICBjbG9zZUxvYWRpbmc6IGZ1bmN0aW9uIGNsb3NlTG9hZGluZyhsb2FkaW5nKSB7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgfSwgMjAwMCk7CiAgICB9LAogICAgZ2V0VGFyZ2V0UGF0aDogZnVuY3Rpb24gZ2V0VGFyZ2V0UGF0aChtYXBwaW5nQ29uZikgewogICAgICB2YXIgdGFyZ2V0ID0gJyc7CiAgICAgIGlmIChtYXBwaW5nQ29uZiAmJiBtYXBwaW5nQ29uZi5sZW5ndGggPiAwKSB7CiAgICAgICAgbWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICBpZiAobWFwWyd0YXJnZXQnXSAmJiBtYXBbJ3RhcmdldCddLmxlbmd0aCA9PSAxICYmIG1hcFsndGFyZ2V0J11bMF0pIHsKICAgICAgICAgICAgdGFyZ2V0ID0gbWFwWyd0YXJnZXQnXVswXTsKICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfSwKICAgIHRvRmlsbEluaXREYXRhOiBmdW5jdGlvbiB0b0ZpbGxJbml0RGF0YShfdGhpcywgZHNUeXBlLCBjdXJEYXRhKSB7CiAgICAgIHZhciBjdXN0ZGlhbG9nID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2c7CiAgICAgIHZhciBwYXJhbXMgPSBbXTsgLy/nu5HlrprnmoTooajljZXlrZfmrrUKICAgICAgaWYgKGN1c3RkaWFsb2cuY29uZGl0aW9ucykgewogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJCiAgICAgICAgdmFyIGJpbmRMaXN0ID0gY3VzdGRpYWxvZy5jb25kaXRpb25zOwogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMycgJiYgZWxlLmJpbmQpIHsKICAgICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkOwogICAgICAgICAgICAgIHZhciBiaW5kQXJyYXkgPSBlbGUuYmluZC5zcGxpdCgnLicpOwogICAgICAgICAgICAgIGlmIChiaW5kQXJyYXkubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgIG9iai5iaW5kID0gY3VyRGF0YVtiaW5kQXJyYXlbMV1dW2JpbmRBcnJheVsyXV07CiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChvYmopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRMaXN0RGF0YT9hbGlhcz0nICsgY3VzdGRpYWxvZy5hbGlhczsKICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHBhU3RyID0gJyc7CiAgICAgICAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhKSB7CiAgICAgICAgICBpZiAocGFTdHIpIHsKICAgICAgICAgICAgcGFTdHIgKz0gJywnOwogICAgICAgICAgfQogICAgICAgICAgcGFTdHIgPSBwYVN0ciArICciJyArIHBhLmZpZWxkICsgJyI6IicgKyBwYS5iaW5kICsgJyInOwogICAgICAgIH0pOwogICAgICAgIHVybCA9IHVybCArICcmbWFwUGFyYW09JyArIHBhU3RyOwogICAgICB9IGVsc2UgewogICAgICAgIHVybCA9IHVybCArICcmbWFwUGFyYW09JzsKICAgICAgfQogICAgICB2YXIgcGFyYW0gPSB7CiAgICAgICAgcGFnZUJlYW46IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMTAwMCwKICAgICAgICAgIHNob3dUb3RhbDogdHJ1ZQogICAgICAgIH0KICAgICAgfTsKICAgICAgX3RoaXMuJGh0dHAucG9zdCh1cmwsIHBhcmFtKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gcmVzcC5kYXRhOwogICAgICAgIGlmIChyZXNwb25zZS5yb3dzKSB7CiAgICAgICAgICBfdGhpcy5zeW5jSW5pdFRhYmxlVmFsdWUocmVzcG9uc2Uucm93cywgZHNUeXBlKTsKICAgICAgICB9CiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICfojrflj5bliJ3lp4vljJbmlbDmja7lpLHotKXvvIEnLAogICAgICAgICAgdHlwZTogJ2Vycm9yJwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBzeW5jSW5pdFRhYmxlVmFsdWU6IGZ1bmN0aW9uIHN5bmNJbml0VGFibGVWYWx1ZShzLCBkc1R5cGUpIHsKICAgICAgdmFyIGN1c3REaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2c7CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgdmFyIGlkcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5maWVsZC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSBkc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHZhID0gc1swXVtmaWVsZFtpXV07CiAgICAgICAgICB0eXBlb2YgdmEgPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHZhLCBfcmVhZE9ubHlFcnJvcigidmEiKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgdmEgKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgICBpZHMucHVzaChzWzBdLmlkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbW1lbnQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIF92YSA9IHNbaV1bZmllbGRbal1dOwogICAgICAgICAgICB0eXBlb2YgX3ZhID09ICd1bmRlZmluZWQnID8gJycgOiBfdmEsIF9yZWFkT25seUVycm9yKCJ2YSIpOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbal0gKyAnIjoiJyArIF92YSArICciLCc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICAgIH0KICAgICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgICAgIGlkcy5wdXNoKHNbaV0uaWQpOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHRoaXMuaW5zdElkID0gZm9ybUluc3QuJHBhcmVudC5pbnN0SWQ7CiAgICAgIC8v5aSE55CG5aGr5Yi26YOo6ZeoCiAgICAgIHZhciBmaWxsT3JnID0ge307CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCkgewogICAgICAgIHZhciBuYW1lUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUuc3BsaXQoJy4nKTsKICAgICAgICB2YXIgb3JnTmFtZUZpZWxkID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgZmlsbE9yZ1tvcmdOYW1lRmllbGRdID0gdGhpcy5maWxsT3JnLm5hbWU7CiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkKSB7CiAgICAgICAgICB2YXIgaWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaWQuc3BsaXQoJy4nKTsKICAgICAgICAgIHZhciBvcmdJZEZpZWxkID0gaWRQYXRoW2lkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgIGZpbGxPcmdbb3JnSWRGaWVsZF0gPSB0aGlzLmZpbGxPcmcuaWQ7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlKSB7CiAgICAgICAgICB2YXIgY29kZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnQ29kZUZpZWxkID0gY29kZVBhdGhbY29kZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW29yZ0NvZGVGaWVsZF0gPSB0aGlzLmZpbGxPcmcuY29kZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCkgewogICAgICAgIHZhciBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIGluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGZpbGxPcmdbaW5zdElkRmllbGRdID0gdGhpcy5pbnN0SWQ7CiAgICAgIH0KICAgICAgdmFyIHJldHVybkRhdGEgPSBzdHI7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHJldHVybkRhdGEuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge307CiAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbDsKICAgICAgICBjdXN0RGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoJy4nKTsKICAgICAgICAgICAgdmFyIGZyb20gPSAnJzsKICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ3Jlc3RmdWwnKSB7CiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IHJvd1tmcm9tXTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAoZmlsbE9yZyAmJiBKU09OLnN0cmluZ2lmeShmaWxsT3JnKSAhPSAne30nKSB7CiAgICAgICAgICBzdWJMaW5lRGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3ViTGluZURhdGEpLCBmaWxsT3JnKTsKICAgICAgICB9CiAgICAgICAgZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dLnB1c2goc3ViTGluZURhdGEpOwogICAgICB9KTsKICAgIH0KICB9Cn07"},null]}