{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipSubDialog.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipSubDialog.vue","mtime":1733309211891},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBtYXBTdGF0ZSB9IGZyb20gInZ1ZXgiOw0KaW1wb3J0IHV0aWxzIGZyb20gIkAvdXRpbHMuanMiOw0KaW1wb3J0IGhvdGVudFVpVXRpbHMgZnJvbSAiQC9ob3RlbnQtdWktdXRpbC5qcyI7DQppbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAiZWxlbWVudC11aSI7DQppbXBvcnQgcmVxIGZyb20gIkAvcmVxdWVzdC5qcyI7DQppbXBvcnQgc3ViX3Bpb19taXhpbiBmcm9tICJAL3N1Yi1wZXJtaXNzaW9uLW1peGluLmpzIjsNCmltcG9ydCBFaXBUYWcgZnJvbSAiQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwVGFnLnZ1ZSI7DQppbXBvcnQgRWlwU2VsZWN0RGlhIGZyb20gIkAvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdERpYS52dWUiOw0KZXhwb3J0IGRlZmF1bHQgew0KICBjb21wb25lbnRzOiB7IEVpcFRhZywgRWlwU2VsZWN0RGlhIH0sDQogIG5hbWU6ICJlaXAtZGlhbG9nIiwNCiAgcHJvcHM6IFsNCiAgICAidmFsaWRhdGUiLA0KICAgICJ2YWx1ZSIsDQogICAgIm5hbWUiLA0KICAgICJwZXJtaXNzaW9uIiwNCiAgICAiYXR0ZXIiLA0KICAgICJzaW5nbGUiLA0KICAgICJzZWxlY3RvcmNvbmZpZyIsDQogICAgImN1c3RkaWFsb2ciLA0KICAgICJwbGFjZWhvbGRlciIsDQogICAgInRvb2x0aXBwbGFjZW1lbnQiLA0KICAgICdpbml0RmlsbERhdGEnLA0KICAgICdpbml0RmlsbERhdGFUeXBlJywNCiAgICAncmVsYXRpb24nLA0KICAgICdtYXhSb3cnDQogIF0sDQogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLCAvL+a3t+WFpeaWueW8j+W8leWFpeihqOWNlee7hOS7tuS4reWFrOWFseWxnuaAp++8jOWkhOeQhuWtkOihqOOAgeWtmeihqOihjOWGheiBlOWKqO+8iOWIh+mdouS/ruaUuXBlcm1pc3Npb25fc3Vi77yJDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIGRhdGE6IHsNCiAgICAgICAgcXhkZDoge30sDQogICAgICB9LA0KICAgICAgaW5wdXRTdWZmaXhXaWR0aDogMCwNCiAgICAgIHBsYWNlaG9sZGVyQm86ICIiLA0KICAgICAgcXVpY2tTZWFyY2g6ICIiLCAvL+Whq+WGmeaPkOekug0KICAgICAgY29uZGl0aW9uQmluZDogW10sIC8v5Y+C5pWw5p+l6K+i5a2X5q61DQogICAgICBub2RlS2V5OiAiSURfIiwgLy/moJHlvaLmlbDmja7niLZJZA0KICAgICAgY3VzdG9tRGlhbG9nU2hvd0xpc3Q6IGZhbHNlLA0KICAgICAgY3VzdG9tRGlhbG9nU2hvd1RyZWU6IGZhbHNlLA0KICAgICAgc2VsZWN0T3JnUHJvcHM6IHsNCiAgICAgICAgbGFiZWw6ICJuYW1lIiwNCiAgICAgIH0sDQogICAgICBzdHlsZTogIiIsIC8v5a+56K+d5qGG5a696auYDQogICAgICBzZWxlY3RPcmdzOiBudWxsLA0KICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLA0KICAgICAgY29uZmlnOiBudWxsLA0KICAgICAgdXBkYXRpbmc6IGZhbHNlLA0KICAgICAgZGlzcGxheWZpZWxkOiBbXSwgLy/mmL7npLrlrZfmrrUNCiAgICAgIGN1c3RvbURpYWxvZzoge30sDQogICAgICBxdWVyeVBhcmFtOiAiIiwgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwNCiAgICAgIHByb3BzMTogW10sDQogICAgICBzaG93RGF0YTogW10sDQogICAgICBjaGVja0JveERhdGFBbGw6IFtdLCAvL+mAieS4reWvueixoeeahOmbhuWQiA0KICAgICAgZGVmYXVsdFByb3BzOiB7DQogICAgICAgIGNoaWxkcmVuOiAiY2hpbGRyZW4iLA0KICAgICAgICBsYWJlbDogImxhYmVsIiwNCiAgICAgIH0sDQogICAgICBwcm9wc0RhdGE6IFtdLA0KICAgICAgcXVlcnlzU2hvdzogZmFsc2UsIC8v5piv5ZCm5pi+56S65pCc57Si5qGGDQogICAgICB1bmRlZmluZWRhOiAiIiwNCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVDQogICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgIHBhZ2U6IDEsDQogICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgdG90YWw6IDAsDQogICAgICB9LA0KICAgICAgcGFyYW06IFtdLCAvL+e7keWumueahOihqOWNleWtl+autQ0KICAgICAgdHJlZUxpc3Q6IFtdLA0KICAgICAgZGlzcGxheUZpZWxkOiB7fSwNCiAgICAgIHF1ZXJ5UGFyYW1zOiBbXSwNCiAgICAgIHBsYWNlaG9sZGVyczogW10sDQogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwNCiAgICAgIGNvbWJpbmF0aW9uVHJlZURhdGE6IFtdLA0KICAgICAgY29tYmlUcmVlRGlzcGxheUZpZWxkOiBbXSwNCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sDQogICAgICBjb21iaW5hdGlvblJ1bGU6IHt9LA0KICAgICAgdG9nZ2xlQnRuOiAiZWwtaWNvbi1hcnJvdy1sZWZ0IiwNCiAgICAgIHRyZWVTaG93OiB0cnVlLA0KICAgICAgdHJhbnN0aW9uV2lkdGg6ICIyNSUiLA0KICAgICAgbGVmdFRyZWVUaXRsZTogIiIsDQogICAgICB3cml0ZWFibGU6IHRydWUsDQogICAgICBpc1Nob3c6IHRydWUsDQogICAgfTsNCiAgfSwNCiAgd2F0Y2g6IHsNCiAgICBwcm9wczE6IGZ1bmN0aW9uIChuZXdWYWwsIG9sZFZhbCkgew0KICAgICAgLy/moJHlvaINCiAgICAgIGlmICh0aGlzLnNob3dEYXRhICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgY29uc3QgdGhpc18gPSB0aGlzOw0KICAgICAgICBsZXQgZGF0YSA9IFtdOw0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBkYXRhLnB1c2godGhpcy5zaG93RGF0YVtpXSk7DQogICAgICAgIH0NCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQoZGF0YVtpXSwgdHJ1ZSk7DQogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtpXSwgdGhpc18pOw0KICAgICAgICAgIH0NCiAgICAgICAgfSwgMjAwKTsNCiAgICAgIH0NCiAgICB9LA0KICB9LA0KICBtb3VudGVkKCkgew0KICAgIGxldCByZXF1ZXN0VHlwZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMF0uc3BsaXQoJy8nKQ0KICAgIGxldCBpc0RvbmVMaXN0ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJy8nKQ0KICAgIGlmICgNCiAgICAgIHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDFdID09ICdnZXQnIHx8DQogICAgICByZXF1ZXN0VHlwZVtyZXF1ZXN0VHlwZS5sZW5ndGggLSAyXSA9PSAnZ2V0JyB8fA0KICAgICAgaXNEb25lTGlzdFtpc0RvbmVMaXN0Lmxlbmd0aCAtIDFdID09ICdkb25lTGlzdCcNCiAgICApIHsNCiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2UNCiAgICB9ZWxzZXsNCiAgICAgIGlmKHRoaXMuaW5pdEZpbGxEYXRhPT0ndHJ1ZScpew0KICAgICAgICB0aGlzLmluaXRUZW1wbGF0ZURhdGEoKTsNCiAgICAgIH0NCiAgICB9DQogIH0sDQogIGNvbXB1dGVkOiBtYXBTdGF0ZSh7DQogICAgdG90YWw6IChzdGF0ZSkgPT4gc3RhdGUuZGlhbG9nLnRvdGFsLA0KICAgIGRpYWxvZ0RhdGE6IChzdGF0ZSkgPT4gew0KICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy5yb3dzOw0KICAgIH0sDQogICAgaW5wdXRWYWw6IGZ1bmN0aW9uICgpIHsNCiAgICAgIGlmICghdGhpcy52YWx1ZSB8fCB0aGlzLnZhbHVlID09ICJ8fFtdIikgew0KICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IFtdOw0KICAgICAgICAvLyB0aGlzLnNob3dEYXRhID0gW107DQogICAgICAgIHJldHVybiBudWxsOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbGV0IG5hbWVBcnkgPSB0aGlzLnZhbHVlLnNwbGl0KCIsIik7DQogICAgICAgIGlmICh0aGlzLnZhbHVlLmluZGV4T2YoInx8IikgPiAwKSB7DQogICAgICAgICAgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoInx8IilbMF0uc3BsaXQoIiwiKTsNCiAgICAgICAgICAvLyB0aGlzLnNob3dEYXRhPUpTT04ucGFyc2UodGhpcy52YWx1ZS5zcGxpdCgifHwiKVsxXSk7DQogICAgICAgIH0NCiAgICAgICAgLy8gIHRoaXMuc2hvd0RhdGEgPXRoaXMuc2VsZWN0T3JnczsNCiAgICAgICAgbGV0IGlkQXJ5ID0gbnVsbDsNCiAgICAgICAgbGV0IGFjY291bnRBcnkgPSBudWxsOw0KICAgICAgICBsZXQgcmVzdWx0ID0gW107DQogICAgICAgIG5hbWVBcnkuZm9yRWFjaCgobSwgaSkgPT4gew0KICAgICAgICAgIGxldCBuID0geyB2YWx1ZTogbSB9Ow0KICAgICAgICAgIHJlc3VsdC5wdXNoKG4pOw0KICAgICAgICB9KTsNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgIH0NCiAgICB9LA0KICAgIGlucHV0V3JpdGVhYmxlOiBmdW5jdGlvbiAoKSB7DQogICAgICByZXR1cm4gdGhpcy53cml0ZWFibGUNCiAgICAgICAgPyB1dGlscy5nZXRXcml0ZWFibGUodGhpcy5wZXJtaXNzaW9uX3N1YikNCiAgICAgICAgOiB0aGlzLndyaXRlYWJsZTsNCiAgICB9LA0KICAgIGlucHV0VmFsaWRhdGU6IGZ1bmN0aW9uICgpIHsNCiAgICAgIHZhciB2YWxpZGF0ZU9iaiA9IHRoaXMuJHN0b3JlLnN0YXRlLmluZGV4LnZhbGlkYXRlOw0KICAgICAgcmV0dXJuIHV0aWxzLmFkZFJlcXVpcmVkT3JOb3QoDQogICAgICAgIHRoaXMucGVybWlzc2lvbl9zdWIsDQogICAgICAgIHRoaXMudmFsaWRhdGUsDQogICAgICAgIHZhbGlkYXRlT2JqLA0KICAgICAgICB0aGlzDQogICAgICApOw0KICAgIH0sDQogICAgaW5wdXROYW1lOiBmdW5jdGlvbiAoKSB7DQogICAgICBsZXQgbGFiZWxkZXNjID0gIiI7DQogICAgICBpZiAoDQogICAgICAgIHRoaXMuJHNsb3RzICYmDQogICAgICAgIHRoaXMuJHNsb3RzLmxhYmVsZGVzYyAmJg0KICAgICAgICB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW4gJiYNCiAgICAgICAgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQNCiAgICAgICkgew0KICAgICAgICBsYWJlbGRlc2MgPSB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dDsNCiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA/IHRoaXMubmFtZSA6IHV0aWxzLmdldE5hbWUoKSArICItIiArIGxhYmVsZGVzYzsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCk7DQogICAgICB9DQogICAgfSwNCiAgICAvLyDmmK/lkKbmnInlm57loavorr7nva4NCiAgICBiaW5kU2V0OiBmdW5jdGlvbiAoKSB7DQogICAgICByZXR1cm4gdGhpcy5zZWxlY3RvcmNvbmZpZyA/IHRoaXMuc2VsZWN0b3Jjb25maWcuYmluZCA6IG51bGw7DQogICAgfSwNCiAgfSksDQogIGNyZWF0ZWQoKSB7DQogICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKSB7DQogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSAi6K+36YCJ5oup5YaF5a65IjsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhpcy5wbGFjZWhvbGRlckJvID0gdGhpcy5wbGFjZWhvbGRlcjsNCiAgICB9DQogICAgdGhpcy4kdmFsaWRhdG9yID0gdGhpcy4kcm9vdC4kdmFsaWRhdG9yOw0KICB9LA0KICBtZXRob2RzOiB7DQogICAgc2VsZWN0QWxsKHNlbGVjdGlvbikgew0KICAgICAgaWYgKHRoaXMub2xkc2VsZWN0T3JncyAhPSBudWxsICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7DQogICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgc2VsZWN0aW9uLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgaWYgKHRoaXMuaW5kZXhBcnJheSh0aGlzLm9sZHNlbGVjdE9yZ3MsIHNlbGVjdGlvblt4XSkgPT09IC0xKSB7DQogICAgICAgICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25beF0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLm9sZHNlbGVjdE9yZ3MpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAoc2VsZWN0aW9uKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIGNoZWNrTm9kZShkYXRhLCB0aGlzXywgcG5vZGUpIHsNCiAgICAgIGlmIChkYXRhLlBpZCkgew0KICAgICAgICBsZXQgbm9kZSA9IHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShkYXRhLlBpZCk7DQogICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7DQogICAgICAgIGlmIChub2RlLmRhdGEuUGlkKSB7DQogICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmluZGV0ZXJtaW5hdGUgPSB0cnVlOw0KICAgICAgICAgIHRoaXMuY2hlY2tOb2RlKA0KICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmRhdGEsDQogICAgICAgICAgICB0aGlzXywNCiAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKQ0KICAgICAgICAgICk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFub2RlLmluZGV0ZXJtaW5hdGUpIHsNCiAgICAgICAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlOw0KICAgICAgICB9DQogICAgICB9IGVsc2UgaWYgKHBub2RlICYmICFwbm9kZS5pbmRldGVybWluYXRlKSB7DQogICAgICAgIHBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy/lm57ovabmn6Xor6INCiAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24gKGUpIHsNCiAgICAgIHZhciBrZXlDb2RlID0gd2luZG93LmV2ZW50ID8gZS5rZXlDb2RlIDogZS53aGljaDsNCiAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7DQogICAgICAgIHRoaXMuc2VhcmNoKCk7DQogICAgICB9DQogICAgfSwNCiAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbiAoc2l6ZSkgew0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOw0KICAgICAgLy/mr4/pobXkuIvmi4nmmL7npLrmlbDmja4NCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemU7DQogICAgICB0aGlzLnNlYXJjaCgpOw0KICAgIH0sDQogICAgaGFuZGxlQ3VycmVudENoYW5nZTogZnVuY3Rpb24gKGN1cnJlbnRQYWdlKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXM7DQogICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCkgew0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICAgICAgbGV0IHJlcyA9IHRoaXNfLmluZGV4QXJyYXkodGhpc18uY2hlY2tCb3hEYXRhQWxsLCByb3cpOw0KICAgICAgICAgIGlmIChyZXMgPT0gLTEpIHsNCiAgICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsNCiAgICAgIC8v54K55Ye756ys5Yeg6aG1DQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlOw0KICAgICAgdGhpcy5zZWFyY2goKTsNCiAgICB9LA0KICAgIGNoZWNrTGlzdCgpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpczsNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAvL+WIl+ihqA0KICAgICAgICBpZiAoDQogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsICE9IHVuZGVmaW5lZCAmJg0KICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPiAwDQogICAgICAgICkgew0KICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5mb3JFYWNoKChyb3cpID0+IHsNCiAgICAgICAgICAgIGxldCByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmRpYWxvZ0RhdGEsIHJvdyk7DQogICAgICAgICAgICB0aGlzXy51bmRlZmluZWRhID0gcmVzOw0KICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgew0KICAgICAgICAgICAgICB0aGlzXy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOw0KICAgICAgICAgICAgICB0aGlzXy50b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB0cnVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfSwgMzAwKTsNCiAgICB9LA0KICAgIHRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHZhbCkgew0KICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS50b2dnbGVSb3dTZWxlY3Rpb24odGhpcy5kaWFsb2dEYXRhW3Jlc10sIHZhbCk7DQogICAgfSwNCiAgICBzaG93RGlhbG9nKGl0ZW0pIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpczsNCiAgICAgIC8v56ys5LqM5qyh54K55Ye75a2Q6KGo5Zue5aGr5a+56K+d5qGGIOesrOS4gOasoemAieS4reeahOaVsOaNruS4jeaYr+mAieS4reeKtuaAgQ0KICAgICAgaWYodGhpc18uc2VsZWN0T3Jncyl7DQogICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MuZW1wdHkoKTsNCiAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmVtcHR5KCk7DQogICAgICB9DQogICAgICB2YXIgYWxpYXMgPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5hbGlhcw0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnlBbGlhcycsIGFsaWFzKS50aGVuKGN1c3RvbURpYWxvZyA9PiB7DQogICAgICAgIGlmICghY3VzdG9tRGlhbG9nIHx8ICFjdXN0b21EaWFsb2cuYWxpYXMpIHsNCiAgICAgICAgICBNZXNzYWdlLmVycm9yKCflr7nor53moYbliKvlkI3jgJAnICsgYWxpYXMgKyAn44CR5LiN5a2Y5Zyo77yBJykNCiAgICAgICAgICByZXR1cm4NCiAgICAgICAgfQ0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDEpIHsNCiAgICAgICAgICB2YXIgZGlzcGxheWxpc3QgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpDQogICAgICAgICAgdGhpc18ubm9kZUtleSA9IGRpc3BsYXlsaXN0LmlkDQogICAgICAgIH0NCiAgICAgICAgLy/lr7nor53moYbmjInooajljZXlrZfmrrXmn6Xor6LvvIjlj4LmlbDkvKDlhaXnmoTvvIkNCiAgICAgICAgbGV0IGJpbmRMaXN0ID0gdGhpc18uY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmNvbmRpdGlvbnMNCiAgICAgICAgdGhpc18ucGFyYW0gPSBbXSAvL+e7keWumueahOihqOWNleWtl+autQ0KICAgICAgICBpZiAoYmluZExpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgIGJpbmRMaXN0LmZvckVhY2goZWxlID0+IHsNCiAgICAgICAgICAgIC8v57uR5a6a6KGo5Y2V5a2X5q61DQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICczJyAmJiBlbGUuYmluZCkgew0KICAgICAgICAgICAgICBsZXQgb2JqID0ge30NCiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkDQogICAgICAgICAgICAgIG9iai5iaW5kID0gZWxlLmJpbmQNCiAgICAgICAgICAgICAgdGhpc18ucGFyYW0ucHVzaChvYmopDQogICAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgfQ0KICAgICAgICAvL+WIpOaWreWvueivneahhuafpeivouaYr+WQpuacieadoeS7tg0KICAgICAgICBsZXQgdXNlcklucHV0TGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKQ0KICAgICAgICB0aGlzXy5xdWlja1NlYXJjaCA9ICcnIC8v5aGr5YaZ5o+Q56S6IHBsYWNlaG9sZGVyDQogICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQgPSBbXQ0KICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSBbXQ0KICAgICAgICBsZXQgcGxhY2Vob2xkZXJzID0gW10NCiAgICAgICAgaWYgKHVzZXJJbnB1dExpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHVzZXJJbnB1dExpc3QuZm9yRWFjaChlbGUgPT4gew0KICAgICAgICAgICAgdmFyIG9iaiA9IHt9DQogICAgICAgICAgICAvL+adoeS7tuafpeivouWPguaVsO+8iOeUqOaIt+i+k+WFpeeahO+8iSDmlofmnKzmoYbovpPlhaUNCiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gJzEnKSB7DQogICAgICAgICAgICAgIG9ialtlbGUuZmllbGRdID0gJycNCiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChvYmopDQogICAgICAgICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQucHVzaChlbGUpDQogICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5wdXNoKCfor7fovpPlhaUnICsgZWxlLmNvbW1lbnQpDQogICAgICAgICAgICB9DQogICAgICAgICAgfSkNCiAgICAgICAgICB0aGlzLiRzZXQodGhpcywgJ3F1ZXJ5UGFyYW1zJywgcXVlcnlQYXJhbXMpDQogICAgICAgICAgdGhpcy4kc2V0KHRoaXMsICdwbGFjZWhvbGRlcnMnLCBwbGFjZWhvbGRlcnMpDQogICAgICAgIH0NCiAgICAgICAgLy/liKTmlq3mmK/lkKbmmL7npLrmnaHku7bmn6Xor6LovpPlhaXmoYYNCiAgICAgICAgaWYgKHRoaXNfLnF1aWNrU2VhcmNoICE9ICcnKSB7DQogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWUNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZQ0KICAgICAgICB9DQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJ+ivt+i+k+WFpScgKyB0aGlzLnF1aWNrU2VhcmNoICsgJ+afpeivoicNCiAgICAgICAgdGhpc18uc3R5bGUgPSAnaGVpZ2h0OicgKyBjdXN0b21EaWFsb2cuaGVpZ2h0ICsgJ3B4Jw0KICAgICAgICBpZiAod2luZG93LnNjcmVlbi5oZWlnaHQgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPD0gOTAwKSB7DQogICAgICAgICAgdGhpcy5zdHlsZSA9ICdoZWlnaHQ6NDQwcHgnDQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAwIHx8IGN1c3RvbURpYWxvZy5zdHlsZSA9PSAyKSB7DQogICAgICAgICAgLy/liJfooagNCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93KHthbGlhczogYWxpYXMsIGN1c3RvbURpYWxvZzogY3VzdG9tRGlhbG9nfSkNCiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgew0KICAgICAgICAgIC8v5qCR5b2iDQogICAgICAgICAgdGhpc18ucGFnZVBhcmFtID0geyBhbGlhczogYWxpYXMsY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2cgfTsNCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSBjdXN0b21EaWFsb2c7DQogICAgICAgICAgbGV0IHBhcmFtID0ge307DQogICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gW107DQogICAgICAgICAgLy/liKTmlq3mmK/lkKblrZjlnKjmnaHku7YNCiAgICAgICAgICBpZihjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpew0KICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOw0KICAgICAgICAgICAgaWYgKHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgICAvL+WIpOaWreadoeS7tuWtl+auteaYr+WQpuaYr+WKqOaAgeS8oOWFpe+8iGRlZmF1bHRUeXBl77yaNO+8muWKqOaAgeS8oOWFpe+8jDLvvJrlm7rlrprlgLwg77yJDQogICAgICAgICAgICAgICAgaWYgKHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5kZWZhdWx0VHlwZSA9PSAiNCIpIHsNCiAgICAgICAgICAgICAgICAgIHBhcmFtW3RoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5maWVsZF0gPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uY29tbWVudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgLy/mnInliqjmgIHkvKDlhaXnmoTlrZfmrrUNCiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocGFyYW0pICE9ICJ7fSIpIHsNCiAgICAgICAgICAgIHRoaXNfLmRpYWxvZ1Zpc2libGUgPSB0cnVlOw0KICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgLy/ml6DliqjmgIHkvKDlhaXnmoTlrZfmrrUNCiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1RyZWVTaG93KHRoaXNfLnBhZ2VQYXJhbSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgLy/liKTmlq3mlbDmja7mmK/lkKbljIXlkKvmn5DkuKrlr7nosaHvvIzlubbov5Tlm57mlbDmja7ljIXlkKvlr7nosaHnmoTkuIvmoIcNCiAgICBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7DQogICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgfQ0KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYXJyYXlbaV0pID09IEpTT04uc3RyaW5naWZ5KGl0ZW0pKSB7DQogICAgICAgICAgcmV0dXJuIGk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiAtMTsNCiAgICB9LA0KICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5Liq5aSN6YCJ5qGG5pe26Kem5Y+RDQogICAgb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsNCiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7DQogICAgICAvL+WIpOaWreeCueWHu+WIl+ihqOaVsOaNruaXtuWkjemAieahhuaYr+WQpuWLvumAiSAgc2VsZWN0ZWTvvJp0cnVl5LiN5Yu+6YCJ77yMZmFsc2Xli77pgIkNCiAgICAgIGxldCBzZWxlY3RlZCA9DQogICAgICAgIHRoaXMuc2VsZWN0T3JncyAmJg0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJg0KICAgICAgICB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsNCiAgICAgIGlmIChzZWxlY3RlZCkgew0KICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7DQogICAgICAgIGxldCByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOw0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7DQogICAgICB9DQogICAgfSwNCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOadoeaVsOaNruaXtuinpuWPkQ0KICAgIG9yZ1Jvd0NsaWNrKHJvdywgY29sdW1uLCBldmVudCkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pLnRyaWdnZXIoDQogICAgICAgICAgImNsaWNrIg0KICAgICAgICApOw0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2gocm93KTsNCiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEpIHsNCiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsNCiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJDQogICAgICAgIGxldCBzZWxlY3RlZCA9DQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzICYmDQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYNCiAgICAgICAgICB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsNCiAgICAgICAgaWYgKHNlbGVjdGVkKSB7DQogICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOw0KICAgICAgICAgIGxldCByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOw0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy/liJfooajlpI3pgInmoYbmnInmlLnlj5jml7bop6blj5ENCiAgICBvcmdUYWJsZVNlbGVjdGlvbihzZWxlY3Rpb24pIHsNCiAgICAgIC8v5YWo6YCJ55qE5oOF5Ya154m55q6K5aSE55CGKOS4uuS6huS4juWOn+acrOWKn+iDvemAu+i+keS4jeWGsueqgSzlhYjlpI3liLbkuIDku73ml6fnmoTpgInkuK3mlbDmja4u54S25ZCO5ou/5Yiw5YWo6YCJ5LqL5Lu25Lit5Y676K6h566XKQ0KICAgICAgdGhpcy5vbGRzZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5zZWxlY3RPcmdzKTsNCiAgICAgIC8v5aSa6YCJDQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEgJiYgIXRoaXMuaXNDdXJyZW50Q2hhbmdlKSB7DQogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYNCiAgICAgICAgICAgICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkNCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IHNlbGVjdGlvbjsNCiAgICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgICAgKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSAmJg0KICAgICAgICAgICAgc2VsZWN0aW9uLmxlbmd0aCA+IDENCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25baV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0N1cnJlbnRDaGFuZ2UgJiYgc2VsZWN0aW9uLmxlbmd0aCA+PSAxMCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBmb3IgKGxldCB1ID0gdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCAtIDE7IHUgPj0gMDsgdS0tKSB7DQogICAgICAgICAgICAgICAgbGV0IHJlcyA9IHRoaXMuaW5kZXhBcnJheShzZWxlY3Rpb24sIHRoaXMuc2VsZWN0T3Jnc1t1XSk7DQogICAgICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgew0KICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25baV0pOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGRpYWxvZ0NvbmZpcm0oKSB7DQogICAgICBpZighdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGg9PTApew0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCLor7fpgInmi6nmlbDmja7lm57loasiKTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgdGhpcy5xdWVyeVBhcmFtID0gIiI7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2U7DQogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsNCiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsNCiAgICB9LA0KICAgIC8v6YeN572uDQogICAgcmVzZXQoKSB7DQogICAgICB0aGlzLnF1ZXJ5UGFyYW1zLmZvckVhY2goKHBhcmFtT2JqKSA9PiB7DQogICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbU9iaikgew0KICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXNba2V5XSA9ICIiOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIC8v57uE5ZCI5qCR6YeN572uDQogICAgICBpZih0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZSl7DQogICAgICAgIGxldCBub2RlcyA9IHRoaXMuJHJlZnMuY29tYmluYXRpb25UcmVlLnN0b3JlLm5vZGVzTWFwOw0KICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9kZXMpIHsNCiAgICAgICAgICBub2Rlc1trZXldLmV4cGFuZGVkID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLnNwbGljZSgwKTsNCiAgICAgIHRoaXMuc2VhcmNoKHRydWUpOw0KICAgIH0sDQogICAgLy/mn6Xor6INCiAgICBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsNCiAgICAgIGxldCBxdWVyeXMgPSBbXTsgLy/mn6Xor6LmnaHku7YNCiAgICAgIGxldCBxdWVyeUZpbHRlciA9IHt9Ow0KICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMucGFnaW5hdGlvbikgPT0gInt9Iikgew0KICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7IHBhZ2U6IDEsIHBhZ2VTaXplOiAyMCwgc2hvd1RvdGFsOiAidHJ1ZSIgfTsNCiAgICAgIH0NCiAgICAgIGxldCBwYWdlQmVhbiA9IHsgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiB9Ow0KICAgICAgaWYgKHJlc2V0UGFnaW50aW9uKSB7DQogICAgICAgIHBhZ2VCZWFuLnBhZ2VCZWFuID0geyBwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogInRydWUiIH07DQogICAgICB9DQogICAgICAvL+eUqOaIt+i+k+WFpeeahA0KICAgICAgaWYgKHRoaXMucXVlcnlQYXJhbXMubGVuZ3RoICE9IDAgJiYgdGhpcy5xdWVyeVBhcmFtc1swXSAhPSAiIikgew0KICAgICAgICB0aGlzLmNvbmRpdGlvbkJpbmQuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsNCiAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwNCiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5UGFyYW1zW2l0ZW0uZmllbGRdLA0KICAgICAgICAgICAgZ3JvdXA6ICJtYWluIiwNCiAgICAgICAgICAgIG9wZXJhdGlvbjogIkxJS0UiLA0KICAgICAgICAgICAgcmVsYXRpb246ICJBTkQiLA0KICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICAgIC8v5Y+C5pWw5Lyg5YWl55qE5p+l6K+i5ou85o6lDQogICAgICBpZiAodGhpcy5wYXJhbSkgew0KICAgICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgICAgdGhpcy5wYXJhbS5mb3JFYWNoKChpdGVtKSA9PiB7DQogICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsDQogICAgICAgICAgICB2YWx1ZTogdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIGl0ZW0uYmluZCksDQogICAgICAgICAgICBncm91cDogIm1haW4iLA0KICAgICAgICAgICAgb3BlcmF0aW9uOiAiTElLRSIsDQogICAgICAgICAgICByZWxhdGlvbjogIkFORCIsDQogICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQNCiAgICAgIGlmICgNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDANCiAgICAgICkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGlmIChxdWVyeXMubGVuZ3RoID4gMCkgew0KICAgICAgICBxdWVyeUZpbHRlciA9IHsgcGFnZUJlYW46IHBhZ2VCZWFuLnBhZ2VCZWFuLCBxdWVyeXMgfTsNCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBxdWVyeUZpbHRlcjsNCiAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAuZGlzcGF0Y2goImRpYWxvZy9nZXRsaXN0SnNvbiIsIHRoaXMuY3VzdG9tRGlhbG9nKQ0KICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgIHRoaXMuY2hlY2tMaXN0KCk7DQogICAgICAgICAgfSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHBhZ2VCZWFuOw0KICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgIC5kaXNwYXRjaCgiZGlhbG9nL2dldGxpc3RKc29uIiwgdGhpcy5jdXN0b21EaWFsb2cpDQogICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgdGhpcy5jaGVja0xpc3QoKTsNCiAgICAgICAgICB9KTsNCiAgICAgIH0NCiAgICB9LA0KICAgIGFzeW5jIGRvUXVlcnkocGFyYW0pIHsNCiAgICAgIGxldCBwYXJhbUxvYWREYXRhID0gW107DQogICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwDQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGlmIChwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGggIT0gIiIpIHsNCiAgICAgICAgICBsZXQgYmluZFZhbCA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGgsDQogICAgICAgICAgICBudWxsDQogICAgICAgICAgKTsNCiAgICAgICAgICBsZXQgb2JqID0geyBrZXk6IHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkLCB2YWx1ZTogYmluZFZhbCB9Ow0KICAgICAgICAgIHBhcmFtTG9hZERhdGEucHVzaChvYmopOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGxldCBxdWVyeVVybCA9DQogICAgICAgIHBhcmFtLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSINCiAgICAgICAgICA/ICIke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0iICsNCiAgICAgICAgICAgIHBhcmFtLmFsaWFzICsNCiAgICAgICAgICAgICImcGFnZT0xIg0KICAgICAgICAgIDogcGFyYW0udXJsOw0KICAgICAgbGV0IHJlcXVlc3RNZXRob2QgPSAiUE9TVCI7DQogICAgICAvL+WmguaenOWFs+iBlOaVsOaNruWIl+ihqOafpeivouaVsOaNruS4jeaYr+aVsOaNrua6kOWImeivt+axguaWueazleS4unJlc3RmdWzphY3nva7nmoTor7fmsYLmlrnlvI8NCiAgICAgIGlmIChwYXJhbS5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7DQogICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZTsNCiAgICAgIH0NCiAgICAgIC8v5p+l6K+i5pWw5o2uDQogICAgICByZXENCiAgICAgICAgLnJlcXVlc3QoeyB1cmw6IHF1ZXJ5VXJsLCBtZXRob2Q6IHJlcXVlc3RNZXRob2QsIGRhdGE6IHBhcmFtTG9hZERhdGEgfSkNCiAgICAgICAgLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5YWz6IGU5p+l6K+i5pWw5o2u6L+U5ZueDQogICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbANCiAgICAgICAgICAgIGZvciAobGV0IGlvID0gMDsgaW8gPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvKyspIHsNCiAgICAgICAgICAgICAgaWYgKHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGggIT0gIiIpIHsNCiAgICAgICAgICAgICAgICBsZXQgdmFsID0gIiI7DQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMuZGF0YS5yb3dzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9DQogICAgICAgICAgICAgICAgICAgICAgdmFsICsgcmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdICsgIiwiOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKTsNCiAgICAgICAgICAgICAgICBsZXQgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGguc3BsaXQoIi4iKTsNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgdmFsLA0KICAgICAgICAgICAgICAgICAgICBudWxsDQogICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgew0KICAgICAgICAgICAgICAgICAgLy/lrZDooagNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXTsNCiAgICAgICAgICAgICAgICAgIGlmIChzdWJEYXRhLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5rKh5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICAgIGxldCBzdWJUYWJOYW1lID0gcGF0aEFyclsyXS5yZXBsYWNlKCJzdWJfIiwgIiIpOw0KICAgICAgICAgICAgICAgICAgICAvL+W+l+WIsOWtkOihqOeahOaJgOacieWtl+autQ0KICAgICAgICAgICAgICAgICAgICBsZXQgc3ViSW5pdERhdGEgPQ0KICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge307DQogICAgICAgICAgICAgICAgICAgIC8v5oqK5pWw57uE6YeM6Z2i55qE5YC85Li6IG51bGwg6L2s5o2i5Li656m65a2X56ym5LiyDQogICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSBKU09OLnN0cmluZ2lmeShzdWJJbml0RGF0YSkucmVwbGFjZSgNCiAgICAgICAgICAgICAgICAgICAgICAvbnVsbC9nLA0KICAgICAgICAgICAgICAgICAgICAgICciIicNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkRhdGEgPSBKU09OLnBhcnNlKHN0cik7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdWJEYXRhKSB7DQogICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZnooajmmK/lkKbmnInlgLwNCiAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoInN1Yl8iKSA9PSAwICYmIHN1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhW2tleV0gPSBbXTsgLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZfmrrXmmK/lkKbmnInlgLwNCiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YVtrZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhW2tleV0gPSAiIjsgLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4NCiAgICAgICAgICAgICAgICAgICAgcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXS5wdXNoKHN1YkRhdGEpOw0KICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQ0KICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbCwNCiAgICAgICAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOacieaVsOaNrueahOaDheWGtQ0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQ0KICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgcA0KICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgLy/msqHmnInov5Tlm57nmoTlgLzliJnmuIXnqboNCiAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwDQogICAgICAgICAgICBmb3IgKGxldCBpb3AgPSAwOyBpb3AgPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvcCsrKSB7DQogICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCAhPSAiIikgew0KICAgICAgICAgICAgICAgIGxldCBwYXRoQXJyID0gcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGguc3BsaXQoIi4iKTsNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAiIiwNCiAgICAgICAgICAgICAgICAgICAgbnVsbA0KICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhBcnIubGVuZ3RoID09IDQpIHsNCiAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoDQogICAgICAgICAgICAgICAgICBsZXQgc3ViRGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV07DQogICAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUNCiAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgoDQogICAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsDQogICAgICAgICAgICAgICAgICAgICAgIiIsDQogICAgICAgICAgICAgICAgICAgICAgcA0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfSwNCiAgICAvLyDlkIzmraXpgInmi6nnu5PmnpwNCiAgICBzeW5jSW5wdXRWYWx1ZSgpIHsNCiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKQ0KICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUNCiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgc3RyID0gW10NCiAgICAgIHZhciBpZHMgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPQ0KICAgICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScNCiAgICAgICAgICAgID8gcmV0dXJuU3RyW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICAgIDogcmV0dXJuU3RyW2ldLmZpZWxkDQogICAgICAgIGNvbW1lbnRbaV0gPQ0KICAgICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScNCiAgICAgICAgICAgID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgOiByZXR1cm5TdHJbaV0uY29tbWVudA0KICAgICAgfQ0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChyb3cgPT4gew0KICAgICAgICBpZiAodGhpc18uY2hlY2tCb3hEYXRhQWxsIHx8IHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPCAxKSB7DQogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KQ0KICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXNfLmluZGV4QXJyYXkpLmluZGV4T2YoSlNPTi5zdHJpbmdpZnkocm93KSkgPT0gLTENCiAgICAgICAgKSB7DQogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdE9yZ3MNCg0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGxldCBlbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc1swXVtmaWVsZFtpXV0pDQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKQ0KICAgICAgICBpZHMucHVzaChzWzBdLmlkKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tbWVudC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgbGV0IGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzW2ldW2ZpZWxkW2pdXSkNCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtqXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfScNCiAgICAgICAgICB9DQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpDQogICAgICAgICAgaWRzLnB1c2goc1tpXS5pZCkNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgY29uc3QgcmV0dXJuRGF0YSA9IHN0cg0KICAgICAgY29uc3QgX3RoaXMgPSB0aGlzDQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgLy/lpITnkIboh6rliqjlm57loavphY3nva4NCiAgICAgIHRoaXMuaW5zdElkID0gZm9ybUluc3QuJHBhcmVudC5pbnN0SWQ7DQogICAgICBsZXQgY3VzdERpYWxvZyA9IHRoaXMuY3VzdGRpYWxvZzsNCiAgICAgIGxldCBmaWxsT3JnID0ge307DQogICAgICBpZihjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCl7DQogICAgICAgIGNvbnN0IG5hbWVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcubmFtZS5zcGxpdCgnLicpOw0KICAgICAgICBjb25zdCBvcmdOYW1lRmllbGQgPSBuYW1lUGF0aFtuYW1lUGF0aC5sZW5ndGgtMV07DQogICAgICAgIGZpbGxPcmdbb3JnTmFtZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5uYW1lOw0KICAgICAgICBpZihjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCl7DQogICAgICAgICAgY29uc3QgaWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaWQuc3BsaXQoJy4nKTsNCiAgICAgICAgICBjb25zdCBvcmdJZEZpZWxkID0gaWRQYXRoW2lkUGF0aC5sZW5ndGgtMV07DQogICAgICAgICAgZmlsbE9yZ1tvcmdJZEZpZWxkXSA9IHRoaXMuZmlsbE9yZy5pZDsNCiAgICAgICAgfQ0KICAgICAgICBpZihjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlKXsNCiAgICAgICAgICBjb25zdCBjb2RlUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUuc3BsaXQoJy4nKTsNCiAgICAgICAgICBjb25zdCBvcmdDb2RlRmllbGQgPSBjb2RlUGF0aFtjb2RlUGF0aC5sZW5ndGgtMV07DQogICAgICAgICAgZmlsbE9yZ1tvcmdDb2RlRmllbGRdID0gdGhpcy5maWxsT3JnLmNvZGU7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCl7DQogICAgICAgIGNvbnN0IGluc3RJZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQuc3BsaXQoJy4nKTsNCiAgICAgICAgY29uc3QgaW5zdElkRmllbGQgPSBpbnN0SWRQYXRoW2luc3RJZFBhdGgubGVuZ3RoLTFdOw0KICAgICAgICBmaWxsT3JnW2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOw0KICAgICAgfQ0KICAgICAgdHJ5ew0KICAgICAgICBsZXQgcmV0dXJuU2l6ZSA9IHJldHVybkRhdGEubGVuZ3RoOw0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqA0KICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgIGlmKHJldHVyblNpemU+MSl7DQogICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5LiA5a+55LiA5a2Q6KGo5Y+q6IO96YCJ5oup5LiA5p2h5pWw5o2uIik7DQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybkRhdGEuZm9yRWFjaChyb3cgPT4gew0KICAgICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGwNCiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fQ0KICAgICAgICAgIHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goY29uID0+IHsNCiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdKSB7DQogICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgnLicpDQogICAgICAgICAgICAgIHZhciBmcm9tID0gJycNCiAgICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ3Jlc3RmdWwnKSB7DQogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBpZiAocm93W2Zyb21dID09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgIGZyb20gPSBmcm9tLnRvVXBwZXJDYXNlKCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBzdWJMaW5lRGF0YVsNCiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXQ0KICAgICAgICAgICAgICBdID0gZGVjb2RlVVJJQ29tcG9uZW50KHJvd1tmcm9tXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgew0KICAgICAgICAgICAgdmFyIHN1YkJvID0gZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dDQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtkOihqOaVsOaNruacgOWkp+ihjOaVsA0KICAgICAgICAgICAgaWYodGhpc18ubWF4Um93ICE9MCAmJiAoc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSk+dGhpc18ubWF4Um93KXsNCiAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuWtkOihqOaVsOaNruW3sui2hei/h+acgOWkp+ihjOaVsOOAkCIrdGhpc18ubWF4Um93KyLjgJEiKTsNCiAgICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOw0KICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuZEl0ZXJhdGl2ZSIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL+WtkOihqOS4reeahOWtmeihqOWunuS9k++8iOWPr+iDveWtmOWcqOWkmuS4qu+8iQ0KICAgICAgICAgICAgbGV0IHN1bkJvcyA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCgNCiAgICAgICAgICAgICAgX3RoaXMuJGVsLA0KICAgICAgICAgICAgICAnc3VuQm9zJw0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgLy/lpoLmnpzlrZjlnKjlrZnooajlrp7kvZPliJnmiYvliqjmt7vliqDnqbrlrZnooajmlbDnu4Tlr7nosaENCiAgICAgICAgICAgIGlmIChzdW5Cb3MpIHsNCiAgICAgICAgICAgICAgbGV0IGFycmF5Qm8gPSBzdW5Cb3Muc3BsaXQoJywnKQ0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Qm8ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQga2V5ID0gJ3N1Yl8nICsgYXJyYXlCb1tpXQ0KICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IG5ldyBBcnJheSgpDQogICAgICAgICAgICAgICAgc3ViTGluZURhdGFba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Q6KGoDQogICAgICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gJ29uZXRvb25lJykgew0KICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihmaWxsT3JnICYmIEpTT04uc3RyaW5naWZ5KGZpbGxPcmcpIT0ne30nKXsNCiAgICAgICAgICAgICAgc3ViTGluZURhdGEgPSB7Li4uc3ViTGluZURhdGEsLi4uZmlsbE9yZ307DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKQ0KICAgICAgICAgICAgcmV0dXJuU2l6ZS0tDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgfWNhdGNoKGUpIHsNCiAgICAgICAgaWYoZS5tZXNzYWdlIT0iRW5kSXRlcmF0aXZlIikgdGhyb3cgZTsNCiAgICAgIH07DQogICAgfSwNCiAgICAvL+WPlua2iOaMiemSrg0KICAgIGRpYWxvZ0NhbmNlbCgpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpczsNCiAgICAgIHRoaXNfLnF1ZXJ5UGFyYW0gPSAiIjsNCiAgICAgIHRoaXNfLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL3NldERpYWxvZ0RhdGEiLCBbXSkudGhlbigoKSA9PiB7DQogICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2U7DQogICAgICAgIC8v5Yik5pat5piv5ZCm5piv54K55Ye75LqG56Gu6K6k5YaN54K55Ye75Y+W5raI55qEICBpbnB1dFZhbOayoeacieWAvOWImeihqOekuuebtOaOpeeCueWHu+eahOWPlua2iA0KICAgICAgICBpZiAoIXRoaXNfLmlucHV0VmFsKSB7DQogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IFtdOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbLi4udGhpc18uc2hvd0RhdGFdOw0KICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gWy4uLnRoaXNfLnNlbGVjdE9yZ3NdOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9LA0KICAgIGRpYWxvZ1RyZWVDb25maXJtKCkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICBpZih0aGlzXy5wcm9wc0RhdGEubGVuZ3RoPT0wKXsNCiAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuivt+mAieaLqeaVsOaNruWbnuWhqyIpOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkNCiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKQ0KICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBzdHIgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQNCiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50DQogICAgICB9DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhWzBdDQogICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGENCiAgICAgICAgbm9kZXMuZm9yRWFjaCgoaXRlbSwgaykgPT4gew0KICAgICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJw0KICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1trXVtmaWVsZFtpXV0gKyAnIiwnDQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7DQogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICAgIH0NCiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSkNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICAgIGNvbnN0IHJldHVybkRhdGEgPSBzdHINCiAgICAgIGNvbnN0IGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpDQogICAgICB0cnl7DQogICAgICAgIGxldCByZXR1cm5TaXplID0gcmV0dXJuRGF0YS5sZW5ndGg7DQogICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Q6KGoDQogICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7DQogICAgICAgICAgaWYocmV0dXJuU2l6ZT4xKXsNCiAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLkuIDlr7nkuIDlrZDooajlj6rog73pgInmi6nkuIDmnaHmlbDmja4iKTsNCiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKHJvdyA9PiB7DQogICAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbA0KICAgICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IHt9DQogICAgICAgICAgdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChjb24gPT4gew0KICAgICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsNCiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgdmFyIGZyb20gPSAnJw0KICAgICAgICAgICAgICBpZiAodGhpc18uY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsNCiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20NCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmIChyb3dbZnJvbV0gPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgZnJvbSA9IGZyb20udG9VcHBlckNhc2UoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHN1YkxpbmVEYXRhWw0KICAgICAgICAgICAgICAgIHRhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdDQogICAgICAgICAgICAgIF0gPSBkZWNvZGVVUklDb21wb25lbnQocm93W2Zyb21dKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pDQogICAgICAgICAgaWYgKHRhcmdldEFycmF5KSB7DQogICAgICAgICAgICB2YXIgc3ViQm8gPSBmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV0NCiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5aSn5LqO5a2Q6KGo5pWw5o2u5pyA5aSn6KGM5pWwDQogICAgICAgICAgICBpZih0aGlzXy5tYXhSb3cgIT0wICYmIChzdWJCby5sZW5ndGggKyByZXR1cm5TaXplKT50aGlzXy5tYXhSb3cpew0KICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5a2Q6KGo5pWw5o2u5bey6LaF6L+H5pyA5aSn6KGM5pWw44CQIit0aGlzXy5tYXhSb3crIuOAkSIpOw0KICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7DQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRW5kSXRlcmF0aXZlIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8v5a2Q6KGo5Lit55qE5a2Z6KGo5a6e5L2T77yI5Y+v6IO95a2Y5Zyo5aSa5Liq77yJDQogICAgICAgICAgICBsZXQgc3VuQm9zID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KA0KICAgICAgICAgICAgICB0aGlzXy4kZWwsDQogICAgICAgICAgICAgICdzdW5Cb3MnDQogICAgICAgICAgICApDQogICAgICAgICAgICAvL+WmguaenOWtmOWcqOWtmeihqOWunuS9k+WImeaJi+WKqOa3u+WKoOepuuWtmeihqOaVsOe7hOWvueixoQ0KICAgICAgICAgICAgaWYgKHN1bkJvcykgew0KICAgICAgICAgICAgICBsZXQgYXJyYXlCbyA9IHN1bkJvcy5zcGxpdCgnLCcpDQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlCby5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGxldCBrZXkgPSAnc3ViXycgKyBhcnJheUJvW2ldDQogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gbmV3IEFycmF5KCkNCiAgICAgICAgICAgICAgICBzdWJMaW5lRGF0YVtrZXldID0gdmFsdWUNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZDooagNCiAgICAgICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7DQogICAgICAgICAgICAgIHN1YkJvLmVtcHR5KCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN1YkJvLnB1c2goc3ViTGluZURhdGEpDQogICAgICAgICAgICByZXR1cm5TaXplLS0NCiAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsNCiAgICAgIH1jYXRjaChlKSB7DQogICAgICAgIGlmKGUubWVzc2FnZSE9IkVuZEl0ZXJhdGl2ZSIpIHRocm93IGU7DQogICAgICB9Ow0KDQogICAgfSwNCiAgICBkaWFsb2dDYW5jZWxUcmVlKCkgew0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9zZXREaWFsb2dEYXRhIiwgW10pOw0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlOw0KICAgIH0sDQogICAgZ2V0Q2hlY2tlZChkYXRhLCBjaGVja2VkLCBpbmRldGVybWluYXRlKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107DQogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLnByb3BzRGF0YSA9IHRoaXMuJHJlZnMudHJlZS5nZXRDaGVja2VkTm9kZXMoKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIHRyZWVDbGljayhkYXRhLCBuLCBpKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMucHJvcHNEYXRhID0gW107DQogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSk7DQogICAgICB9DQogICAgfSwNCiAgICBjbGVhckFsbFNlbGVjdE9yZ3MoKSB7DQogICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBudWxsOw0KICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS5jbGVhclNlbGVjdGlvbigpOw0KICAgIH0sDQogICAgcmVtb3ZlU2VsZWN0T3JnKGl0ZW0pIHsNCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgdGhpcy4kZW1pdCgiaW5wdXQiLCAiIik7DQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UoaXRlbSwgMSk7DQogICAgICAgIHRoaXMuc2hvd0RhdGEuc3BsaWNlKGl0ZW0sIDEpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5pbnB1dFZhbC5zcGxpY2UoaXRlbSwgMSk7DQogICAgICAgIC8vIGxldCByZW1vdmVJZCA9IHRoaXMuc2hvd0RhdGFbaXRlbV07DQogICAgICAgIC8v5qCR5b2iDQogICAgICAgIGlmICh0aGlzLnByb3BzRGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdGhpcy5wcm9wc0RhdGEuc3BsaWNlKGl0ZW0sIDEpOw0KICAgICAgICB9DQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsNCiAgICAgICAgfQ0KICAgICAgICAvL+WIl+ihqA0KICAgICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IG51bGwpIHsNCiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOw0KICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsLnNwbGljZShpdGVtLCAxKTsNCiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsNCiAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsNCiAgICAgICAgICAgIHRoaXMudG9nZ2xlUm93U2VsZWN0aW9uKHJvdywgZmFsc2UpOw0KICAgICAgICAgICAgLy8gfQ0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpOw0KICAgICAgICBsZXQgdmFsdWUgPSAiIjsNCiAgICAgICAgdGhpcy5pbnB1dFZhbC5mb3JFYWNoKCh2YWwpID0+IHsNCiAgICAgICAgICB2YWx1ZSArPSB2YWwudmFsdWUgKyAiLCI7DQogICAgICAgIH0pOw0KICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIDEpOw0KICAgICAgICB9DQogICAgICAgIGlmICh2YWx1ZSAhPSAiIikgew0KICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAifHwiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5zaG93RGF0YSk7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kZW1pdCgiaW5wdXQiLCB2YWx1ZSk7DQogICAgICB9DQogICAgICB0aGlzLnN5bmNJbnB1dFZhbHVlKCk7DQogICAgfSwNCiAgICBjYWxhY0lucHV0U3VmZml4SGVpZ2h0KCkgew0KICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgIGlmICghdGhpcy4kcmVmcy50YWdTcGFucykgcmV0dXJuOw0KICAgICAgICBpZiAodGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsNCiAgICAgICAgICB0aGlzLmlucHV0U3VmZml4SGVpZ2h0ID0gdGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuaW5wdXRTdWZmaXhIZWlnaHQgPSAzMDsNCiAgICAgICAgfQ0KICAgICAgICAvLyDop6blj5Hpqozor4ENCiAgICAgICAgdGhpcy4kdmFsaWRhdG9yLnZhbGlkYXRlKCk7DQogICAgICB9LCAwKTsNCiAgICB9LA0KICAgIGN1c3RvbURpYWxvZ1Nob3cocGFnZVBhcmFtKSB7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nID0gcGFnZVBhcmFtLmN1c3RvbURpYWxvZzsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnF1ZXJ5VXJsID0NCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIg0KICAgICAgICAgID8gIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9IiArDQogICAgICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5hbGlhcyArDQogICAgICAgICAgICAiJm1hcFBhcmFtPSIgKw0KICAgICAgICAgICAgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAiIikNCiAgICAgICAgICA6IHRoaXMuY3VzdG9tRGlhbG9nLnVybDsNCiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoIDwgMSkgew0KICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7IHBhZ2U6IDEsIHBhZ2VTaXplOiAyMCwgc2hvd1RvdGFsOiAidHJ1ZSIgfTsNCiAgICAgICAgdGhpcy5zZWFyY2goKTsNCiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsNCiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSIpIHsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkWw0KICAgICAgICAgICAgICBpDQogICAgICAgICAgICBdLmZpZWxkLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IGVsc2UgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPiAxKSB7DQogICAgICAgIHRoaXMuc2VhcmNoKCk7DQogICAgICB9DQogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy5zZWFyY2goKTsNCiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsNCiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSIpIHsNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkWw0KICAgICAgICAgICAgICBpDQogICAgICAgICAgICBdLmZpZWxkLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICBjdXN0b21EaWFsb2dUcmVlU2hvdyhwYWdlUGFyYW0pIHsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nID0gcGFnZVBhcmFtLmN1c3RvbURpYWxvZzsNCiAgICAgIHZhciBjdXN0b21EaWFsb2cgPSB0aGlzLmN1c3RvbURpYWxvZzsNCiAgICAgIHZhciBtYXBQYXJhbSA9ICIiOw0KICAgICAgaWYgKHBhZ2VQYXJhbS5wYXJhbSAhPSB1bmRlZmluZWQpIHsNCiAgICAgICAgbWFwUGFyYW0gPSBKU09OLnN0cmluZ2lmeShwYWdlUGFyYW0ucGFyYW0pOw0KICAgICAgICBtYXBQYXJhbSA9IG1hcFBhcmFtLnN1YnN0cmluZygxLCBtYXBQYXJhbS5sZW5ndGggLSAxKTsNCiAgICAgIH0NCiAgICAgIHZhciByZXF1ZXN0VHlwZSA9DQogICAgICAgIGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiDQogICAgICAgICAgPyAiR0VUIg0KICAgICAgICAgIDogY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlDQogICAgICAgICAgPyBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUNCiAgICAgICAgICA6ICJQT1NUIjsNCiAgICAgIHZhciB1cmwgPQ0KICAgICAgICAiJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0iICsNCiAgICAgICAgcGFnZVBhcmFtLmFsaWFzICsNCiAgICAgICAgIiZtYXBQYXJhbT0iICsNCiAgICAgICAgbWFwUGFyYW07DQogICAgICB2YXIgcGFyYW1zT2JqID0ge307DQogICAgICBpZiAoY3VzdG9tRGlhbG9nLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsNCiAgICAgICAgdXJsID0gY3VzdG9tRGlhbG9nLnVybDsNCiAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSBjdXN0b21EaWFsb2cuZGF0YVBhcmFtOw0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7DQogICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgY29uID0gY29uZGl0aW9uc1tpXTsNCiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAiUE9TVCIpIHsNCiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhID0gdGVtcGxhdGVQYS5yZXBsYWNlKA0KICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cCgiXFx7IiArIGNvbi5maWVsZCArICJcXH0iLCAiZyIpLA0KICAgICAgICAgICAgICAgICAgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoIj8iKSA9PSAtMSA/ICI/IiA6ICImIjsNCiAgICAgICAgICAgICAgdXJsID0gdXJsICsgbGpDaGFyICsgY29uLmZpZWxkICsgIj0iICsgY29uLmRlZmF1bHRWYWx1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9Ow0KICAgICAgcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9IHJlcXVlc3RUeXBlOw0KICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7DQogICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsNCiAgICAgIHRoaXMuc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKTsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlOw0KICAgIH0sDQogICAgLy/moJHlvaLmn6Xor6INCiAgICBzZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpczsNCiAgICAgIGxldCBxdWVyeSA9DQogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPT0gIlBPU1QiDQogICAgICAgICAgPyByZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCwgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmopDQogICAgICAgICAgOiByZXEuZ2V0KHJlcXVlc3RQYXJhbXMudXJsKTsNCiAgICAgIHF1ZXJ5LnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQogICAgICAgIC8v5pi+56S65a2X5q616YWN572uDQogICAgICAgIGxldCBkaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHRoaXNfLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOw0KICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQ7DQogICAgICAgIC8v5oqK5a+56K+d5qGG6YWN572u55qE5pi+56S65a2X5q615pi+56S65ZCN56ew6LWL5YC857uZ5qCR5b2i55qE5pi+56S65YC8DQogICAgICAgIHRoaXNfLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZTsNCiAgICAgICAgdGhpc18udHJlZUxpc3QgPSByZXNwb25zZS5kYXRhOw0KICAgICAgICAvL+W+l+WIsOimgeWKoOi9veagkeeahOS/oeaBrw0KICAgICAgICB0aGlzXy5wcm9wczEgPSB0aGlzXy50b1RyZWVEYXRhKA0KICAgICAgICAgIHJlc3BvbnNlLmRhdGEsDQogICAgICAgICAgZGlzcGxheWZpZWxkLmlkLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5waWQsDQogICAgICAgICAgZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMA0KICAgICAgICApOw0KICAgICAgfSk7DQogICAgfSwNCiAgICAvL+WKoOi9veagkeeahOS/oeaBrw0KICAgIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7DQogICAgICAvLyDlu7rnq4vkuKrmoJHlvaLnu5PmnoQs6ZyA6KaB5a6a5LmJ5Liq5pyA6aG25bGC55qE54i26IqC54K577yMcHZhbHVl5pivMA0KICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpOw0KICAgIH0sDQogICAgdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsNCiAgICAgIC8v5oqK5qCR5pWw5o2u5pyJ5a2Q6IqC54K555qE5pWw5o2u5YWo6YOo6L+H5ruk5o6J77yI5Y+q55WZ54i26IqC54K555qE5pWw5o2u77yJDQogICAgICBsZXQgcGFyZW50cyA9IGRhdGEuZmlsdGVyKA0KICAgICAgICAodmFsdWUpID0+DQogICAgICAgICAgdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwgdmFsdWVbcGlkXSA9PSBudWxsIHx8IHZhbHVlW3BpZF0gPT0gcHZhbHVlDQogICAgICApOw0KICAgICAgaWYgKCFwYXJlbnRzKSB7DQogICAgICAgIHBhcmVudHMgPSBkYXRhLmZpbHRlcigNCiAgICAgICAgICAodmFsdWUpID0+DQogICAgICAgICAgICB2YWx1ZVtwaWRdICE9PSAidW5kZWZpbmVkIiAmJg0KICAgICAgICAgICAgdmFsdWVbcGlkXSAhPSBudWxsICYmDQogICAgICAgICAgICB2YWx1ZVtpZF0gIT0gdmFsdWVbcGlkXQ0KICAgICAgICApOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHBhcmVudHM7DQogICAgfSwNCiAgICBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7DQogICAgICBpZiAobm9kZSkgew0KICAgICAgICBsZXQgdGhpc18gPSB0aGlzOw0KICAgICAgICBsZXQgZGlzcGxheUZpZWxkID0NCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cuc3R5bGUgPT0gMg0KICAgICAgICAgICAgPyB0aGlzXy5jb21iaVRyZWVEaXNwbGF5RmllbGQNCiAgICAgICAgICAgIDogdGhpc18uZGlzcGxheUZpZWxkOw0KICAgICAgICByZXNvbHZlKA0KICAgICAgICAgIHRoaXMudHJlZUxpc3QuZmlsdGVyKA0KICAgICAgICAgICAgKHZhbHVlKSA9PiB2YWx1ZVtkaXNwbGF5RmllbGQucGlkXSA9PT0gbm9kZS5kYXRhW2Rpc3BsYXlGaWVsZC5pZF0NCiAgICAgICAgICApDQogICAgICAgICk7DQogICAgICAgIGlmICh0aGlzLnNob3dEYXRhICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgdGhpcy5zaG93RGF0YS5mb3JFYWNoKCh2KSA9PiB7DQogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZCh2LCB0cnVlKTsNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzXy5jaGVja05vZGUodiwgdGhpc18pOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9LCA0MDApOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCg0KICAgIGFmdGVyT3BlbigpIHsNCiAgICAgIC8v5omT5byA5a+56K+d5qGG5LmL5ZCO5Yqg6L295qCRDQogICAgICB0aGlzLmxvYWRDb21iaW5hdGlvblRyZWUoKTsNCiAgICB9LA0KICAgIGxvYWRDb21iaW5hdGlvblRyZWUoKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc3R5bGUgIT0gMikgew0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpOw0KICAgICAgdGhpcy5jb21iaW5hdGlvblJ1bGUgPSBjb21iaW5hdGlvblJ1bGU7DQogICAgICBsZXQgdHJlZUFsaWFzID0gY29tYmluYXRpb25SdWxlLmxlZnRUcmVlOw0KICAgICAgLy/ojrflj5blr7nor53moYbmlbDmja4NCiAgICAgIHJlcQ0KICAgICAgICAuZ2V0KCIke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9IiArIHRyZWVBbGlhcykNCiAgICAgICAgLnRoZW4oKHJlc3ApID0+IHsNCiAgICAgICAgICBsZXQgdHJlZURpYWxvZyA9IHJlc3AuZGF0YTsNCiAgICAgICAgICB0aGlzLmxlZnRUcmVlVGl0bGUgPSB0cmVlRGlhbG9nLm5hbWU7DQogICAgICAgICAgbGV0IHJlcVBhcmFtID0ge307DQogICAgICAgICAgbGV0IHJlcXVlc3RUeXBlID0NCiAgICAgICAgICAgIHRyZWVEaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIg0KICAgICAgICAgICAgICA/ICJHRVQiDQogICAgICAgICAgICAgIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgICAgICA/IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUNCiAgICAgICAgICAgICAgOiAiUE9TVCI7DQogICAgICAgICAgbGV0IHVybCA9DQogICAgICAgICAgICAiJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0iICsNCiAgICAgICAgICAgIHRyZWVBbGlhcyArDQogICAgICAgICAgICAiJm1hcFBhcmFtPSI7DQogICAgICAgICAgbGV0IHBhcmFtc09iaiA9IHt9Ow0KICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsNCiAgICAgICAgICAgIHVybCA9IHRyZWVEaWFsb2cudXJsOw0KICAgICAgICAgICAgbGV0IHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbTsNCiAgICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7DQogICAgICAgICAgICAgIGxldCBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsNCiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IGNvbiA9IGNvbmRpdGlvbnNbaV07DQogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICJQT1NUIikgew0KICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZSgNCiAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKCJcXHsiICsgY29uLmZpZWxkICsgIlxcfSIsICJnIiksDQogICAgICAgICAgICAgICAgICAgICAgY29uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICBsZXQgbGpDaGFyID0gdXJsLmluZGV4T2YoIj8iKSA9PSAtMSA/ICI/IiA6ICImIjsNCiAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7DQogICAgICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBsZXQgcmVxdWVzdFBhcmFtcyA9IHt9Ow0KICAgICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsNCiAgICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsNCiAgICAgICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsNCiAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgLmRpc3BhdGNoKCJkaWFsb2cvZ2V0VHJlZURhdGEiLCByZXF1ZXN0UGFyYW1zKQ0KICAgICAgICAgICAgLnRoZW4oKHJlc3ApID0+IHsNCiAgICAgICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsNCiAgICAgICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCk7DQogICAgICAgICAgICAgICAgbGV0IHJlc3VsdGZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKTsNCiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZTsNCiAgICAgICAgICAgICAgICB0aGlzLnRyZWVMaXN0ID0gcmVzcDsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA9IGRpc3BsYXlGaWVsZDsNCiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZURhdGEgPSB0aGlzLnRvVHJlZURhdGEoDQogICAgICAgICAgICAgICAgICByZXNwLA0KICAgICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkLmlkLA0KICAgICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkLnBpZCwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZSwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5wdmFsdWUgPyBkaXNwbGF5RmllbGQucHZhbHVlIDogIjAiLA0KICAgICAgICAgICAgICAgICAgcmVzdWx0ZmllbGQNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgfSwNCiAgICBjb21iaVRyZWVDbGljayhwYXJhbU9iaiwgbm9kZSwgbm9kZUNvbXBvbmVudCkgew0KICAgICAgLy/nu4TlkIjlr7nor53moYbngrnlh7vlt6bmoJENCiAgICAgIC8v5riF56m65pen55qEDQogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7DQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpOw0KICAgICAgaWYgKCFjb21iaW5hdGlvblJ1bGUucnVsZXMgfHwgY29tYmluYXRpb25SdWxlLnJ1bGVzLmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIGxldCBydWxlcyA9IGNvbWJpbmF0aW9uUnVsZS5ydWxlczsNCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgbGV0IHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXTsNCiAgICAgICAgbGV0IHByb3BlcnR5ID0gcnVsZXNbaV0ubGlzdEZpZWxkOw0KICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksDQogICAgICAgICAgdmFsdWU6IHZhbHVlLA0KICAgICAgICAgIGdyb3VwOiAidHJlZUdyb3VwIiwNCiAgICAgICAgICBvcGVyYXRpb246IHRoaXMuZ2V0T3BlcmF0aW9uKHJ1bGVzW2ldLmNvbmRpdGlvbiksDQogICAgICAgICAgcmVsYXRpb246ICJBTkQiLA0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICAgIHRoaXMuc2VhcmNoKCk7DQogICAgfSwNCiAgICAvL+iOt+WPlui/kOeul+espuWPtw0KICAgIGdldE9wZXJhdGlvbihvbGQpIHsNCiAgICAgIGlmICghb2xkKSB7DQogICAgICAgIHJldHVybiAiIjsNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gIkVRIikgew0KICAgICAgICByZXR1cm4gIkVRVUFMIjsNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gIkxLIikgew0KICAgICAgICByZXR1cm4gIkxJS0UiOw0KICAgICAgfQ0KICAgICAgaWYgKG9sZCA9PSAiTEZLIikgew0KICAgICAgICByZXR1cm4gIkxJS0UiOw0KICAgICAgfQ0KICAgICAgaWYgKG9sZCA9PSAiSU4iKSB7DQogICAgICAgIHJldHVybiAiSU4iOw0KICAgICAgfQ0KICAgIH0sDQogICAgdG9nZ2xlVHJlZSgpIHsNCiAgICAgIGlmICh0aGlzLnRyZWVTaG93KSB7DQogICAgICAgIHRoaXMudHJlZVNob3cgPSBmYWxzZTsNCiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICIwJSI7DQogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctcmlnaHQiOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy50cmVlU2hvdyA9IHRydWU7DQogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMjUlIjsNCiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAiZWwtaWNvbi1hcnJvdy1sZWZ0IjsNCiAgICAgIH0NCiAgICB9LA0KICAgIGluaXRUZW1wbGF0ZURhdGEoKXsNCiAgICAgICAgbGV0IF90aGlzID0gdGhpczsNCiAgICAgICAgY29uc3QgY3VzdGRpYWxvZyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nOw0KICAgICAgICBpZighY3VzdGRpYWxvZyB8fCAhY3VzdGRpYWxvZy5tYXBwaW5nQ29uZiB8fCBjdXN0ZGlhbG9nLm1hcHBpbmdDb25mLmxlbmd0aDwxKXsNCiAgICAgICAgICByZXR1cm4gOw0KICAgICAgICB9DQogICAgICAgIGNvbnN0IHRhcmdldFBhdGggPSB0aGlzLmdldFRhcmdldFBhdGgoY3VzdGRpYWxvZy5tYXBwaW5nQ29uZik7DQogICAgICAgIGNvbnN0IHBhdGhzID0gdGFyZ2V0UGF0aC5zcGxpdCgnLicpOw0KICAgICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgICAgaWYoIWZvcm1JbnN0LmluaXRGaWxsRGF0YSl7DQogICAgICAgICAgcmV0dXJuIDsNCiAgICAgICAgfQ0KICAgICAgICAvL+WmguaenOW3suacieaVsOaNruWImeS4jemcgOimgeWGjeasoeWIneWni+WMlg0KICAgICAgICBjb25zdCBjdXJEYXRhID0gZm9ybUluc3RbJ2RhdGEnXVtwYXRoc1swXV1bcGF0aHNbMV1dOw0KICAgICAgICBsZXQgaW5pdFR5cGUgPSB0aGlzLmluaXRGaWxsRGF0YVR5cGU7DQogICAgICAgIGlmKCghaW5pdFR5cGUgfHwgaW5pdFR5cGU9PSdlbXB0eScpICYmIGN1ckRhdGEubGVuZ3RoPjAgJiYgIShjdXJEYXRhLmxlbmd0aD09MSAmJiBKU09OLnN0cmluZ2lmeShjdXJEYXRhWzBdKT09J1tdJykpew0KICAgICAgICAgIHJldHVybiA7DQogICAgICAgIH1lbHNlIGlmKGluaXRUeXBlPT0nY292ZXInKXsNCiAgICAgICAgICBmb3JtSW5zdFsnZGF0YSddW3BhdGhzWzBdXVtwYXRoc1sxXV0gPSBbXTsNCiAgICAgICAgfQ0KICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh7DQogICAgICAgICAgbG9jazogdHJ1ZSwNCiAgICAgICAgICB0ZXh0OiAn5q2j5Zyo5Yid5aeL5YyW5aGr5oql5qih5p2/Li4uJywNCiAgICAgICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywNCiAgICAgICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJw0KICAgICAgICB9KTsNCiAgICAgICAgbGV0IG15Q3VzdG9tRGlhbG9nID0gbnVsbDsNCiAgICAgICAgdGhpcy4kaHR0cC5nZXQoJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0nK2N1c3RkaWFsb2cuYWxpYXMpLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICBteUN1c3RvbURpYWxvZyA9IHJlc3AuZGF0YTsNCiAgICAgICAgICAgIF90aGlzLmN1c3RvbURpYWxvZyA9IHJlc3AuZGF0YTsNCiAgICAgICAgfSwgZXJyb3IgPT4gew0KICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOw0KICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICBtZXNzYWdlOiAi6I635Y+W6Ieq5a6a5LmJ5a+56K+d5qGG5aSx6LSl77yBIiwNCiAgICAgICAgICAgICAgdHlwZTogImVycm9yIg0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiY3VycmVudFVzZXIiKSk7DQogICAgICAgICAgICAgaWYoIV90aGlzLmN1c3RkaWFsb2cub3JnQ29uZmlnLmNvZGUgJiYgIV90aGlzLmN1c3RkaWFsb2cub3JnQ29uZmlnLm5hbWUgJiYgIV90aGlzLmN1c3RkaWFsb2cub3JnQ29uZmlnLmlkKXsNCiAgICAgICAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7DQogICAgICAgICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMsbXlDdXN0b21EaWFsb2cuZHNUeXBlLGZvcm1JbnN0WydkYXRhJ10pOw0KICAgICAgICAgICAgICB9ZWxzZSBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oImN1ckZpbGxPcmdfIitjdXJyZW50VXNlci5hY2NvdW50KSkgew0KICAgICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOw0KICAgICAgICAgICAgICAgX3RoaXMuZmlsbE9yZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oImN1ckZpbGxPcmdfIitjdXJyZW50VXNlci5hY2NvdW50KSk7DQogICAgICAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcyxteUN1c3RvbURpYWxvZy5kc1R5cGUsZm9ybUluc3RbJ2RhdGEnXSk7DQogICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICBfdGhpcy4kaHR0cC5nZXQoJyR7dWN9L2FwaS9vcmcvdjEvb3JnL2dldEZpbGxPcmcnKS50aGVuKHJlc3AgPT4gew0KICAgICAgICAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwID0gcmVzcC5kYXRhOw0KICAgICAgICAgICAgICAgICAgICBpZihyZXAuc3RhdGUpew0KICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmZpbGxPcmcgPSByZXAudmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImN1ckZpbGxPcmdfIitjdXJyZW50VXNlci5hY2NvdW50LEpTT04uc3RyaW5naWZ5KHJlcC52YWx1ZSkpDQogICAgICAgICAgICAgICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMsbXlDdXN0b21EaWFsb2cuZHNUeXBlLGZvcm1JbnN0WydkYXRhJ10pOw0KICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXAubWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIg0KICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSwgZXJyb3IgPT4gew0KICAgICAgICAgICAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7DQogICAgICAgICAgICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAi6I635Y+W5b2T5YmN55So5oi35aGr5Yi25Y2V5L2N5aSx6LSl77yBIiwNCiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyINCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0sDQogICAgY2xvc2VMb2FkaW5nKGxvYWRpbmcpew0KICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICBsb2FkaW5nLmNsb3NlKCk7DQogICAgICB9LDIwMDApOw0KICAgIH0sDQogICAgZ2V0VGFyZ2V0UGF0aChtYXBwaW5nQ29uZil7DQogICAgICBsZXQgdGFyZ2V0ID0gJyc7DQogICAgICBpZihtYXBwaW5nQ29uZiAmJiBtYXBwaW5nQ29uZi5sZW5ndGg+MCl7DQogICAgICAgIG1hcHBpbmdDb25mLmZvckVhY2gobWFwID0+ew0KICAgICAgICAgIGlmKG1hcFsndGFyZ2V0J10gJiYgbWFwWyd0YXJnZXQnXS5sZW5ndGg9PTEgJiYgbWFwWyd0YXJnZXQnXVswXSl7DQogICAgICAgICAgICB0YXJnZXQgPSBtYXBbJ3RhcmdldCddWzBdOw0KICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRhcmdldDsNCiAgICB9LA0KICAgIHRvRmlsbEluaXREYXRhKF90aGlzLGRzVHlwZSxjdXJEYXRhKXsNCiAgICAgIGNvbnN0IGN1c3RkaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZzsNCiAgICAgIGxldCBwYXJhbXMgPSBbXTsvL+e7keWumueahOihqOWNleWtl+autQ0KICAgICAgaWYoY3VzdGRpYWxvZy5jb25kaXRpb25zKXsNCiAgICAgICAgLy/lr7nor53moYbmjInooajljZXlrZfmrrXmn6Xor6LvvIjlj4LmlbDkvKDlhaXnmoTvvIkNCiAgICAgICAgbGV0IGJpbmRMaXN0ID0gY3VzdGRpYWxvZy5jb25kaXRpb25zOw0KICAgICAgICBpZihiaW5kTGlzdC5sZW5ndGg+MCl7DQogICAgICAgICAgYmluZExpc3QuZm9yRWFjaChlbGUgPT4gew0KICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUNCiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gIjMiICYmIGVsZS5iaW5kKSB7DQogICAgICAgICAgICAgIGxldCBvYmogPSB7fTsNCiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkOw0KICAgICAgICAgICAgICBjb25zdCBiaW5kQXJyYXkgPSBlbGUuYmluZC5zcGxpdCgnLicpOw0KICAgICAgICAgICAgICBpZihiaW5kQXJyYXkubGVuZ3RoPT0zKXsNCiAgICAgICAgICAgICAgICBvYmouYmluZCA9IGN1ckRhdGFbYmluZEFycmF5WzFdXVtiaW5kQXJyYXlbMl1dOw0KICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKG9iaik7DQogICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBsZXQgdXJsID0gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9JytjdXN0ZGlhbG9nLmFsaWFzOw0KICAgICAgaWYocGFyYW1zLmxlbmd0aD4wKXsNCiAgICAgICAgbGV0IHBhU3RyID0gJyc7DQogICAgICAgIHBhcmFtcy5mb3JFYWNoKHBhID0+ew0KICAgICAgICAgIGlmKHBhU3RyKXsNCiAgICAgICAgICAgIHBhU3RyICs9ICcsJzsNCiAgICAgICAgICB9DQogICAgICAgICAgcGFTdHIgPSBwYVN0ciArICciJytwYS5maWVsZCArJyI6IicrcGEuYmluZCsnIic7DQogICAgICAgIH0pOw0KICAgICAgICB1cmwgPSB1cmwrJyZtYXBQYXJhbT0nK3BhU3RyOw0KICAgICAgfWVsc2V7DQogICAgICAgIHVybCA9IHVybCsnJm1hcFBhcmFtPSc7DQogICAgICB9DQogICAgICBjb25zdCBwYXJhbSA9IHtwYWdlQmVhbjoge3BhZ2U6IDEsIHBhZ2VTaXplOiAxMDAwLCBzaG93VG90YWw6IHRydWV9fTsNCiAgICAgIF90aGlzLiRodHRwLnBvc3QodXJsLCBwYXJhbSkudGhlbihyZXNwID0+IHsNCiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3AuZGF0YTsNCiAgICAgICAgICBpZihyZXNwb25zZS5yb3dzKXsNCiAgICAgICAgICAgIF90aGlzLnN5bmNJbml0VGFibGVWYWx1ZShyZXNwb25zZS5yb3dzLGRzVHlwZSk7DQogICAgICAgICAgfQ0KICAgICAgfSwgZXJyb3IgPT4gew0KICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5bliJ3lp4vljJbmlbDmja7lpLHotKXvvIEiLA0KICAgICAgICAgICAgdHlwZTogImVycm9yIg0KICAgICAgICAgIH0pOw0KICAgICAgfSk7DQogICAgfSwNCiAgICBzeW5jSW5pdFRhYmxlVmFsdWUocyxkc1R5cGUpIHsNCiAgICAgIGxldCBjdXN0RGlhbG9nID0gdGhpcy5jdXN0ZGlhbG9nOw0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOw0KICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUNCiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOw0KICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsNCiAgICAgIHZhciBzdHIgPSBbXTsNCiAgICAgIHZhciBpZHMgPSBbXTsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGZpZWxkW2ldID0NCiAgICAgICAgICBkc1R5cGUgPT0gImRhdGFTb3VyY2UiDQogICAgICAgICAgICA/IHJldHVyblN0cltpXS5maWVsZC50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICA6IHJldHVyblN0cltpXS5maWVsZDsNCiAgICAgICAgY29tbWVudFtpXSA9DQogICAgICAgICAgZHNUeXBlID09ICJkYXRhU291cmNlIg0KICAgICAgICAgICAgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICA6IHJldHVyblN0cltpXS5jb21tZW50Ow0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB2YXIgdGVtcCA9ICIiOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBjb25zdCB2YSA9IHNbMF1bZmllbGRbaV1dOw0KICAgICAgICAgIHZhID0gdHlwZW9mKHZhKT09J3VuZGVmaW5lZCc/Jyc6dmE7DQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyB2YSArICciLCc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gIiIpIHsNCiAgICAgICAgICB0ZW1wID0gInsiICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICJ9IjsNCiAgICAgICAgfQ0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7DQogICAgICAgIGlkcy5wdXNoKHNbMF0uaWQpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdmFyIHRlbXAgPSAiIjsNCiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbW1lbnQubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgIGNvbnN0IHZhID0gc1tpXVtmaWVsZFtqXV07DQogICAgICAgICAgICB2YSA9IHR5cGVvZih2YSk9PSd1bmRlZmluZWQnPycnOnZhOw0KICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyB2YSArICciLCc7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0ZW1wICE9ICIiKSB7DQogICAgICAgICAgICB0ZW1wID0gInsiICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICJ9IjsNCiAgICAgICAgICB9DQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOw0KICAgICAgICAgIGlkcy5wdXNoKHNbaV0uaWQpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgIHRoaXMuaW5zdElkID0gZm9ybUluc3QuJHBhcmVudC5pbnN0SWQ7DQogICAgICAvL+WkhOeQhuWhq+WItumDqOmXqA0KICAgICAgbGV0IGZpbGxPcmcgPSB7fTsNCiAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnICYmIGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUgJiYgdGhpcy5maWxsT3JnLmlkKXsNCiAgICAgICAgY29uc3QgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7DQogICAgICAgIGNvbnN0IG9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aC0xXTsNCiAgICAgICAgZmlsbE9yZ1tvcmdOYW1lRmllbGRdID0gdGhpcy5maWxsT3JnLm5hbWU7DQogICAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkKXsNCiAgICAgICAgICBjb25zdCBpZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZC5zcGxpdCgnLicpOw0KICAgICAgICAgIGNvbnN0IG9yZ0lkRmllbGQgPSBpZFBhdGhbaWRQYXRoLmxlbmd0aC0xXTsNCiAgICAgICAgICBmaWxsT3JnW29yZ0lkRmllbGRdID0gdGhpcy5maWxsT3JnLmlkOw0KICAgICAgICB9DQogICAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUpew0KICAgICAgICAgIGNvbnN0IGNvZGVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuY29kZS5zcGxpdCgnLicpOw0KICAgICAgICAgIGNvbnN0IG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aC0xXTsNCiAgICAgICAgICBmaWxsT3JnW29yZ0NvZGVGaWVsZF0gPSB0aGlzLmZpbGxPcmcuY29kZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYoY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkKXsNCiAgICAgICAgY29uc3QgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOw0KICAgICAgICBjb25zdCBpbnN0SWRGaWVsZCA9IGluc3RJZFBhdGhbaW5zdElkUGF0aC5sZW5ndGgtMV07DQogICAgICAgIGZpbGxPcmdbaW5zdElkRmllbGRdID0gdGhpcy5pbnN0SWQ7DQogICAgICB9DQogICAgICBjb25zdCByZXR1cm5EYXRhID0gc3RyOw0KICAgICAgY29uc3QgX3RoaXMgPSB0aGlzOw0KDQogICAgICByZXR1cm5EYXRhLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge307DQogICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7DQogICAgICAgIGN1c3REaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsNCiAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgiLiIpOw0KICAgICAgICAgICAgdmFyIGZyb20gPSAiIjsNCiAgICAgICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJyZXN0ZnVsIikgew0KICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb207DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IHJvd1tmcm9tXTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBpZihmaWxsT3JnICYmIEpTT04uc3RyaW5naWZ5KGZpbGxPcmcpIT0ne30nKXsNCiAgICAgICAgICBzdWJMaW5lRGF0YSA9IHsuLi5zdWJMaW5lRGF0YSwuLi5maWxsT3JnfTsNCiAgICAgICAgfQ0KICAgICAgICBmb3JtSW5zdFsnZGF0YSddW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV0ucHVzaChzdWJMaW5lRGF0YSk7DQogICAgICB9KTsNCiAgICB9LA0KICB9LA0KfTsNCg=="},null]}