{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipDialog.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\eipControl\\EipDialog.vue","mtime":1705895419251},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge21hcFN0YXRlfSBmcm9tICd2dWV4Jw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnDQppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICdAL2hvdGVudC11aS11dGlsLmpzJw0KaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdlbGVtZW50LXVpJw0KaW1wb3J0IHJlcSBmcm9tICdAL3JlcXVlc3QuanMnDQppbXBvcnQgc3ViX3Bpb19taXhpbiBmcm9tICdAL3N1Yi1wZXJtaXNzaW9uLW1peGluLmpzJw0KaW1wb3J0IEVpcFRhZyBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBUYWcudnVlJw0KaW1wb3J0IEVpcFNlbGVjdERpYSBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3REaWEudnVlJw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIGNvbXBvbmVudHM6IHtFaXBUYWcsIEVpcFNlbGVjdERpYX0sDQogIG5hbWU6ICdlaXAtZGlhbG9nJywNCiAgcHJvcHM6IFsndmFsaWRhdGUnLCAndmFsdWUnLCAnbmFtZScsICdwZXJtaXNzaW9uJywgJ2F0dGVyJywgJ3NpbmdsZScsICdzZWxlY3RvcmNvbmZpZycsICdjdXN0ZGlhbG9nJywgJ3BsYWNlaG9sZGVyJywgJ3Rvb2x0aXBwbGFjZW1lbnQnXSwNCiAgbWl4aW5zOiBbc3ViX3Bpb19taXhpbl0sLy/mt7flhaXmlrnlvI/lvJXlhaXooajljZXnu4Tku7bkuK3lhazlhbHlsZ7mgKfvvIzlpITnkIblrZDooajjgIHlrZnooajooYzlhoXogZTliqjvvIjliIfpnaLkv67mlLlwZXJtaXNzaW9uX3N1Yu+8iQ0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwvL+aJk+W8gOagkeW9oui+k+WFpeWKqOaAgeWPguaVsOWAvOeahOWvueivneahhg0KICAgICAgcGFnZVBhcmFtOiB7fSwvL+agkeW9ouWvueivneahhuWPguaVsA0KICAgICAgY29uZGl0aW9uZmllbGRUcmVlOiBbXSwvL+agkeW9ouWvueivneahhuadoeS7tuWtl+autQ0KICAgICAgZGF0YTogew0KICAgICAgICBxeGRkOiB7fQ0KICAgICAgfSwNCiAgICAgIGlucHV0U3VmZml4V2lkdGg6IDAsDQogICAgICBwbGFjZWhvbGRlckJvOiAnJywNCiAgICAgIHF1aWNrU2VhcmNoOiAnJywgLy/loavlhpnmj5DnpLoNCiAgICAgIGNvbmRpdGlvbkJpbmQ6IFtdLCAvL+WPguaVsOafpeivouWtl+autQ0KICAgICAgbm9kZUtleTogJ0lEXycsIC8v5qCR5b2i5pWw5o2u54i2SWQNCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dMaXN0OiBmYWxzZSwNCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dUcmVlOiBmYWxzZSwNCiAgICAgIHNlbGVjdE9yZ1Byb3BzOiB7DQogICAgICAgIGxhYmVsOiAnbmFtZScNCiAgICAgIH0sDQogICAgICBzdHlsZTogJycsIC8v5a+56K+d5qGG5a696auYDQogICAgICBzZWxlY3RPcmdzOiBudWxsLA0KICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLA0KICAgICAgY29uZmlnOiBudWxsLA0KICAgICAgdXBkYXRpbmc6IGZhbHNlLA0KICAgICAgZGlzcGxheWZpZWxkOiBbXSwgLy/mmL7npLrlrZfmrrUNCiAgICAgIGN1c3RvbURpYWxvZzoge30sDQogICAgICBxdWVyeVBhcmFtOiAnJywgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwNCiAgICAgIHByb3BzMTogW10sDQogICAgICBzaG93RGF0YTogW10sDQogICAgICBjaGVja0JveERhdGFBbGw6IFtdLCAvL+mAieS4reWvueixoeeahOmbhuWQiA0KICAgICAgZGVmYXVsdFByb3BzOiB7DQogICAgICAgIGNoaWxkcmVuOiAnY2hpbGRyZW4nLA0KICAgICAgICBsYWJlbDogJ2xhYmVsJywNCiAgICAgICAgaXNMZWFmOiAnaXNMZWFmJw0KICAgICAgfSwNCiAgICAgIHByb3BzRGF0YTogW10sDQogICAgICBxdWVyeXNTaG93OiBmYWxzZSwgLy/mmK/lkKbmmL7npLrmkJzntKLmoYYNCiAgICAgIHVuZGVmaW5lZGE6ICcnLA0KICAgICAgaXNDdXJyZW50Q2hhbmdlOiBmYWxzZSwgLy/mmK/lkKbkuI3miafooYwgb3JnVGFibGVTZWxlY3Rpb27mlrnms5UNCiAgICAgIHBhZ2luYXRpb246IHsNCiAgICAgICAgcGFnZTogMSwNCiAgICAgICAgcGFnZVNpemU6IDIwLA0KICAgICAgICB0b3RhbDogMA0KICAgICAgfSwNCiAgICAgIHBhcmFtOiBbXSwgLy/nu5HlrprnmoTooajljZXlrZfmrrUNCiAgICAgIHRyZWVMaXN0OiBbXSwNCiAgICAgIGRpc3BsYXlGaWVsZDoge30sDQogICAgICBxdWVyeVBhcmFtczogW10sDQogICAgICBwbGFjZWhvbGRlcnM6IFtdLA0KICAgICAgb2xkc2VsZWN0T3JnczogW10sDQogICAgICBjb21iaW5hdGlvblRyZWVEYXRhOiBbXSwNCiAgICAgIGNvbWJpVHJlZURpc3BsYXlGaWVsZDogW10sDQogICAgICBjb21iaW5hdGlvblRyZWVRdWVyeXM6IFtdLA0KICAgICAgY29tYmluYXRpb25SdWxlOiB7fSwNCiAgICAgIHRvZ2dsZUJ0bjogJ2VsLWljb24tYXJyb3ctbGVmdCcsDQogICAgICB0cmVlU2hvdzogdHJ1ZSwNCiAgICAgIHRyYW5zdGlvbldpZHRoOiAnMjUlJywNCiAgICAgIGxlZnRUcmVlVGl0bGU6ICcnLA0KICAgICAgd3JpdGVhYmxlOiB0cnVlDQogICAgfQ0KICB9LA0KICB3YXRjaDogew0KICAgIHByb3BzMTogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsNCiAgICAgIC8v5qCR5b2iDQogICAgICBpZiAodGhpcy5zaG93RGF0YSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgICBsZXQgZGF0YSA9IFtdDQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaG93RGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnNob3dEYXRhW2ldKQ0KICAgICAgICB9DQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKGRhdGFbaV0sIHRydWUpDQogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtpXSwgdGhpc18pDQogICAgICAgICAgfQ0KICAgICAgICB9LCAyMDApDQogICAgICB9DQogICAgfQ0KICB9LA0KICBtb3VudGVkKCkgew0KICAgIGNvbnN0IHtzdWJTY29wZUVsLCBpbmRleH0gPSBob3RlbnRVaVV0aWxzLmdldFN1YlNjb3BlRWxBbmRJbmRleCh0aGlzLiRlbCkNCiAgICBpZiAoc3ViU2NvcGVFbCAmJiAoc3ViU2NvcGVFbC5nZXRBdHRyaWJ1dGUoJ3Jvd19yZWFkb25seScpID09ICd0cnVlJyB8fCBzdWJTY29wZUVsLmdldEF0dHJpYnV0ZSgncm93X3JlYWRvbmx5JykgPT09IHRydWUpKSB7DQogICAgICB0aGlzLndyaXRlYWJsZSA9IGZhbHNlDQogICAgfQ0KICAgIC8v6I635Y+W5a+56K+d5qGG5oyJ6ZKu5ZCN56ew5a695bqmDQogICAgaWYgKHRoaXMuJHJlZnMuaW5wdXRTdWZmaXgpIHsNCiAgICAgIHRoaXMuaW5wdXRTdWZmaXhXaWR0aCA9IHRoaXMuJHJlZnMuaW5wdXRTdWZmaXgub2Zmc2V0V2lkdGggKyAxDQogICAgfQ0KICB9LA0KICBjb21wdXRlZDogbWFwU3RhdGUoew0KICAgIC8vIHBhZ2luYXRpb246IHN0YXRlID0+IHN0YXRlLmRpYWxvZy5wYWdpbmF0aW9uLA0KICAgIHRvdGFsOiBzdGF0ZSA9PiBzdGF0ZS5kaWFsb2cudG90YWwsDQogICAgZGlhbG9nRGF0YTogc3RhdGUgPT4gew0KICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy5yb3dzDQogICAgfSwNCiAgICBpbnB1dFZhbDogZnVuY3Rpb24oKSB7DQogICAgICBpZiAoIXRoaXMudmFsdWUgfHwgdGhpcy52YWx1ZSA9PSAnfHxbXScpIHsNCiAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwgPSBbXQ0KICAgICAgICAvLyB0aGlzLnNob3dEYXRhID0gW107DQogICAgICAgIHJldHVybiBudWxsDQogICAgICB9IGVsc2Ugew0KICAgICAgICBsZXQgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoJywnKQ0KICAgICAgICBpZiAodGhpcy52YWx1ZS5pbmRleE9mKCd8fCcpID4gMCkgew0KICAgICAgICAgIG5hbWVBcnkgPSB0aGlzLnZhbHVlLnNwbGl0KCd8fCcpWzBdLnNwbGl0KCcsJykNCiAgICAgICAgICAvLyB0aGlzLnNob3dEYXRhPUpTT04ucGFyc2UodGhpcy52YWx1ZS5zcGxpdCgifHwiKVsxXSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsNCiAgICAgICAgbGV0IGlkQXJ5ID0gbnVsbA0KICAgICAgICBsZXQgYWNjb3VudEFyeSA9IG51bGwNCiAgICAgICAgbGV0IHJlc3VsdCA9IFtdDQogICAgICAgIG5hbWVBcnkuZm9yRWFjaCgobSwgaSkgPT4gew0KICAgICAgICAgIGxldCBuID0ge3ZhbHVlOiBtfQ0KICAgICAgICAgIHJlc3VsdC5wdXNoKG4pDQogICAgICAgIH0pDQogICAgICAgIHJldHVybiByZXN1bHQNCiAgICAgIH0NCiAgICB9LA0KICAgIGlucHV0V3JpdGVhYmxlOiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLndyaXRlYWJsZSA/IHV0aWxzLmdldFdyaXRlYWJsZSh0aGlzLnBlcm1pc3Npb25fc3ViKSA6IHRoaXMud3JpdGVhYmxlDQogICAgfSwNCiAgICBpbnB1dFZhbGlkYXRlOiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciB2YWxpZGF0ZU9iaiA9IHRoaXMuJHN0b3JlLnN0YXRlLmluZGV4LnZhbGlkYXRlDQogICAgICByZXR1cm4gdXRpbHMuYWRkUmVxdWlyZWRPck5vdCh0aGlzLnBlcm1pc3Npb25fc3ViLCB0aGlzLnZhbGlkYXRlLCB2YWxpZGF0ZU9iaiwgdGhpcykNCiAgICB9LA0KICAgIGlucHV0TmFtZTogZnVuY3Rpb24oKSB7DQogICAgICBsZXQgbGFiZWxkZXNjID0gJycNCiAgICAgIGlmICh0aGlzLiRzbG90cyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2MgJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0KSB7DQogICAgICAgIGxhYmVsZGVzYyA9IHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0DQogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCkgKyAnLScgKyBsYWJlbGRlc2MNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCkNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOaYr+WQpuacieWbnuWhq+iuvue9rg0KICAgIGJpbmRTZXQ6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3Jjb25maWcgPyB0aGlzLnNlbGVjdG9yY29uZmlnLmJpbmQgOiBudWxsDQogICAgfQ0KICB9KSwNCiAgY3JlYXRlZCgpIHsNCiAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIpIHsNCiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9ICfor7fpgInmi6nlhoXlrrknDQogICAgfSBlbHNlIHsNCiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9IHRoaXMucGxhY2Vob2xkZXINCiAgICB9DQogICAgdGhpcy4kdmFsaWRhdG9yID0gdGhpcy4kcm9vdC4kdmFsaWRhdG9yDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBzZWxlY3RBbGwoc2VsZWN0aW9uKSB7DQogICAgICBpZiAodGhpcy5vbGRzZWxlY3RPcmdzICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICBpZiAodGhpcy5pbmRleEFycmF5KHRoaXMub2xkc2VsZWN0T3Jncywgc2VsZWN0aW9uW3hdKSA9PT0gLTEpIHsNCiAgICAgICAgICAgIHRoaXMub2xkc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvblt4XSkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5vbGRzZWxlY3RPcmdzKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAoc2VsZWN0aW9uKQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2hlY2tOb2RlKGRhdGEsIHRoaXNfLCBwbm9kZSkgew0KICAgICAgaWYgKGRhdGEuUGlkKSB7DQogICAgICAgIGxldCBub2RlID0gdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKGRhdGEuUGlkKQ0KICAgICAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICAgIGlmIChub2RlLmRhdGEuUGlkKSB7DQogICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICAgICAgdGhpcy5jaGVja05vZGUodGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmRhdGEsIHRoaXNfLCB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkpDQogICAgICAgIH0NCiAgICAgICAgaWYgKCFub2RlLmluZGV0ZXJtaW5hdGUpIHsNCiAgICAgICAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlDQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAocG5vZGUgJiYgIXBub2RlLmluZGV0ZXJtaW5hdGUpIHsNCiAgICAgICAgcG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWUNCiAgICAgIH0NCiAgICB9LA0KICAgIC8v5Zue6L2m5p+l6K+iDQogICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uKGUpIHsNCiAgICAgIHZhciBrZXlDb2RlID0gd2luZG93LmV2ZW50ID8gZS5rZXlDb2RlIDogZS53aGljaA0KICAgICAgaWYgKGtleUNvZGUgPT0gMTMpIHsNCiAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgfQ0KICAgIH0sDQogICAgaGFuZGxlU2l6ZUNoYW5nZTogZnVuY3Rpb24oc2l6ZSkgew0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrg0KICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gc2l6ZQ0KICAgICAgdGhpcy5zZWFyY2goKQ0KICAgIH0sDQogICAgaGFuZGxlQ3VycmVudENoYW5nZTogZnVuY3Rpb24oY3VycmVudFBhZ2UpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgICBsZXQgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdykNCiAgICAgICAgICBpZiAocmVzID09IC0xKSB7DQogICAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAvL+eCueWHu+esrOWHoOmhtQ0KICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSBjdXJyZW50UGFnZQ0KICAgICAgdGhpcy5zZWFyY2goKQ0KICAgIH0sDQogICAgY2hlY2tMaXN0KCkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgLy/liJfooagNCiAgICAgICAgaWYgKHRoaXNfLmNoZWNrQm94RGF0YUFsbCAhPSB1bmRlZmluZWQgJiYgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZm9yRWFjaChyb3cgPT4gew0KICAgICAgICAgICAgbGV0IHJlcyA9IHRoaXNfLmluZGV4QXJyYXkodGhpc18uZGlhbG9nRGF0YSwgcm93KQ0KICAgICAgICAgICAgdGhpc18udW5kZWZpbmVkYSA9IHJlcw0KICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgew0KICAgICAgICAgICAgICB0aGlzXy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAgICAgICAgIHRoaXNfLnRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHRydWUpDQogICAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgfQ0KICAgICAgfSwgMzAwKQ0KICAgIH0sDQogICAgdG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdmFsKSB7DQogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbih0aGlzLmRpYWxvZ0RhdGFbcmVzXSwgdmFsKQ0KICAgIH0sDQogICAgc2hvd0RpYWxvZyhpdGVtKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIHZhciBhbGlhcyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmFsaWFzDQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS9nZXRCeUFsaWFzJywgYWxpYXMpLnRoZW4oY3VzdG9tRGlhbG9nID0+IHsNCiAgICAgICAgaWYgKCFjdXN0b21EaWFsb2cgfHwgIWN1c3RvbURpYWxvZy5hbGlhcykgew0KICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ+WvueivneahhuWIq+WQjeOAkCcgKyBhbGlhcyArICfjgJHkuI3lrZjlnKjvvIEnKQ0KICAgICAgICAgIHJldHVybg0KICAgICAgICB9DQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgew0KICAgICAgICAgIHZhciBkaXNwbGF5bGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkNCiAgICAgICAgICB0aGlzXy5ub2RlS2V5ID0gZGlzcGxheWxpc3QuaWQNCiAgICAgICAgfQ0KICAgICAgICAvL+WvueivneahhuaMieihqOWNleWtl+auteafpeivou+8iOWPguaVsOS8oOWFpeeahO+8iQ0KICAgICAgICBsZXQgYmluZExpc3QgPSB0aGlzXy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuY29uZGl0aW9ucw0KICAgICAgICB0aGlzXy5wYXJhbSA9IFtdIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61DQogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgYmluZExpc3QuZm9yRWFjaChlbGUgPT4gew0KICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUNCiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gJzMnICYmIGVsZS5iaW5kKSB7DQogICAgICAgICAgICAgIGxldCBvYmogPSB7fQ0KICAgICAgICAgICAgICBvYmouZmllbGQgPSBlbGUuZmllbGQNCiAgICAgICAgICAgICAgb2JqLmJpbmQgPSBlbGUuYmluZA0KICAgICAgICAgICAgICB0aGlzXy5wYXJhbS5wdXNoKG9iaikNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICAgIC8v5Yik5pat5a+56K+d5qGG5p+l6K+i5piv5ZCm5pyJ5p2h5Lu2DQogICAgICAgIGxldCB1c2VySW5wdXRMaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpDQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJycgLy/loavlhpnmj5DnpLogcGxhY2Vob2xkZXINCiAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZCA9IFtdDQogICAgICAgIGxldCBxdWVyeVBhcmFtcyA9IFtdDQogICAgICAgIGxldCBwbGFjZWhvbGRlcnMgPSBbXQ0KICAgICAgICBpZiAodXNlcklucHV0TGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdXNlcklucHV0TGlzdC5mb3JFYWNoKGVsZSA9PiB7DQogICAgICAgICAgICB2YXIgb2JqID0ge30NCiAgICAgICAgICAgIC8v5p2h5Lu25p+l6K+i5Y+C5pWw77yI55So5oi36L6T5YWl55qE77yJIOaWh+acrOahhui+k+WFpQ0KICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMScpIHsNCiAgICAgICAgICAgICAgb2JqW2VsZS5maWVsZF0gPSAnJw0KICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKG9iaikNCiAgICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZC5wdXNoKGVsZSkNCiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goJ+ivt+i+k+WFpScgKyBlbGUuY29tbWVudCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIHRoaXMuJHNldCh0aGlzLCAncXVlcnlQYXJhbXMnLCBxdWVyeVBhcmFtcykNCiAgICAgICAgICB0aGlzLiRzZXQodGhpcywgJ3BsYWNlaG9sZGVycycsIHBsYWNlaG9sZGVycykNCiAgICAgICAgfQ0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYvuekuuadoeS7tuafpeivoui+k+WFpeahhg0KICAgICAgICBpZiAodGhpc18ucXVpY2tTZWFyY2ggIT0gJycpIHsNCiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSB0cnVlDQogICAgICAgIH0NCiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAn6K+36L6T5YWlJyArIHRoaXMucXVpY2tTZWFyY2ggKyAn5p+l6K+iJw0KICAgICAgICB0aGlzXy5zdHlsZSA9ICdoZWlnaHQ6JyArIGN1c3RvbURpYWxvZy5oZWlnaHQgKyAncHgnDQogICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmhlaWdodCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA8PSA5MDApIHsNCiAgICAgICAgICB0aGlzLnN0eWxlID0gJ2hlaWdodDo0NDBweCcNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDAgfHwgY3VzdG9tRGlhbG9nLnN0eWxlID09IDIpIHsNCiAgICAgICAgICAvL+WIl+ihqA0KICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3coe2FsaWFzOiBhbGlhcywgY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2d9KQ0KICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7DQogICAgICAgICAgLy/moJHlvaINCiAgICAgICAgICB0aGlzXy5wYWdlUGFyYW0gPSB7YWxpYXM6IGFsaWFzLCBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZ30NCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSBjdXN0b21EaWFsb2cNCiAgICAgICAgICBsZXQgcGFyYW0gPSB7fQ0KICAgICAgICAgIHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZSA9IFtdDQogICAgICAgICAgLy/liKTmlq3mmK/lkKblrZjlnKjmnaHku7YNCiAgICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7DQogICAgICAgICAgICB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkNCiAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpc18uY29uZGl0aW9uZmllbGRUcmVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICAgICAgLy/liKTmlq3mnaHku7blrZfmrrXmmK/lkKbmmK/liqjmgIHkvKDlhaXvvIhkZWZhdWx0VHlwZe+8mjTvvJrliqjmgIHkvKDlhaXvvIwy77ya5Zu65a6a5YC8IO+8iQ0KICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZGVmYXVsdFR5cGUgPT0gJzQnKSB7DQogICAgICAgICAgICAgICAgICBwYXJhbVt0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZmllbGRdID0gdGhpc18uY29uZGl0aW9uZmllbGRUcmVlW2ldLmNvbW1lbnQNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgLy/mnInliqjmgIHkvKDlhaXnmoTlrZfmrrUNCiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocGFyYW0pICE9ICd7fScpIHsNCiAgICAgICAgICAgIHRoaXNfLmRpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8v5peg5Yqo5oCB5Lyg5YWl55qE5a2X5q61DQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dUcmVlU2hvdyh0aGlzXy5wYWdlUGFyYW0pDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgLy/miZPlvIDmoJHlvaLliqjmgIHlj4LmlbDovpPlhaXlgLznmoTlr7nor53moYYNCiAgICBoYW5kbGVTYXZlKCkgew0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dUcmVlU2hvdyh0aGlzLnBhZ2VQYXJhbSkNCiAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IGZhbHNlDQogICAgfSwNCiAgICAvL+WFs+mXreagkeW9ouWKqOaAgeWPguaVsOi+k+WFpeWAvOeahOWvueivneahhg0KICAgIGhhbmRsZUNsb3NlKCkgew0KICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICB9LA0KICAgIC8v5Yik5pat5pWw5o2u5piv5ZCm5YyF5ZCr5p+Q5Liq5a+56LGh77yM5bm26L+U5Zue5pWw5o2u5YyF5ZCr5a+56LGh55qE5LiL5qCHDQogICAgaW5kZXhBcnJheShhcnJheSwgaXRlbSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHJldHVybiAtMQ0KICAgICAgfQ0KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYXJyYXlbaV0pID09IEpTT04uc3RyaW5naWZ5KGl0ZW0pKSB7DQogICAgICAgICAgcmV0dXJuIGkNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIC0xDQogICAgfSwNCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOS4quWkjemAieahhuaXtuinpuWPkQ0KICAgIG9uVGFibGVTZWxlY3Qocm93cywgcm93KSB7DQogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IGZhbHNlDQogICAgICAvL+WIpOaWreeCueWHu+WIl+ihqOaVsOaNruaXtuWkjemAieahhuaYr+WQpuWLvumAiSAgc2VsZWN0ZWTvvJp0cnVl5LiN5Yu+6YCJ77yMZmFsc2Xli77pgIkNCiAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMQ0KICAgICAgaWYgKHNlbGVjdGVkKSB7DQogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZQ0KICAgICAgICBsZXQgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSkNCiAgICAgIH0NCiAgICB9LA0KICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5p2h5pWw5o2u5pe26Kem5Y+RDQogICAgb3JnUm93Q2xpY2socm93LCBjb2x1bW4sIGV2ZW50KSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldC5jaGlsZHJlblswXS5jaGlsZHJlblswXS5jaGlsZHJlblswXSkudHJpZ2dlcignY2xpY2snKQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChyb3cpDQogICAgICB9IGVsc2UgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxKSB7DQogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2UNCiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJDQogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMQ0KICAgICAgICBpZiAoc2VsZWN0ZWQpIHsNCiAgICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgICAgICBsZXQgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KQ0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHJvdykNCiAgICAgIH0NCiAgICB9LA0KICAgIC8v5YiX6KGo5aSN6YCJ5qGG5pyJ5pS55Y+Y5pe26Kem5Y+RDQogICAgb3JnVGFibGVTZWxlY3Rpb24oc2VsZWN0aW9uKSB7DQogICAgICAvL+WFqOmAieeahOaDheWGteeJueauiuWkhOeQhijkuLrkuobkuI7ljp/mnKzlip/og73pgLvovpHkuI3lhrLnqoEs5YWI5aSN5Yi25LiA5Lu95pen55qE6YCJ5Lit5pWw5o2uLueEtuWQjuaLv+WIsOWFqOmAieS6i+S7tuS4reWOu+iuoeeulykNCiAgICAgIHRoaXMub2xkc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMuc2VsZWN0T3JncykNCiAgICAgIC8v5aSa6YCJDQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEgJiYgIXRoaXMuaXNDdXJyZW50Q2hhbmdlKSB7DQogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAxICYmICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkpIHsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IHNlbGVjdGlvbg0KICAgICAgICAgIH0gZWxzZSBpZiAoKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWxlY3Rpb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0N1cnJlbnRDaGFuZ2UgJiYgc2VsZWN0aW9uLmxlbmd0aCA+PSAxMCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGZvciAobGV0IHUgPSB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoIC0gMTsgdSA+PSAwOyB1LS0pIHsNCiAgICAgICAgICAgICAgICBsZXQgcmVzID0gdGhpcy5pbmRleEFycmF5KHNlbGVjdGlvbiwgdGhpcy5zZWxlY3RPcmdzW3VdKQ0KICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmb3IgKGxldCBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltpXSkNCiAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGRpYWxvZ0NvbmZpcm0oKSB7DQogICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSAnJw0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlDQogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKQ0KICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpDQogICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL3NldERpYWxvZ0RhdGEiLCBbXSk7DQogICAgfSwNCiAgICAvL+mHjee9rg0KICAgIHJlc2V0KCkgew0KICAgICAgdGhpcy5xdWVyeVBhcmFtcy5mb3JFYWNoKHBhcmFtT2JqID0+IHsNCiAgICAgICAgZm9yIChsZXQga2V5IGluIHBhcmFtT2JqKSB7DQogICAgICAgICAgdGhpcy5xdWVyeVBhcmFtc1trZXldID0gJycNCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICAgIC8v57uE5ZCI5qCR6YeN572uDQogICAgICBsZXQgbm9kZXMgPSB0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZS5zdG9yZS5ub2Rlc01hcA0KICAgICAgZm9yIChsZXQga2V5IGluIG5vZGVzKSB7DQogICAgICAgIG5vZGVzW2tleV0uZXhwYW5kZWQgPSBmYWxzZQ0KICAgICAgfQ0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApDQogICAgICB0aGlzLnNlYXJjaCh0cnVlKQ0KICAgIH0sDQogICAgLy/mn6Xor6INCiAgICBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsNCiAgICAgIGxldCBxdWVyeXMgPSBbXSAvL+afpeivouadoeS7tg0KICAgICAgbGV0IHF1ZXJ5RmlsdGVyID0ge30NCiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnBhZ2luYXRpb24pID09ICd7fScpIHsNCiAgICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge3BhZ2U6ICcxJywgcGFnZVNpemU6ICcxMCcsIHNob3dUb3RhbDogJ3RydWUnfQ0KICAgICAgfQ0KICAgICAgbGV0IHBhZ2VCZWFuID0ge3BhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb259DQogICAgICBpZiAocmVzZXRQYWdpbnRpb24pIHsNCiAgICAgICAgcGFnZUJlYW4ucGFnZUJlYW4gPSB7cGFnZTogJzEnLCBwYWdlU2l6ZTogJzEwJywgc2hvd1RvdGFsOiAndHJ1ZSd9DQogICAgICB9DQogICAgICAvL+eUqOaIt+i+k+WFpeeahA0KICAgICAgaWYgKHRoaXMucXVlcnlQYXJhbXMubGVuZ3RoICE9IDAgJiYgdGhpcy5xdWVyeVBhcmFtc1swXSAhPSAnJykgew0KICAgICAgICB0aGlzLmNvbmRpdGlvbkJpbmQuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsNCiAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwNCiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5UGFyYW1zW2l0ZW0uZmllbGRdLA0KICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLA0KICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgfSkNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICAgIC8v5Y+C5pWw5Lyg5YWl55qE5p+l6K+i5ou85o6lDQogICAgICBpZiAodGhpcy5wYXJhbSkgew0KICAgICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgICB0aGlzLnBhcmFtLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsDQogICAgICAgICAgICB2YWx1ZTogdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIGl0ZW0uYmluZCksDQogICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICB9KQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQNCiAgICAgIGlmICh0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cyAmJiB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5sZW5ndGggIT0gMCkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmIChxdWVyeXMubGVuZ3RoID4gMCkgew0KICAgICAgICBxdWVyeUZpbHRlciA9IHRoaXMuaGFuZGxlUG9zdERhdGEoe3BhZ2VCZWFuOiBwYWdlQmVhbi5wYWdlQmVhbiwgcXVlcnlzfSkNCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBxdWVyeUZpbHRlcg0KICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL2dldGxpc3RKc29uJywgdGhpcy5jdXN0b21EaWFsb2cpLnRoZW4oKCkgPT4gew0KICAgICAgICAgIHRoaXMuY2hlY2tMaXN0KCkNCiAgICAgICAgfSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcGFnZUJlYW4NCiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRsaXN0SnNvbicsIHRoaXMuY3VzdG9tRGlhbG9nKS50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLmNoZWNrTGlzdCgpDQogICAgICAgIH0pDQogICAgICB9DQogICAgfSwNCiAgICAvLyDlpITnkIZQT1NU6K+35rGC5pe255qE5Y+C5pWwDQogICAgaGFuZGxlUG9zdERhdGEocXVlcnlGaWx0ZXIpIHsNCiAgICAgIGlmICghdGhpcy5jdXN0b21EaWFsb2cuZGF0YVBhcmFtIHx8IHRoaXMuY3VzdG9tRGlhbG9nLmRhdGFQYXJhbS5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsNCiAgICAgICAgcmV0dXJuIHF1ZXJ5RmlsdGVyDQogICAgICB9DQogICAgICAvLyDmnoTlu7rkuIrkuIvmlofmlbDmja7lr7nosaENCiAgICAgIGxldCBjdHggPSB7fQ0KICAgICAgcXVlcnlGaWx0ZXIgJiYNCiAgICAgIHF1ZXJ5RmlsdGVyLnF1ZXJ5cy5mb3JFYWNoKGVsZW1lbnQgPT4gew0KICAgICAgICBjdHhbZWxlbWVudC5wcm9wZXJ0eV0gPSBlbGVtZW50LnZhbHVlDQogICAgICB9KQ0KICAgICAgY29uc3QgZXhwID0gaG90ZW50VWlVdGlscy5wYXJzZUV4cCh0aGlzLmN1c3RvbURpYWxvZy5kYXRhUGFyYW0sIGN0eCkNCiAgICAgIHRyeSB7DQogICAgICAgIHJldHVybiBKU09OLnBhcnNlKGV4cCkNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgQ3VzdG9tUXVlcnkuX3Rocm93RXhjZXB0aW9uKGBQT1NU5Y+C5pWw5LiN5piv5pyJ5pWI55qESlNPTuagvOW8jyR7cXVlcnkuZGF0YVBhcmFtfWApDQogICAgICB9DQogICAgfSwNCiAgICBhc3luYyBkb1F1ZXJ5KHBhcmFtKSB7DQogICAgICBsZXQgcGFyYW1Mb2FkRGF0YSA9IFtdDQogICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lnu5HlrprnmoTooajljZXlj4LmlbANCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0uY29uZGl0aW9uZmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgaWYgKHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCAhPSAnJykgew0KICAgICAgICAgIGxldCBiaW5kVmFsID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCwgbnVsbCkNCiAgICAgICAgICBsZXQgb2JqID0ge2tleTogcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGQsIHZhbHVlOiBiaW5kVmFsfQ0KICAgICAgICAgIHBhcmFtTG9hZERhdGEucHVzaChvYmopDQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgbGV0IHF1ZXJ5VXJsID0gcGFyYW0uZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICcke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0nICsgcGFyYW0uYWxpYXMgKyAnJnBhZ2U9MScgOiBwYXJhbS51cmwNCiAgICAgIGxldCByZXF1ZXN0TWV0aG9kID0gJ1BPU1QnDQogICAgICAvL+WmguaenOWFs+iBlOaVsOaNruWIl+ihqOafpeivouaVsOaNruS4jeaYr+aVsOaNrua6kOWImeivt+axguaWueazleS4unJlc3RmdWzphY3nva7nmoTor7fmsYLmlrnlvI8NCiAgICAgIGlmIChwYXJhbS5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZQ0KICAgICAgfQ0KICAgICAgLy/mn6Xor6LmlbDmja4NCiAgICAgIHJlcS5yZXF1ZXN0KHt1cmw6IHF1ZXJ5VXJsLCBtZXRob2Q6IHJlcXVlc3RNZXRob2QsIGRhdGE6IHBhcmFtTG9hZERhdGF9KS50aGVuKHJlcyA9PiB7DQogICAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5YWz6IGU5p+l6K+i5pWw5o2u6L+U5ZueDQogICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsA0KICAgICAgICAgIGZvciAobGV0IGlvID0gMDsgaW8gPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvKyspIHsNCiAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICcnKSB7DQogICAgICAgICAgICAgIGxldCB2YWwgPSAnJw0KICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcy5kYXRhLnJvd3MubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7DQogICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKyByZXMuZGF0YS5yb3dzW2pdW3BhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZF0gKyAnLCcNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSkNCiAgICAgICAgICAgICAgbGV0IHBhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgaWYgKHBhdGhBcnIubGVuZ3RoID09IDMpIHsNCiAgICAgICAgICAgICAgICAvL+S4u+ihqA0KICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIG51bGwpDQogICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgew0KICAgICAgICAgICAgICAgIC8v5a2Q6KGoDQogICAgICAgICAgICAgICAgbGV0IHN1YkRhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dDQogICAgICAgICAgICAgICAgaWYgKHN1YkRhdGEubGVuZ3RoID09IDApIHsNCiAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5rKh5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICBsZXQgc3ViVGFiTmFtZSA9IHBhdGhBcnJbMl0ucmVwbGFjZSgnc3ViXycsICcnKQ0KICAgICAgICAgICAgICAgICAgLy/lvpfliLDlrZDooajnmoTmiYDmnInlrZfmrrUNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJJbml0RGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge30NCiAgICAgICAgICAgICAgICAgIC8v5oqK5pWw57uE6YeM6Z2i55qE5YC85Li6IG51bGwg6L2s5o2i5Li656m65a2X56ym5LiyDQogICAgICAgICAgICAgICAgICBsZXQgc3RyID0gSlNPTi5zdHJpbmdpZnkoc3ViSW5pdERhdGEpLnJlcGxhY2UoL251bGwvZywgJyIiJykNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gSlNPTi5wYXJzZShzdHIpDQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3ViRGF0YSkgew0KICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtmeihqOaYr+WQpuacieWAvA0KICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ3N1Yl8nKSA9PSAwICYmIHN1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgc3ViRGF0YVtrZXldID0gW10gLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtl+auteaYr+WQpuacieWAvA0KICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YVtrZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgc3ViRGF0YVtrZXldID0gJycgLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4NCiAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0ucHVzaChzdWJEYXRhKQ0KICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUNCiAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIDApDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5pyJ5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUNCiAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgcCkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgLy/msqHmnInov5Tlm57nmoTlgLzliJnmuIXnqboNCiAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsA0KICAgICAgICAgIGZvciAobGV0IGlvcCA9IDA7IGlvcCA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW9wKyspIHsNCiAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCAhPSAnJykgew0KICAgICAgICAgICAgICBsZXQgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgaWYgKHBhdGhBcnIubGVuZ3RoID09IDMpIHsNCiAgICAgICAgICAgICAgICAvL+S4u+ihqA0KICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAnJywgbnVsbCkNCiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7DQogICAgICAgICAgICAgICAgLy/lrZDooagNCiAgICAgICAgICAgICAgICBsZXQgc3ViRGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0NCiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICcnLCBwKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9LA0KICAgIC8vIOWQjOatpemAieaLqee7k+aenA0KICAgIHN5bmNJbnB1dFZhbHVlKCkgew0KICAgICAgbGV0IHRoaXNJbmRleCA9IG51bGwgLy/lvZPliY3mlbDmja7miYDlnKjkuIvmoIcNCiAgICAgIGxldCBwYXJlbnRJbmRleCA9IG51bGwgLy/niLboioLngrnmiYDlnKjkuIvmoIcNCiAgICAgIGlmICh0aGlzLiRlbCkgew0KICAgICAgICB0aGlzSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpcy4kZWwsICdkYXRhLWluZGV4JykNCiAgICAgICAgcGFyZW50SW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpcy4kcGFyZW50LiRlbCwgJ2RhdGEtaW5kZXgnKQ0KICAgICAgfQ0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICAvL+aLv+WIsOi/lOWbnueahOWtl+autQ0KICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBzdHIgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uZmllbGQNCiAgICAgICAgY29tbWVudFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmNvbW1lbnQNCiAgICAgIH0NCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdE9yZ3MNCiAgICAgIHRoaXMuc2hvd0RhdGEgPSBbLi4udGhpcy5zZWxlY3RPcmdzXQ0KICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwgPSBbLi4udGhpcy5zZWxlY3RPcmdzXQ0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICBzID0gdGhpcy5zZWxlY3RPcmdzDQogICAgICB9DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgbGV0IHNGaWVsZCA9IHNbMF1bZmllbGRbaV1dID09PSB1bmRlZmluZWQgPyAnJyA6IHNbMF1bZmllbGRbaV1dDQogICAgICAgICAgbGV0IGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzRmllbGQpDQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tbWVudC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgbGV0IGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzW2ldW2ZpZWxkW2pdXSkNCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtqXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfScNCiAgICAgICAgICB9DQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIC8vIHRoaXMuJGVtaXQoImlucHV0IiwgSlNPTi5zdHJpbmdpZnkoc3RyKSk7DQogICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgY29uc3QgX3RoaXMgPSB0aGlzDQogICAgICB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgIHZhciB2YWwgPSAnJw0KICAgICAgICB2YXIgZnJvbSA9ICcnDQogICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgew0KICAgICAgICAgIGZyb20gPSBjb24uZnJvbQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpDQogICAgICAgIH0NCiAgICAgICAgc3RyLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgdmFsICs9IGRlY29kZVVSSUNvbXBvbmVudChpdGVtW2Zyb21dKSArICcsJw0KICAgICAgICB9KQ0KICAgICAgICBpZiAodGhpcy5hdHRlciA9PSAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSkgew0KICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpDQogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwsIHRoaXNJbmRleCkNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmF0dGVyID09ICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdKSB7DQogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGxldCBjb25maWdBdHRyID0gY29uWyd0YXJnZXQnXVswXS5zcGxpdCgnLicpDQogICAgICAgICAgbGV0IHBhdGggPSBjb25bJ3RhcmdldCddWzBdDQogICAgICAgICAgaWYgKGNvbmZpZ0F0dHIubGVuZ3RoID09IDQgJiYgcGFyZW50SW5kZXggPj0gMCkgey8v5a2Z6KGo5pWw5o2u6LWL5YC8DQogICAgICAgICAgICBwYXRoID0gY29uZmlnQXR0clswXSArICcuJyArIGNvbmZpZ0F0dHJbMV0gKyAnWycgKyBwYXJlbnRJbmRleCArICddLicgKyBjb25maWdBdHRyWzJdICsgJy4nICsgY29uZmlnQXR0clszXQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAocEluc3QuZGF0YSkgew0KICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ21vZGVsLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICAgIC8v5Yik5pat5a+56K+d5qGG5piv5ZCm57uR5a6a5LqG5YWz6IGU5p+l6K+iDQogICAgICBsZXQgY3VzdFF1ZXJ5SnNvbiA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmN1c3RRdWVyeUpzb24NCiAgICAgIGlmIChjdXN0UXVlcnlKc29uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXN0UXVlcnlKc29uLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgaWYgKGN1c3RRdWVyeUpzb25baV0uY29uZGl0aW9uZmllbGQubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgdGhpcy5kb1F1ZXJ5KGN1c3RRdWVyeUpzb25baV0pDQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1snICsgY3VzdFF1ZXJ5SnNvbltpXS5jb21tZW50ICsgJ13lhbPogZTmn6Xor6Llj5blgLzlj4LmlbDmnKrnu5HlrprooajljZXlrZfmrrUnKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgLy/lj5bmtojmjInpkq4NCiAgICBkaWFsb2dDYW5jZWwoKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIHRoaXNfLnF1ZXJ5UGFyYW0gPSAnJw0KICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKS50aGVuKCgpID0+IHsNCiAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZQ0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+eCueWHu+S6huehruiupOWGjeeCueWHu+WPlua2iOeahCAgaW5wdXRWYWzmsqHmnInlgLzliJnooajnpLrnm7TmjqXngrnlh7vnmoTlj5bmtogNCiAgICAgICAgaWYgKCF0aGlzXy5pbnB1dFZhbCkgew0KICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbXQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbLi4udGhpc18uc2hvd0RhdGFdDQogICAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwgPSBbLi4udGhpc18uc2VsZWN0T3Jnc10NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9LA0KICAgIGRpYWxvZ1RyZWVDb25maXJtKCkgew0KICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCkNCiAgICAgIGxldCB0aGlzSW5kZXggPSBudWxsIC8v5b2T5YmN5pWw5o2u5omA5Zyo5LiL5qCHDQogICAgICBsZXQgcGFyZW50SW5kZXggPSBudWxsIC8v54i26IqC54K55omA5Zyo5LiL5qCHDQogICAgICBpZiAodGhpcy4kZWwpIHsNCiAgICAgICAgdGhpc0luZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KHRoaXMuJGVsLCAnZGF0YS1pbmRleCcpDQogICAgICAgIHBhcmVudEluZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KHRoaXMuJHBhcmVudC4kZWwsICdkYXRhLWluZGV4JykNCiAgICAgIH0NCiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKQ0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKQ0KICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKQ0KICAgICAgdmFyIHN0ciA9IFtdDQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgew0KICAgICAgICBmaWVsZFtpXSA9IHJldHVyblN0cltpXS5maWVsZA0KICAgICAgICBjb21tZW50W2ldID0gcmV0dXJuU3RyW2ldLmNvbW1lbnQNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGFbMF0NCiAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCcNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nDQogICAgICAgIH0NCiAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpDQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YQ0KICAgICAgICBub2Rlcy5mb3JFYWNoKChpdGVtLCBrKSA9PiB7DQogICAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnDQogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2tdW2ZpZWxkW2ldXSArICciLCcNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nDQogICAgICAgICAgfQ0KICAgICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgY29uc3QgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcykNCiAgICAgIHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goY29uID0+IHsNCiAgICAgICAgdmFyIHZhbCA9ICcnDQogICAgICAgIHN0ci5mb3JFYWNoKGl0ZW0gPT4gew0KICAgICAgICAgIHZhbCArPSBpdGVtW2Nvbi5mcm9tXSArICcsJw0KICAgICAgICB9KQ0KICAgICAgICBpZiAodGhpcy5hdHRlciA9PSAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSkgew0KICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSwgdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSksIHRoaXNJbmRleCkNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmF0dGVyID09ICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdKSB7DQogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGxldCBjb25maWdBdHRyID0gY29uWyd0YXJnZXQnXVswXS5zcGxpdCgnLicpDQogICAgICAgICAgbGV0IHBhdGggPSBjb25bJ3RhcmdldCddWzBdDQogICAgICAgICAgaWYgKGNvbmZpZ0F0dHIubGVuZ3RoID09IDQgJiYgcGFyZW50SW5kZXggPj0gMCkgey8v5a2Z6KGo5pWw5o2u6LWL5YC8DQogICAgICAgICAgICBwYXRoID0gY29uZmlnQXR0clswXSArICcuJyArIGNvbmZpZ0F0dHJbMV0gKyAnWycgKyBwYXJlbnRJbmRleCArICddLicgKyBjb25maWdBdHRyWzJdICsgJy4nICsgY29uZmlnQXR0clszXQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAocEluc3QuZGF0YSkgew0KICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ21vZGVsLicgKyBwYXRoLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KQ0KICAgICAgICAgIH0NCg0KICAgICAgICB9DQogICAgICB9KQ0KICAgICAgLy90aGlzLiRlbWl0KCJpbnB1dCIsIEpTT04uc3RyaW5naWZ5KHN0cikpOw0KICAgICAgdGhpcy5zaG93RGF0YSA9IFsuLi50aGlzLnByb3BzRGF0YV0gLy/lm57mmL7nmoTlgLwNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZQ0KICAgIH0sDQogICAgZGlhbG9nQ2FuY2VsVHJlZSgpIHsNCiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKQ0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlDQogICAgfSwNCiAgICBnZXRDaGVja2VkKGRhdGEsIGNoZWNrZWQsIGluZGV0ZXJtaW5hdGUpIHsNCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXQ0KICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpDQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLnByb3BzRGF0YSA9IHRoaXMuJHJlZnMudHJlZS5nZXRDaGVja2VkTm9kZXMoKQ0KICAgICAgfQ0KICAgIH0sDQogICAgdHJlZUNsaWNrKGRhdGEsIG4sIGkpIHsNCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXQ0KICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpDQogICAgICB9DQogICAgfSwNCiAgICBjbGVhckFsbFNlbGVjdE9yZ3MoKSB7DQogICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBudWxsDQogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLmNsZWFyU2VsZWN0aW9uKCkNCiAgICB9LA0KICAgIHJlbW92ZVNlbGVjdE9yZyhpdGVtKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgJycpDQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuaW5wdXRWYWwuc3BsaWNlKGl0ZW0sIDEpDQogICAgICAgIC8vIGxldCByZW1vdmVJZCA9IHRoaXMuc2hvd0RhdGFbaXRlbV07DQogICAgICAgIC8v5qCR5b2iDQogICAgICAgIGlmICh0aGlzLnByb3BzRGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdGhpcy5wcm9wc0RhdGEuc3BsaWNlKGl0ZW0sIDEpDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpDQogICAgICAgIH0NCiAgICAgICAgLy/liJfooagNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSBudWxsKSB7DQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKHJvdyA9PiB7DQogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsNCiAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZQ0KICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBmYWxzZSkNCiAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpDQogICAgICAgIGxldCB2YWx1ZSA9ICcnDQogICAgICAgIHRoaXMuaW5wdXRWYWwuZm9yRWFjaCh2YWwgPT4gew0KICAgICAgICAgIHZhbHVlICs9IHZhbC52YWx1ZSArICcsJw0KICAgICAgICB9KQ0KICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIDEpDQogICAgICAgIH0NCiAgICAgICAgaWYgKHZhbHVlICE9ICcnKSB7DQogICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICd8fCcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnNob3dEYXRhKQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpDQogICAgICB9DQogICAgICB0aGlzLnN5bmNJbnB1dFZhbHVlKCkNCiAgICB9LA0KICAgIGNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKSB7DQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgaWYgKCF0aGlzLiRyZWZzLnRhZ1NwYW5zKSByZXR1cm4NCiAgICAgICAgaWYgKHRoaXMuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0KSB7DQogICAgICAgICAgdGhpcy5pbnB1dFN1ZmZpeEhlaWdodCA9IHRoaXMuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0ICsgNQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuaW5wdXRTdWZmaXhIZWlnaHQgPSAzMA0KICAgICAgICB9DQogICAgICAgIC8vIOinpuWPkemqjOivgQ0KICAgICAgICB0aGlzLiR2YWxpZGF0b3IudmFsaWRhdGUoKQ0KICAgICAgfSwgMCkNCiAgICB9LA0KICAgIGN1c3RvbURpYWxvZ1Nob3cocGFnZVBhcmFtKSB7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZQ0KICAgICAgdGhpcy5jdXN0b21EaWFsb2cgPSBwYWdlUGFyYW0uY3VzdG9tRGlhbG9nDQogICAgICB0aGlzLmN1c3RvbURpYWxvZy5xdWVyeVVybCA9DQogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScNCiAgICAgICAgICA/ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldExpc3REYXRhP2FsaWFzPScgKw0KICAgICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLmFsaWFzICsNCiAgICAgICAgICAnJm1hcFBhcmFtPScgKw0KICAgICAgICAgICh0aGlzLmN1c3RvbURpYWxvZy5tYXBQYXJhbSA/IHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtIDogJycpDQogICAgICAgICAgOiB0aGlzLmN1c3RvbURpYWxvZy51cmwNCiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoIDwgMSkgew0KICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkNCiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScpIHsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKQ0KICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJykgew0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY3VzdG9tRGlhbG9nVHJlZVNob3cocGFnZVBhcmFtKSB7DQogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2cNCiAgICAgIGxldCBtYXBQYXJhbU9iaiA9IHt9Ly/mlbDmja7mnaXmupDmmK/mlbDmja7mupDvvIzkuJTmnInliqjmgIHlj4LmlbDkvKDlhaXml7bosIPnlKgNCiAgICAgIGxldCBtYXBQYXJhbSA9ICcnDQogICAgICBsZXQgZGVmYXVsdFBWYWx1ZSA9ICcnLy/niLZJROWAvA0KICAgICAgaWYgKHRoaXMuY29uZGl0aW9uZmllbGRUcmVlLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5kZWZhdWx0VHlwZSA9PSAnNCcpIHsvL+WKqOaAgeS8oOWFpQ0KICAgICAgICAgICAgLy/lvpfliLDovpPlhaXnmoTmnaHku7blrZfmrrXlgLwNCiAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5wYXJhbVZhbA0KICAgICAgICAgICAgaWYgKCF2YWwpIHsNCiAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5b6X5Yiw5p2h5Lu25a2X5q61S0VZDQogICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbaV0uZmllbGQNCiAgICAgICAgICAgIG1hcFBhcmFtT2JqW2tleV0gPSB2YWwNCiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZGl0aW9uZmllbGRUcmVlW2ldLmRlZmF1bHRUeXBlID09ICcyJykgey8v5Zu65a6a5YC8DQogICAgICAgICAgICAvL+W+l+WIsOi+k+WFpeeahOadoeS7tuWtl+auteWAvA0KICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuY29uZGl0aW9uZmllbGRUcmVlW2ldLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgaWYgKCF2YWwpIHsNCiAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5b6X5Yiw5p2h5Lu25a2X5q61S0VZDQogICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbaV0uZmllbGQNCiAgICAgICAgICAgIG1hcFBhcmFtT2JqW2tleV0gPSB2YWwNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG1hcFBhcmFtT2JqKSAhPSAne30nKSB7DQogICAgICAgICAgLy/ojrflj5blr7nor53moYbphY3nva7nmoTniLZJROWtl+autQ0KICAgICAgICAgIGxldCBwaWQgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkucGlkDQogICAgICAgICAgZm9yIChsZXQgbSBpbiBtYXBQYXJhbU9iaikgew0KICAgICAgICAgICAgaWYgKHBpZCA9PSBtKSB7DQogICAgICAgICAgICAgIGRlZmF1bHRQVmFsdWUgPSBtYXBQYXJhbU9ialttXQ0KICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBtYXBQYXJhbSA9IEpTT04uc3RyaW5naWZ5KG1hcFBhcmFtT2JqKQ0KICAgICAgICAgIG1hcFBhcmFtID0gbWFwUGFyYW0uc3Vic3RyaW5nKDEsIG1hcFBhcmFtLmxlbmd0aCAtIDEpDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHZhciByZXF1ZXN0VHlwZSA9IGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gJ0dFVCcgOiBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgPyBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgOiAnUE9TVCcNCiAgICAgIHZhciB1cmwgPSAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsgcGFnZVBhcmFtLmFsaWFzICsgJyZtYXBQYXJhbT0nICsgbWFwUGFyYW0NCiAgICAgIHZhciBwYXJhbXNPYmogPSB7fQ0KICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgIHVybCA9IGN1c3RvbURpYWxvZy51cmwNCiAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSBjdXN0b21EaWFsb2cuZGF0YVBhcmFtDQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpIHsNCiAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKQ0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV0NCiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpIHsNCiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhID0gdGVtcGxhdGVQYS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xceycgKyBjb24uZmllbGQgKyAnXFx9JywgJ2cnKSwgY29uLmRlZmF1bHRWYWx1ZSkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicNCiAgICAgICAgICAgICAgdXJsID0gdXJsICsgbGpDaGFyICsgY29uLmZpZWxkICsgJz0nICsgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgew0KICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fQ0KICAgICAgcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9IHJlcXVlc3RUeXBlDQogICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybA0KICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmoNCiAgICAgIHRoaXMuc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zLCBkZWZhdWx0UFZhbHVlKQ0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWUNCiAgICB9LA0KICAgIC8v5qCR5b2i5p+l6K+iDQogICAgc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zLCBkZWZhdWx0UFZhbHVlKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIGxldCBxdWVyeSA9IHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPT0gJ1BPU1QnID8gcmVxLnBvc3QocmVxdWVzdFBhcmFtcy51cmwsIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqKSA6IHJlcS5nZXQocmVxdWVzdFBhcmFtcy51cmwpDQogICAgICBxdWVyeS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7DQogICAgICAgIC8v5pi+56S65a2X5q616YWN572uDQogICAgICAgIGxldCBkaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHRoaXNfLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpDQogICAgICAgIHRoaXNfLmRpc3BsYXlGaWVsZCA9IGRpc3BsYXlmaWVsZA0KICAgICAgICAvL+aKiuWvueivneahhumFjee9rueahOaYvuekuuWtl+auteaYvuekuuWQjeensOi1i+WAvOe7meagkeW9oueahOaYvuekuuWAvA0KICAgICAgICB0aGlzXy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWUNCiAgICAgICAgdGhpc18udHJlZUxpc3QgPSByZXNwb25zZS5kYXRhDQogICAgICAgIC8v5b6X5Yiw6KaB5Yqg6L295qCR55qE5L+h5oGvDQogICAgICAgIGlmIChkZWZhdWx0UFZhbHVlKSB7DQogICAgICAgICAgZGlzcGxheWZpZWxkLnB2YWx1ZSA9IGRlZmF1bHRQVmFsdWUNCiAgICAgICAgfQ0KICAgICAgICB0aGlzXy5wcm9wczEgPSB0aGlzXy50b1RyZWVEYXRhKHJlc3BvbnNlLmRhdGEsIGRpc3BsYXlmaWVsZC5pZCwgZGlzcGxheWZpZWxkLnBpZCwgZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lLCBkaXNwbGF5ZmllbGQucHZhbHVlID8gZGlzcGxheWZpZWxkLnB2YWx1ZSA6IDApDQogICAgICB9KQ0KICAgIH0sDQogICAgLy/liqDovb3moJHnmoTkv6Hmga8NCiAgICB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgew0KICAgICAgLy8g5bu656uL5Liq5qCR5b2i57uT5p6ELOmcgOimgeWumuS5ieS4quacgOmhtuWxgueahOeItuiKgueCue+8jHB2YWx1ZeaYrzANCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKQ0KICAgIH0sDQogICAgdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsNCiAgICAgIC8v5oqK5qCR5pWw5o2u5pyJ5a2Q6IqC54K555qE5pWw5o2u5YWo6YOo6L+H5ruk5o6J77yI5Y+q55WZ54i26IqC54K555qE5pWw5o2u77yJDQogICAgICBsZXQgcGFyZW50cyA9IGRhdGEuZmlsdGVyKHZhbHVlID0+IHZhbHVlW2lkXSA9PSB2YWx1ZVtwaWRdIHx8IHZhbHVlW3BpZF0gPT0gbnVsbCB8fCB2YWx1ZVtwaWRdID09IHB2YWx1ZSkNCiAgICAgIGlmICghcGFyZW50cykgew0KICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIodmFsdWUgPT4gdmFsdWVbcGlkXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWVbcGlkXSAhPSBudWxsICYmIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdKQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHBhcmVudHMNCiAgICB9LA0KICAgIGxvYWRUcmVlKG5vZGUsIHJlc29sdmUpIHsNCiAgICAgIGlmIChub2RlKSB7DQogICAgICAgIGxldCB0aGlzXyA9IHRoaXMNCiAgICAgICAgbGV0IGRpc3BsYXlGaWVsZCA9IHRoaXNfLmN1c3RvbURpYWxvZy5zdHlsZSA9PSAyID8gdGhpc18uY29tYmlUcmVlRGlzcGxheUZpZWxkIDogdGhpc18uZGlzcGxheUZpZWxkDQogICAgICAgIHJlc29sdmUodGhpcy50cmVlTGlzdC5maWx0ZXIodmFsdWUgPT4gdmFsdWVbZGlzcGxheUZpZWxkLnBpZF0gPT09IG5vZGUuZGF0YVtkaXNwbGF5RmllbGQuaWRdKSkNCiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICB0aGlzLnNob3dEYXRhLmZvckVhY2godiA9PiB7DQogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZCh2LCB0cnVlKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXykNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LCA0MDApDQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KDQogICAgYWZ0ZXJPcGVuKCkgew0KICAgICAgLy/miZPlvIDlr7nor53moYbkuYvlkI7liqDovb3moJENCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpDQogICAgfSwNCiAgICBsb2FkQ29tYmluYXRpb25UcmVlKCkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpDQogICAgICB0aGlzLmNvbWJpbmF0aW9uUnVsZSA9IGNvbWJpbmF0aW9uUnVsZQ0KICAgICAgbGV0IHRyZWVBbGlhcyA9IGNvbWJpbmF0aW9uUnVsZS5sZWZ0VHJlZQ0KICAgICAgLy/ojrflj5blr7nor53moYbmlbDmja4NCiAgICAgIHJlcS5nZXQoJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0nICsgdHJlZUFsaWFzKS50aGVuKHJlc3AgPT4gew0KICAgICAgICBsZXQgdHJlZURpYWxvZyA9IHJlc3AuZGF0YQ0KICAgICAgICB0aGlzLmxlZnRUcmVlVGl0bGUgPSB0cmVlRGlhbG9nLm5hbWUNCiAgICAgICAgbGV0IHJlcVBhcmFtID0ge30NCiAgICAgICAgbGV0IHJlcXVlc3RUeXBlID0gdHJlZURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gJ0dFVCcgOiB0cmVlRGlhbG9nLnJlcXVlc3RUeXBlID8gdHJlZURpYWxvZy5yZXF1ZXN0VHlwZSA6ICdQT1NUJw0KICAgICAgICBsZXQgdXJsID0gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9JyArIHRyZWVBbGlhcyArICcmbWFwUGFyYW09Jw0KICAgICAgICBsZXQgcGFyYW1zT2JqID0ge30NCiAgICAgICAgaWYgKHRyZWVEaWFsb2cuZHNUeXBlICE9ICdkYXRhU291cmNlJykgew0KICAgICAgICAgIHVybCA9IHRyZWVEaWFsb2cudXJsDQogICAgICAgICAgbGV0IHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbQ0KICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7DQogICAgICAgICAgICBsZXQgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCkNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICBsZXQgY29uID0gY29uZGl0aW9uc1tpXQ0KICAgICAgICAgICAgICBpZiAocmVxdWVzdFR5cGUgPT0gJ1BPU1QnKSB7DQogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFx7JyArIGNvbi5maWVsZCArICdcXH0nLCAnZycpLCBjb24uZGVmYXVsdFZhbHVlKQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgbGV0IGxqQ2hhciA9IHVybC5pbmRleE9mKCc/JykgPT0gLTEgPyAnPycgOiAnJicNCiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAnPScgKyBjb24uZGVmYXVsdFZhbHVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7DQogICAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7fQ0KICAgICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGUNCiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmwNCiAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmoNCiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9nZXRUcmVlRGF0YScsIHJlcXVlc3RQYXJhbXMpLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsNCiAgICAgICAgICAgIGxldCBkaXNwbGF5RmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkKQ0KICAgICAgICAgICAgbGV0IHJlc3VsdGZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKQ0KICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUNCiAgICAgICAgICAgIHRoaXMudHJlZUxpc3QgPSByZXNwDQogICAgICAgICAgICB0aGlzLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA9IGRpc3BsYXlGaWVsZA0KICAgICAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVEYXRhID0gdGhpcy50b1RyZWVEYXRhKA0KICAgICAgICAgICAgICByZXNwLA0KICAgICAgICAgICAgICBkaXNwbGF5RmllbGQuaWQsDQogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5waWQsDQogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZSwNCiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkLnB2YWx1ZSA/IGRpc3BsYXlGaWVsZC5wdmFsdWUgOiAnMCcsDQogICAgICAgICAgICAgIHJlc3VsdGZpZWxkDQogICAgICAgICAgICApDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgfSkNCiAgICB9LA0KICAgIGNvbWJpVHJlZUNsaWNrKHBhcmFtT2JqLCBub2RlLCBub2RlQ29tcG9uZW50KSB7DQogICAgICAvL+e7hOWQiOWvueivneahhueCueWHu+W3puagkQ0KICAgICAgLy/muIXnqbrml6fnmoQNCiAgICAgIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLnNwbGljZSgwKQ0KICAgICAgbGV0IGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKQ0KICAgICAgaWYgKCFjb21iaW5hdGlvblJ1bGUucnVsZXMgfHwgY29tYmluYXRpb25SdWxlLnJ1bGVzLmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgbGV0IHJ1bGVzID0gY29tYmluYXRpb25SdWxlLnJ1bGVzDQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGxldCB2YWx1ZSA9IHBhcmFtT2JqW3J1bGVzW2ldLnRyZWVGaWVsZF0NCiAgICAgICAgbGV0IHByb3BlcnR5ID0gcnVsZXNbaV0ubGlzdEZpZWxkDQogICAgICAgIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLnB1c2goew0KICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSwNCiAgICAgICAgICB2YWx1ZTogdmFsdWUsDQogICAgICAgICAgZ3JvdXA6ICd0cmVlR3JvdXAnLA0KICAgICAgICAgIG9wZXJhdGlvbjogdGhpcy5nZXRPcGVyYXRpb24ocnVsZXNbaV0uY29uZGl0aW9uKSwNCiAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICB9LA0KICAgIC8v6I635Y+W6L+Q566X56ym5Y+3DQogICAgZ2V0T3BlcmF0aW9uKG9sZCkgew0KICAgICAgaWYgKCFvbGQpIHsNCiAgICAgICAgcmV0dXJuICcnDQogICAgICB9DQogICAgICBpZiAob2xkID09ICdFUScpIHsNCiAgICAgICAgcmV0dXJuICdFUVVBTCcNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gJ0xLJykgew0KICAgICAgICByZXR1cm4gJ0xJS0UnDQogICAgICB9DQogICAgICBpZiAob2xkID09ICdMRksnKSB7DQogICAgICAgIHJldHVybiAnTElLRScNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gJ0lOJykgew0KICAgICAgICByZXR1cm4gJ0lOJw0KICAgICAgfQ0KICAgIH0sDQogICAgdG9nZ2xlVHJlZSgpIHsNCiAgICAgIGlmICh0aGlzLnRyZWVTaG93KSB7DQogICAgICAgIHRoaXMudHJlZVNob3cgPSBmYWxzZQ0KICAgICAgICB0aGlzLnRyYW5zdGlvbldpZHRoID0gJzAlJw0KICAgICAgICB0aGlzLnRvZ2dsZUJ0biA9ICdlbC1pY29uLWFycm93LXJpZ2h0Jw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy50cmVlU2hvdyA9IHRydWUNCiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICcyNSUnDQogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gJ2VsLWljb24tYXJyb3ctbGVmdCcNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg=="},null]}