{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\utils.js","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\utils.js","mtime":1695626572283},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\babel.config.js","mtime":1725536844935},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9ienpnai1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmpvaW4uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLnNvbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZG90LWFsbC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnN0aWNreS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50ZXN0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pbmNsdWRlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOwppbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlQm94LCBOb3RpZmljYXRpb24gfSBmcm9tICdlbGVtZW50LXVpJzsKdmFyIGNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZyA9IGZhbHNlOyAvL+aYr+WQpumakOiXj+aEn+WPueWPt+agoemqjOaPkOekugp2YXIgbm90aWZpY2F0aW9ucyA9IHt9OyAvL+eUqOadpeiOt+WPluW8ueeql+eahOWunuS+i++8jOS7peWvueWvueW6lOW8ueeql+i/m+ihjOaTjeS9nAp2YXIgdXRpbHMgPSB7CiAgLy8g56e76ZmkdXJs5ZCO6Z2i55qE5oyH5a6a5Y+C5pWwCiAgcmVtb3ZlVXJsUGFyYW1zOiBmdW5jdGlvbiByZW1vdmVVcmxQYXJhbXMocGFyYW0pIHsKICAgIHZhciBxdWVyeSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpOwogICAgaWYgKCFxdWVyeSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgdmFycyA9IHF1ZXJ5LnNwbGl0KCcmJyk7CiAgICB2YXIgbmV3VmFycyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBwYWlyID0gdmFyc1tpXS5zcGxpdCgnPScpOwogICAgICBpZiAocGFpclswXSAhPSBwYXJhbSkgewogICAgICAgIG5ld1ZhcnMucHVzaCh2YXJzW2ldKTsKICAgICAgfQogICAgfQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXRoID0gIiIuY29uY2F0KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSkuY29uY2F0KG5ld1ZhcnMubGVuZ3RoID4gMCA/ICc/JyA6ICcnKS5jb25jYXQobmV3VmFycy5qb2luKCcmJykpOwogICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgbnVsbCwgcGF0aCk7CiAgICB9LCAxMDAwKTsKICB9LAogIC8qKg0KICAgKiDmoLnmja7lrZflhbjnvJbnoIHojrflj5blrZflhbjmlbDmja4NCiAgICovCiAgZ2V0RGljdEl0ZW1zRnJvbUNhY2hlOiBmdW5jdGlvbiBnZXREaWN0SXRlbXNGcm9tQ2FjaGUoZGljdENvZGUpIHsKICAgIGlmICghZGljdENvZGUpIHsKICAgICAgcmV0dXJuICflrZflhbhDb2Rl5LiN6IO95Li656m6ISc7CiAgICB9CiAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpIHsKICAgICAgdmFyIGRpY3RfZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpOwogICAgICBpZiAoZGljdF9kYXRhW2RpY3RDb2RlXSkgewogICAgICAgIHZhciBkaXN0SXRlbSA9IGRpY3RfZGF0YVtkaWN0Q29kZV07CiAgICAgICAgcmV0dXJuIGRpc3RJdGVtOwogICAgICB9CiAgICB9CiAgfSwKICAvL+agueaNruS8oOWFpeeahOWAvOWSjOaVsOe7hOi/m+ihjOavlOi+g++8jOebuOetiei/lOWbnuivpeaVsOaNruS4quafkOadoeaVsOaNrgogIGluZGV4T2ZMaXN0OiBmdW5jdGlvbiBpbmRleE9mTGlzdChsaXN0LCBrZXksIHZhbHVlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGxpc3RbaV1ba2V5XSA9PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBsaXN0W2ldOwogICAgICB9CiAgICB9CiAgfSwKICAvL+iOt+WPlnVybOS4reeahOWPguaVsAogIGdldFBhcmFtZXRlcnM6IGZ1bmN0aW9uIGdldFBhcmFtZXRlcnMobmFtZSkgewogICAgdmFyIGxvY1VybCA9IGRlY29kZVVSSSh3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKSk7CiAgICB2YXIgYXJ5UGFyYW1zID0gbG9jVXJsLnNwbGl0KCImIik7CiAgICB2YXIgcnRuID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyeVBhcmFtcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGFpciA9IGFyeVBhcmFtc1tpXTsKICAgICAgdmFyIGFyeUVudCA9IHBhaXIuc3BsaXQoIj0iKTsKICAgICAgdmFyIGtleSA9IGFyeUVudFswXTsKICAgICAgdmFyIHZhbCA9IGFyeUVudFsxXTsKICAgICAgaWYgKGtleSAhPSBuYW1lKSBjb250aW51ZTsKICAgICAgaWYgKHJ0biA9PSAiIikgewogICAgICAgIHJ0biA9IHZhbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBydG4gKz0gIiwiICsgdmFsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcnRuOwogIH0sCiAgLy8g5Yik5pat5b2T5YmN5piv5ZCm5Li656e75Yqo56uv6K6+5aSHCiAgaXNNb2JpbGU6IGZ1bmN0aW9uIGlzTW9iaWxlKCkgewogICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhwaG9uZXxwYWR8cG9kfGlQaG9uZXxpUG9kfGlvc3xpUGFkfEFuZHJvaWR8TW9iaWxlfEJsYWNrQmVycnl8SUVNb2JpbGV8TVFRQnJvd3NlcnxKVUN8RmVubmVjfHdPU0Jyb3dzZXJ8QnJvd3Nlck5HfFdlYk9TfFN5bWJpYW58V2luZG93cyBQaG9uZSkvaSkgIT0gbnVsbDsKICB9LAogIC8v5a2X6IqC5pWw6L2sS0LmiJbogIVNQgogIGJpZ0RlY2ltYWw6IGZ1bmN0aW9uIGJpZ0RlY2ltYWwoYnl0ZXMpIHsKICAgIHZhciByZXR1cm5WYWx1ZSA9IGJ5dGVzIC8gKDEwMjQgKiAxMDI0KTsKICAgIGlmIChyZXR1cm5WYWx1ZSA+IDEpIHsKICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRvRml4ZWQoMikgKyAiTSI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm5WYWx1ZSA9IGJ5dGVzIC8gMTAyNDsKICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRvRml4ZWQoMCkgKyAiS0IiOwogICAgfQogIH0sCiAgLy/ojrflj5bmjIflrprlrZfnrKblkI7pnaLmiYDmnInlrZfnrKYKICBzdWJzdHJpbmdUeXBlOiBmdW5jdGlvbiBzdWJzdHJpbmdUeXBlKHN0ciwgdHlwZSkgewogICAgdmFyIHJldHVyblZhbHVlID0gc3RyLnNwbGl0KCIuIik7CiAgICByZXR1cm4gcmV0dXJuVmFsdWVbcmV0dXJuVmFsdWUubGVuZ3RoIC0gMV07CiAgfSwKICAvLyDojrflj5bpmo/mnLrnmoTlkI3np7AKICBnZXROYW1lOiBmdW5jdGlvbiBnZXROYW1lKCkgewogICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyKTsKICB9LAogIC8vIOiOt+WPluaOp+S7tuaYr+WQpuWPr+e8lui+kQogIGdldFdyaXRlYWJsZTogZnVuY3Rpb24gZ2V0V3JpdGVhYmxlKHBlcm1pc3Npb24pIHsKICAgIGlmIChwZXJtaXNzaW9uID09PSAndycgfHwgcGVybWlzc2lvbiA9PT0gJ2InKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0sCiAgLy8g6I635Y+W5o6n5Lu25piv5ZCm5re75Yqg5b+F5aGr5qCh6aqMCiAgYWRkUmVxdWlyZWRPck5vdDogZnVuY3Rpb24gYWRkUmVxdWlyZWRPck5vdChwZXJtaXNzaW9uLCB2YWxpZGF0ZSwgbGlua2FnZVZhbGlkYXRlLCBfdGhpcykgewogICAgLy/liKTmlq3mmK/lkKbmnInogZTliqjmoKHpqowKICAgIGlmIChsaW5rYWdlVmFsaWRhdGUubGVuZ3RoID4gMCkgewogICAgICBsaW5rYWdlVmFsaWRhdGUuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgaWYgKGVsZSAmJiBlbGUudmFsaWRhdGUgJiYgImRhdGEuIiArIGVsZS50YXJnZXQgPT0gX3RoaXMuYXR0ZXIpIHsKICAgICAgICAgIHZhbGlkYXRlID0gZWxlLnZhbGlkYXRlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBpZiAocGVybWlzc2lvbiAhPT0gJ2InKSB7CiAgICAgIHJldHVybiB2YWxpZGF0ZTsKICAgIH0KICAgIC8v5aaC5p6c6KGo5Y2V5o6I5p2D5Li65p+Q5o6n5Lu25Yqg5LqG5b+F5aGr5YiZ5b+F5aGrCiAgICBpZiAocGVybWlzc2lvbiA9PT0gJ2InICYmIHZhbGlkYXRlICYmICF2YWxpZGF0ZS5yZXF1aXJlZCAmJiB2YWxpZGF0ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgICAgIHZhbGlkYXRlLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIGlmICh2YWxpZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRlID09PSBudWxsKSB7CiAgICAgIHZhbGlkYXRlID0gInJlcXVpcmVkIjsKICAgIH0gZWxzZSBpZiAodmFsaWRhdGUuY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICB2YXIgYXJ5ID0gdmFsaWRhdGUuc3BsaXQoInwiKTsKICAgICAgaWYgKCFhcnkuc29tZShmdW5jdGlvbiAoaXRlbSkgewogICAgICAgIHJldHVybiBpdGVtID09PSAicmVxdWlyZWQiOwogICAgICB9KSkgewogICAgICAgIGFyeS5zcGxpY2UoMCwgMCwgInJlcXVpcmVkIik7CiAgICAgICAgdmFsaWRhdGUgPSBhcnkuam9pbigifCIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHZhbGlkYXRlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKICAgICAgdmFsaWRhdGUgPSBPYmplY3QuYXNzaWduKHsKICAgICAgICByZXF1aXJlZDogdHJ1ZQogICAgICB9LCB2YWxpZGF0ZSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAidmFsaWRhdGXkuI3mmK/lhYHorrjnmoTnsbvlnosiOwogICAgfQogICAgcmV0dXJuIHZhbGlkYXRlOwogIH0sCiAgLy8g5qC85byP5YyW5pel5pyfCiAgZm9ybWF0RGF0ZTogZnVuY3Rpb24gZm9ybWF0RGF0ZSh2YWx1ZSkgewogICAgdmFyIGRhdGUgPSBudWxsOwogICAgaWYgKCF2YWx1ZSkgewogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PSBEYXRlICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpKSB7CiAgICAgIGRhdGUgPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gU3RyaW5nIHx8IHZhbHVlLmNvbnN0cnVjdG9yID09IE51bWJlcikgewogICAgICBkYXRlID0gbmV3IERhdGUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIuagvOW8j+WMluaXpeacn+aXtu+8jOS8oOWFpeeahOaVsOaNruagvOW8j+S4jeato+ehruOAgiI7CiAgICB9CiAgICB2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIHZhciBNTSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7CiAgICBNTSA9IE1NIDwgMTAgPyAnMCcgKyBNTSA6IE1NOwogICAgdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKICAgIGQgPSBkIDwgMTAgPyAnMCcgKyBkIDogZDsKICAgIHZhciBoID0gZGF0ZS5nZXRIb3VycygpOwogICAgaCA9IGggPCAxMCA/ICcwJyArIGggOiBoOwogICAgdmFyIG0gPSBkYXRlLmdldE1pbnV0ZXMoKTsKICAgIG0gPSBtIDwgMTAgPyAnMCcgKyBtIDogbTsKICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKCk7CiAgICBzID0gcyA8IDEwID8gJzAnICsgcyA6IHM7CiAgICByZXR1cm4geSArICctJyArIE1NICsgJy0nICsgZCArICcgJyArIGggKyAnOicgKyBtICsgJzonICsgczsKICB9LAogIC8vIOagvOW8j+WMluaXpeacnwogIGZvcm1hdERhdGVZZWFyOiBmdW5jdGlvbiBmb3JtYXREYXRlWWVhcih2YWx1ZSkgewogICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7CiAgICB2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIHZhciBNTSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7CiAgICBNTSA9IE1NIDwgMTAgPyAnMCcgKyBNTSA6IE1NOwogICAgdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKICAgIGQgPSBkIDwgMTAgPyAnMCcgKyBkIDogZDsKICAgIHJldHVybiB5ICsgJy0nICsgTU0gKyAnLScgKyBkOwogIH0sCiAgLy8g5q+U6L6DMuS4quaXpeacnwogIGRheXNCZXR3ZWVuOiBmdW5jdGlvbiBkYXlzQmV0d2VlbihEYXRlT25lLCBEYXRlVHdvLCBub3RTdXBwb3J0RXF1YWxzKSB7CiAgICBpZiAoIURhdGVPbmUgfHwgIURhdGVUd28pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIgZGF0ZTEgPSBuZXcgRGF0ZShEYXRlT25lKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoInl5eXktTU0tZGQiKSArICIgIiArIERhdGVPbmUpLmdldFRpbWUoKTsKICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKERhdGVUd28pLmdldFRpbWUoKSB8fCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmZvcm1hdCgieXl5eS1NTS1kZCIpICsgIiAiICsgRGF0ZVR3bykuZ2V0VGltZSgpOwogICAgaWYgKG5vdFN1cHBvcnRFcXVhbHMpIHsKICAgICAgLy/lpKfkuo7jgIJ2Mj52MSDjgIIKICAgICAgaWYgKGRhdGUyID4gZGF0ZTEpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8v5aSn5LqO562J5LqO44CCdjI+PXYxIOOAguWPquimgXYx5LiN5aSn5LqOdjLljbPlj68KICAgICAgaWYgKGRhdGUxID4gZGF0ZTIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICB9LAogIGRhdGVDYWxjOiBmdW5jdGlvbiBkYXRlQ2FsYyhzdGFydERhdGUsIGVuZERhdGUsIG9wKSB7CiAgICBpZiAoIXN0YXJ0RGF0ZSB8fCAhZW5kRGF0ZSB8fCBzdGFydERhdGUubGVuZ3RoID09IDAgfHwgZW5kRGF0ZS5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChvcC5sZWdlbmQgPT0gMCkgewogICAgICBvcCA9ICJkYXkiOwogICAgfQogICAgdmFyIGRhdGUxID0gbmV3IERhdGUoc3RhcnREYXRlKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoInl5eXktTU0tZGQiKSArICIgIiArIHN0YXJ0RGF0ZSkuZ2V0VGltZSgpOwogICAgdmFyIGRhdGUyID0gbmV3IERhdGUoZW5kRGF0ZSkuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCJ5eXl5LU1NLWRkIikgKyAiICIgKyBlbmREYXRlKS5nZXRUaW1lKCk7CiAgICB2YXIgcmVzID0gMDsKICAgIHZhciBkYXlzID0gZGF0ZTIgLSBkYXRlMTsKICAgIHN3aXRjaCAob3ApIHsKICAgICAgY2FzZSAibW9udGgiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImRheSI6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhvdXIiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjApKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibWludXRlIjoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCkpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAxMDAwKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfSwKICAvLyDlubPpk7rnu5PmnoTovazltYzlpZfnu5PmnoQKICB0aWxlMm5lc3Q6IGZ1bmN0aW9uIHRpbGUybmVzdChhcnJheSwga2V5LCBwS2V5LCBjaGlsZHJlbktleSkgewogICAgaWYgKCFhcnJheSB8fCBhcnJheS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgLy8g5aSN5Yi25LiA5Lu977yM6YG/5YWN5L+u5pS55Y6f5aeL5pWw57uECiAgICB2YXIgYXJ5ID0gX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5KTsKICAgIGtleSA9IGtleSB8fCAiaWQiOwogICAgcEtleSA9IHBLZXkgfHwgInBhcmVudElkIjsKICAgIGNoaWxkcmVuS2V5ID0gY2hpbGRyZW5LZXkgfHwgImNoaWxkcmVuIjsKICAgIC8vIOWumuS5ieS4gOS4quW+heenu+mZpOaVsOe7hAogICAgdmFyIGFyeTJyZW1vdmUgPSBbXTsKICAgIGFyeS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgaWYgKGl0ZW1ba2V5XSAhPT0gaXRlbVtwS2V5XSkgewogICAgICAgIC8vIOaJvueItuiKgueCuQogICAgICAgIHZhciBwID0gYXJ5LmZpbHRlcihmdW5jdGlvbiAoYykgewogICAgICAgICAgcmV0dXJuIGNba2V5XSA9PT0gaXRlbVtwS2V5XTsKICAgICAgICB9KTsKICAgICAgICBpZiAocCAmJiBwLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBwWzBdLmNoaWxkcmVuID0gcFswXS5jaGlsZHJlbiB8fCBbXTsKICAgICAgICAgIC8vIOWwhuWtkOiKgueCueaUvuWIsOeItuiKgueCueS4rQogICAgICAgICAgcFswXS5jaGlsZHJlbi5wdXNoKGl0ZW0pOwogICAgICAgICAgYXJ5MnJlbW92ZS5wdXNoKGl0ZW1ba2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIC8vIOmBjeWOhuenu+mZpOW+heWIoOmZpOWvueixoQogICAgYXJ5MnJlbW92ZS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgYXJ5ID0gYXJ5LmZpbHRlcihmdW5jdGlvbiAoYykgewogICAgICAgIHJldHVybiBjW2tleV0gIT09IGl0ZW07CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gYXJ5OwogIH0sCiAgLy8g5LuO5a+56LGh5Lit6I635Y+W5ZKM6aqM6K+B5a2X5q616Lev5b6ECiAgZ2V0QW5kVmFsaWRQYXRoOiBmdW5jdGlvbiBnZXRBbmRWYWxpZFBhdGgob2JqLCBrZXkpIHsKICAgIGlmICghb2JqIHx8IG9iai5jb25zdHJ1Y3RvciAhPSBPYmplY3QgfHwgIWtleSB8fCBrZXkuY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBwYXRoID0gb2JqW2tleV07CiAgICBpZiAoL15cdysuKlx3KyQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuIHBhdGg7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9LAogIC8vIOiOt+WPllZ1ZeWunuS+i+S4reaMh+WummNsYXNzTmFtZeeahOeItuWunuS+iwogIGdldFBhcmVudEluc3RhbmNlQnlDbGFzc05hbWU6IGZ1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlQnlDbGFzc05hbWUoaW5zdGFuY2UsIGNsYXNzTmFtZSkgewogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICB0aHJvdyAiVnVlQ29tcG9uZW505a6e5L6L5Li656m6LiI7CiAgICB9CiAgICBpZiAoaW5zdGFuY2UuJGVsLmNsYXNzTmFtZSAmJiBpbnN0YW5jZS4kZWwuY2xhc3NOYW1lLmluZGV4T2YoY2xhc3NOYW1lKSA+IC0xKSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuJHJvb3QgJiYgaW5zdGFuY2UuJHJvb3QuX3VpZCA9PSBpbnN0YW5jZS5fdWlkKSB7CiAgICAgIHRocm93ICJcdTY3RTVcdTYyN0VWdWVDb21wb25lbnRcdTVCOUVcdTRGOEJcdTY4MTFcdTY1RjZcdTYyN0VcdTUyMzBcdTY4MzlcdTgyODJcdTcwQjlcdTkwRkRcdTY3MkFcdTYyN0VcdTUyMzBjbGFzc05hbWVcdTRFM0EiLmNvbmNhdChjbGFzc05hbWUsICJcdTc2ODRcdTVCOUVcdTRGOEIuIik7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRwYXJlbnQpIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFBhcmVudEluc3RhbmNlQnlDbGFzc05hbWUoaW5zdGFuY2UuJHBhcmVudCwgY2xhc3NOYW1lKTsKICAgIH0KICB9LAogIC8vIOiOt+WPluaOp+S7tuaJgOWcqOihqOWNleWvueW6lOeahOWunuS+i+WvueixoQogIGdldE9ubGluZUZvcm1JbnN0YW5jZTogZnVuY3Rpb24gZ2V0T25saW5lRm9ybUluc3RhbmNlKGluc3RhbmNlKSB7CiAgICBpZiAoIWluc3RhbmNlKSB7CiAgICAgIHRocm93ICJWdWVDb21wb25lbnTlrp7kvovkuLrnqbouIjsKICAgIH0KICAgIGlmIChpbnN0YW5jZS4kZWwuZ2V0QXR0cmlidXRlICYmIGluc3RhbmNlLiRlbC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gJ29ubGluZS1mb3JtJykgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRyb290ICYmIGluc3RhbmNlLiRyb290Ll91aWQgPT0gaW5zdGFuY2UuX3VpZCkgewogICAgICB0aHJvdyAiXHU2N0U1XHU2MjdFVnVlQ29tcG9uZW50XHU1QjlFXHU0RjhCXHU2ODExXHU2NUY2XHU2MjdFXHU1MjMwXHU2ODM5XHU4MjgyXHU3MEI5XHU5MEZEXHU2NzJBXHU2MjdFXHU1MjMwbmFtZVx1NEUzQW9ubGluZS1mb3JtXHU3Njg0XHU1QjlFXHU0RjhCLiI7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRwYXJlbnQpIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0YW5jZS4kcGFyZW50KTsKICAgIH0KICB9LAogIC8vIOagueaNruiHquWumuS5ieagh+etvuWQjSjnu4Tku7blkI0p6I635Y+W5p+Q5LiqVnVl5a6e5L6LCiAgZ2V0SW5zdGFuY2VCeVRhZzogZnVuY3Rpb24gZ2V0SW5zdGFuY2VCeVRhZyhpbnN0YW5jZSwgYXJncykgewogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICB0aHJvdyAiVnVlQ29tcG9uZW505a6e5L6L5Li656m6LiI7CiAgICB9CiAgICBpZiAoYXJncy5pbmNsdWRlcyhpbnN0YW5jZS4kb3B0aW9ucy5fY29tcG9uZW50VGFnKSkgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRyb290ICYmIGluc3RhbmNlLiRyb290Ll91aWQgPT0gaW5zdGFuY2UuX3VpZCkgewogICAgICB0aHJvdyAiXHU2N0U1XHU2MjdFVnVlQ29tcG9uZW50XHU1QjlFXHU0RjhCXHU2ODExXHU2NUY2XHU2MjdFXHU1MjMwXHU2ODM5XHU4MjgyXHU3MEI5XHU5MEZEXHU2NzJBXHU2MjdFXHU1MjMwbmFtZVx1NEUzQXRhZ1x1NzY4NFx1NUI5RVx1NEY4Qi4iOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRJbnN0YW5jZUJ5VGFnKGluc3RhbmNlLiRwYXJlbnQsIGFyZ3MpOwogICAgfQogIH0sCiAgLy8g6I635Y+WVnVl5a6e5L6L5Y+K54i257qn5a6e5L6L5Lit5pyJcmVsb2Fk5pa55rOV55qE5a6e5L6LCiAgZ2V0UmVsb2FkTWV0aG9kOiBmdW5jdGlvbiBnZXRSZWxvYWRNZXRob2QoaW5zdGFuY2UpIHsKICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoaW5zdGFuY2UucmVsb2FkICYmIGluc3RhbmNlLnJlbG9hZC5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb24pIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcm9vdCAmJiBpbnN0YW5jZS4kcm9vdC5fdWlkID09IGluc3RhbmNlLl91aWQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRwYXJlbnQpIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFJlbG9hZE1ldGhvZChpbnN0YW5jZS4kcGFyZW50KTsKICAgIH0KICB9LAogIC8vIOmHjeaWsOWKoOi9veW9k+WJjemhtemdoijkuI3kvJrliLfmlrDmlbTkuKrpobXpnaLvvIzlj6rliLfmlrByb3V0ZXItdmlld+mDqOWIhikKICByZWxvYWQ6IGZ1bmN0aW9uIHJlbG9hZCgpIHsKICAgIHZhciB2aWV3RWxlbWVudEFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJhcHAtYmFzZS1tYWluIik7CiAgICBpZiAoIXZpZXdFbGVtZW50QXJ5IHx8IHZpZXdFbGVtZW50QXJ5Lmxlbmd0aCAhPSAxKSB7CiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciB2aWV3SW5zdCA9IHZpZXdFbGVtZW50QXJ5WzBdLl9fdnVlX187CiAgICAgIGlmICghdmlld0luc3QgfHwgIXZpZXdJbnN0Ll9pc1Z1ZSkgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgfQogICAgICB2YXIgciA9IHV0aWxzLmdldFJlbG9hZE1ldGhvZCh2aWV3SW5zdCk7CiAgICAgIGlmIChyKSB7CiAgICAgICAgci5yZWxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgIH0KICAgIH0KICB9LAogIC8vIOiOt+WPluWcqOe6v+ihqOWNleeahGpzb27moLzlvI/lrZfnrKbkuLLnmoTooajljZXmlbDmja4odmFsaWRhdGXlj4LmlbDlhrPlrprmmK/lkKbpnIDopoHlr7nooajljZXov5vooYzpqozor4EpCiAgZ2V0T25saW5lRm9ybURhdGE6IGZ1bmN0aW9uIGdldE9ubGluZUZvcm1EYXRhKHZhbGlkYXRlKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgZm9ybUVsZW1lbnRBcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgib25saW5lLWZvcm0iKTsKICAgICAgaWYgKCFmb3JtRWxlbWVudEFyeSB8fCBmb3JtRWxlbWVudEFyeS5sZW5ndGggPCAxKSB7CiAgICAgICAgdmFyIGZybUZyYW1lID0gJCgnI2ZybUZyYW1lJyk7CiAgICAgICAgaWYgKGZybUZyYW1lICYmIGZybUZyYW1lLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhciBmcm0gPSBmcm1GcmFtZVswXTsKICAgICAgICAgIHZhciBpc0NhbGxCYWNrID0gZmFsc2U7CiAgICAgICAgICB2YXIgY2FuY2VsVGltZW91dCA9IGZhbHNlOwogICAgICAgICAgdmFyIGlzVGltZU91dCA9IGZhbHNlOwogICAgICAgICAgLy8g5a2Q6aG16Z2i5piv5ZCm5pS25Yiw5LqG5raI5oGvCiAgICAgICAgICB2YXIgaXNSb2dlciA9IGZhbHNlOwogICAgICAgICAgZnJtLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoInNhdmVEYXRhIiwgJyonKTsKICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGUuZGF0YSAmJiBlLmRhdGEuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7CiAgICAgICAgICAgICAgaWYgKGUuZGF0YS50eXBlID09ICdzYXZlRGF0YScgJiYgIWlzQ2FsbEJhY2spIHsKICAgICAgICAgICAgICAgIGlzQ2FsbEJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKGUuZGF0YS5zdGF0ZSAmJiAhaXNUaW1lT3V0KSB7CiAgICAgICAgICAgICAgICAgIHZhciBpZnJhbWVEYXRhID0gewogICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzS2V5OiBlLmRhdGEuYnVzaW5lc3NLZXksCiAgICAgICAgICAgICAgICAgICAgc3lzQ29kZTogZS5kYXRhLnN5c0NvZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKGUuZGF0YS52YXJzKSB7CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lRGF0YS52YXJzID0gZS5kYXRhLnZhcnM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpZnJhbWVEYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZGF0YS50eXBlID09ICdjYW5jZWxUaW1lb3V0JykgewogICAgICAgICAgICAgICAgY2FuY2VsVGltZW91dCA9IHRydWU7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEudHlwZSA9PSAncm9nZXInICYmICFpc1JvZ2VyKSB7CiAgICAgICAgICAgICAgICBpc1JvZ2VyID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIC8vIOWPquimgeWtkOmhtemdouW8leWFpeS6hmhvdGVudC5oZWxwZXIuanPvvIzniLbpobXpnaLlj5HpgIHkuobmtojmga/lkI7vvIzlrZDpobXpnaLkvJrpqazkuIrlm57lpI1gcm9nZXJg44CCCiAgICAgICAgICAvLyDov5nph4zorr7nva4wLjXnp5LlkI7mnKrmlLbliLBgcm9nZXJg5raI5oGv5YiZ6K6k5Li65a2Q6aG16Z2i5pyq5byV5YWlaG90ZW50LmhlbHBlci5qc++8jOatpOaXtuebtOaOpXJlamVjdOOAggogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghaXNSb2dlcikgewogICAgICAgICAgICAgIHJlamVjdCg2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgNTAwKTsKCiAgICAgICAgICAvLyDorr7nva4xMOenkui2heaXtuacuuWItu+8jOWmguaenOi2heaXtuWImeS4jeWGjeW+gOS4i+aJp+ihjAogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghaXNDYWxsQmFjayAmJiAhY2FuY2VsVGltZW91dCkgewogICAgICAgICAgICAgIGlzVGltZU91dCA9IHRydWU7CiAgICAgICAgICAgICAgcmVqZWN0KDUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxMDAwMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlamVjdCgxKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGZybUluc3QgPSBmb3JtRWxlbWVudEFyeVswXS5fX3Z1ZV9fOwogICAgICAgIGlmICghZnJtSW5zdCB8fCAhZnJtSW5zdC5faXNWdWUpIHsKICAgICAgICAgIHJlamVjdCgyKTsKICAgICAgICB9CiAgICAgICAgLy/lpITnkIZoYW5kc29udGFibGXlrZDooajmlbDmja4KICAgICAgICB2YXIgcmVmcyA9IGZybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcmVmczsKICAgICAgICB2YXIgaG90RGF0YSA9IHRydWU7CiAgICAgICAgaWYgKHJlZnMpIHsKICAgICAgICAgIGZvciAodmFyIHJlZiBpbiByZWZzKSB7CiAgICAgICAgICAgIGlmIChyZWZzLmhhc093blByb3BlcnR5KHJlZikgJiYgcmVmLmluZGV4T2YoJ2hvdHRhYmxlLicpID09IDApIHsKICAgICAgICAgICAgICB2YXIgcmVmRWxlID0gcmVmc1tyZWZdOwogICAgICAgICAgICAgIGhvdERhdGEgPSByZWZFbGUuZ2V0SG90VGFibGVEYXRhKHRydWUpOwogICAgICAgICAgICAgIGlmIChob3REYXRhICYmIEFycmF5LmlzQXJyYXkoaG90RGF0YSkpIHsKICAgICAgICAgICAgICAgIHZhciBuYW1lcyA9IHJlZi5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgaWYgKGhvdERhdGEgJiYgQXJyYXkuaXNBcnJheShob3REYXRhKSkgewogICAgICAgICAgICAgICAgICBmcm1JbnN0LmRhdGFbbmFtZXNbMV1dW25hbWVzWzJdXSA9IF90b0NvbnN1bWFibGVBcnJheShob3REYXRhKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGZybUluc3QuZGF0YVtuYW1lc1sxXV1bbmFtZXNbMl1dID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghdmFsaWRhdGUpIHsKICAgICAgICAgIHJlc29sdmUoSlNPTi5zdHJpbmdpZnkoZnJtSW5zdC5kYXRhKSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZybUluc3QuJHJvb3QuJHZhbGlkYXRvci52YWxpZGF0ZUFsbCgiY3VzdG9tLWZvcm0iKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgIGlmIChob3REYXRhID09PSBmYWxzZSkgewogICAgICAgICAgICAvL2hvdHRhYmxl5a2Q6KGo5pWw5o2u5qCh6aqM5aSx6LSlCiAgICAgICAgICAgIHJlamVjdCg3KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICByZXNvbHZlKEpTT04uc3RyaW5naWZ5KGZybUluc3QuZGF0YSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVqZWN0KHsKICAgICAgICAgICAgICByZWFzb246IDMsCiAgICAgICAgICAgICAgZXJyb3JzOiBmcm1JbnN0LiRyb290LiR2YWxpZGF0b3IuZXJyb3JzLml0ZW1zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICB9LAogIC8vIOiOt+WPluihqOWNleaVsOaNruWksei0peeahOWkhOeQhgogIGhhbmRsZUdldEZvcm1EYXRhUmVqZWN0OiBmdW5jdGlvbiBoYW5kbGVHZXRGb3JtRGF0YVJlamVjdChyZWFzb24sIG5lZWRDb25maXJtKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgZXJyb3JzID0gW107CiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLmNvbnN0cnVjdG9yID09IE9iamVjdCkgewogICAgICAgIGVycm9ycyA9IHJlYXNvbi5lcnJvcnM7CiAgICAgICAgcmVhc29uID0gcmVhc29uLnJlYXNvbjsKICAgICAgfQogICAgICBzd2l0Y2ggKHJlYXNvbikgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoIuacquiOt+WPluWIsOWcqOe6v+ihqOWNleaIluiAhVVSTOihqOWNlS4iKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgTWVzc2FnZS5lcnJvcigi5L2/55So5LqG5Zyo57q/6KGo5Y2V77yM5L2G5piv6KGo5Y2V5Li656m65oiW6ICF5Yqg6L295aSx6LSlLiIpOwogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICB2YXIgZXJyb3JNc2cgPSBbXTsKICAgICAgICAgIGVycm9ycyAmJiBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICB2YXIgZmllbGRMYWJlbCA9ICIiOwogICAgICAgICAgICBpZiAoZS5maWVsZCkgewogICAgICAgICAgICAgIGlmIChlLmZpZWxkLmluZGV4T2YoIi0iKSAhPSAtMSkgewogICAgICAgICAgICAgICAgZmllbGRMYWJlbCA9IGUuZmllbGQuc3Vic3RyKGUuZmllbGQuaW5kZXhPZigiLSIpICsgMSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZpZWxkTGFiZWwgPSBlLmZpZWxkOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvck1zZy5wdXNoKCIiLmNvbmNhdChmaWVsZExhYmVsLCAiICIpLmNvbmNhdChlLm1zZykpOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoZXJyb3JNc2cubGVuZ3RoID4gMCkgewogICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIm9ubGluZS1mb3JtIilbMF0pIHsKICAgICAgICAgICAgICB2YXIgZnJtSW5zdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCJvbmxpbmUtZm9ybSIpWzBdLl9fdnVlX187CiAgICAgICAgICAgICAgdmFyIGpzb25PYmogPSBmcm1JbnN0LiRyZWZzLm9ubGluZUZvcm0uJHJlZnM7CiAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGpzb25PYmopIHsKICAgICAgICAgICAgICAgIGlmIChqc29uT2JqW2tleV0uJGVsLnRleHRDb250ZW50KSB7CiAgICAgICAgICAgICAgICAgIHZhciB0ZXh0Q29udGVudCA9IGpzb25PYmpba2V5XS4kZWwudGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JNc2cubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGV4dENvbnRlbnQuaW5kZXhPZihlcnJvck1zZ1tpXSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoa2V5KVswXS5zdHlsZS5jb2xvciA9ICJyZWQiOwogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHV0aWxzLmhhbmRsZVJlamVjdChlcnJvck1zZyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBNZXNzYWdlLndhcm5pbmcoIuivt+ato+ehrueahOWhq+WGmeihqOWNleWGheWuuS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgTWVzc2FnZS5lcnJvcigiVVJM6KGo5Y2V5aSE55CG5Lia5Yqh5pWw5o2u6LaF5pe2LiIpOwogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6CiAgICAgICAgICBpZiAobmVlZENvbmZpcm0pIHsKICAgICAgICAgICAgTWVzc2FnZUJveC5jb25maXJtKCJVUkzooajljZXpobXpnaLmnKrmraPnoa7lpITnkIbmlbDmja7vvIzmmK/lkKbku43nhLblkK/liqjmtYHnqIvvvJ8iLCB7CiAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OgogICAgICAgICAgLy9ob3R0YWJsZeWtkOihqOaVsOaNruagoemqjOWksei0peOAggogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgTWVzc2FnZS5lcnJvcigiXHU4M0I3XHU1M0Q2XHU4ODY4XHU1MzU1XHU2NTcwXHU2MzZFXHU2NUY2XHU1M0QxXHU3NTFGXHU5ODg0XHU2NzFGXHU0RTRCXHU1OTE2XHU3Njg0XHU1RjAyXHU1RTM4XHVGRjBDcmVhc29uOiIuY29uY2F0KHJlYXNvbikpOwogICAgICAgICAgcmVqZWN0KCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CiAgfSwKICAvL+WFs+mXreaJgOacieagoemqjOmAmuefpQogIGNsb3NlQWxsTm90aWZpY2F0aW9uOiBmdW5jdGlvbiBjbG9zZUFsbE5vdGlmaWNhdGlvbigpIHsKICAgIGNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZyA9IHRydWU7CiAgICBmb3IgKHZhciBrZXkgaW4gbm90aWZpY2F0aW9ucykgewogICAgICBub3RpZmljYXRpb25zW2tleV0uY2xvc2UoKTsKICAgICAgZGVsZXRlIG5vdGlmaWNhdGlvbnNba2V5XTsKICAgIH0KICB9LAogIGhhbmRsZVJlamVjdDogZnVuY3Rpb24gaGFuZGxlUmVqZWN0KGVycm9yTXNnKSB7CiAgICB1dGlscy5jbG9zZUFsbE5vdGlmaWNhdGlvbigpOwogICAgY2xvc2VBbGxOb3RpZmljYXRpb25GbGFnID0gZmFsc2U7CiAgICB2YXIgbm90aWZpID0gTm90aWZpY2F0aW9uLmVycm9yKHsKICAgICAgdGl0bGU6ICLplJnor6/mj5DnpLoiLAogICAgICBkYW5nZXJvdXNseVVzZUhUTUxTdHJpbmc6IHRydWUsCiAgICAgIG1lc3NhZ2U6ICJcdThCRjdcdTZCNjNcdTc4NkVcdTc2ODRcdTU4NkJcdTUxOTlcdTRFRTVcdTRFMEJcdTg4NjhcdTUzNTVcdTUxODVcdTVCQjlcdUZGMUE8YnIvPiIuY29uY2F0KGVycm9yTXNnLmpvaW4oJzxici8+JykpLAogICAgICBkdXJhdGlvbjogMCwKICAgICAgb25DbG9zZTogZnVuY3Rpb24gb25DbG9zZSgpIHsKICAgICAgICBpZiAoIWNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZykgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBuID0gTm90aWZpY2F0aW9uLndhcm5pbmcoewogICAgICAgICAgICAgIGN1c3RvbUNsYXNzOiAiY3VzdG9tQ2xhc3MiLAogICAgICAgICAgICAgIGR1cmF0aW9uOiAwLAogICAgICAgICAgICAgIHNob3dDbG9zZTogZmFsc2UsCiAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHsKICAgICAgICAgICAgICAgIG4uY2xvc2UoKTsKICAgICAgICAgICAgICAgIHV0aWxzLmhhbmRsZVJlamVjdChlcnJvck1zZyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbm90aWZpY2F0aW9uc1tuLmlkXSA9IG47CiAgICAgICAgICB9LCAxMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIG5vdGlmaWNhdGlvbnNbbm90aWZpLmlkXSA9IG5vdGlmaTsKICB9LAogIC8vIOiOt+WPluaMh+WummRvbeWFg+e0oOeahOeItue6p+S4reWFt+acieaMh+WumuWxnuaAp+eahGRvbeWFg+e0oAogIGdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZTogZnVuY3Rpb24gZ2V0UGFyZW50RWxlbWVudEJ5QXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUpIHsKICAgIGlmICghZWwgfHwgIWVsLmhhc0F0dHJpYnV0ZSB8fCBlbC5oYXNBdHRyaWJ1dGUuY29uc3RydWN0b3IgIT09IEZ1bmN0aW9uKSB7CiAgICAgIHRocm93ICLkvKDlhaXnmoTlhYPntKBlbOS4jeiDveS4uuepuuS4lOW/hemhu+S4ukhUTUxIdG1sRWxlbWVudOexu+Weiy4iOwogICAgfQogICAgaWYgKCFhdHRyaWJ1dGUgfHwgYXR0cmlidXRlLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpIHsKICAgICAgdGhyb3cgIuS8oOWFpeeahOWxnuaAp2F0dHJpYnV0ZeS4jeiDveS4uuepuuS4lOW/hemhu+S4ulN0cmluZ+exu+Weiy4iOwogICAgfQogICAgaWYgKGVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgIHJldHVybiBlbDsKICAgIH0gZWxzZSBpZiAoZWwudGFnTmFtZSA9PT0gJ0hUTUwnKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbC5wYXJlbnRFbGVtZW50LCBhdHRyaWJ1dGUpOwogICAgfQogIH0sCiAgLy8g5LuO54i257qnZG9t5YWD57Sg5Lit6I635Y+W5oyH5a6a5bGe5oCn55qE5YC8CiAgZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50OiBmdW5jdGlvbiBnZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoZWwsIGF0dHJpYnV0ZSkgewogICAgdmFyIHBFbCA9IHV0aWxzLmdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKTsKICAgIGlmIChwRWwgJiYgcEVsLmdldEF0dHJpYnV0ZSAmJiBwRWwuZ2V0QXR0cmlidXRlLmNvbnN0cnVjdG9yID09PSBGdW5jdGlvbikgewogICAgICByZXR1cm4gcEVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSwKICAvLyDpgJrov4fot6/lvoTlj5blvpflr7nosaHkuK3nmoTlsZ7mgKcKICBnZXRWYWx1ZUJ5UGF0aDogZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgob2JqLCBwYXRoLCBzdWJJbmRleCkgewogICAgaWYgKCFvYmogfHwgIXBhdGggfHwgcGF0aC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIS9eXHc/LipbXHd8XF1dJC8udGVzdChwYXRoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBwYXRoQXJ5ID0gcGF0aC5zcGxpdCgiLiIpOwogICAgaWYgKHBhdGhBcnkubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIG9ialtwYXRoXTsKICAgIH0gZWxzZSBpZiAocGF0aEFyeS5sZW5ndGggPiAxKSB7CiAgICAgIHZhciByZXQgPSBvYmo7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyeS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBrZXkgPSBwYXRoQXJ5W2ldOwogICAgICAgIHZhciBtYXRjaCA9IC9eKFx3KylcWyhcZCspXF0kLy5leGVjKGtleSk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICByZXQgPSByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXTsKICAgICAgICB9IGVsc2UgaWYgKHJldCAmJiByZXQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgICAgaWYgKHN1YkluZGV4ICE9IG51bGwgJiYgc3ViSW5kZXggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHZhciBwcmVJbmRleCA9IE51bWJlci5wYXJzZUludChzdWJJbmRleCk7CiAgICAgICAgICAgIGlmICghaXNOYU4ocHJlSW5kZXgpKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0ID0gcmV0W2luZGV4XVtrZXldOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSByZXRba2V5XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgLy8g6YCa6L+H6Lev5b6E6K6+572u5a+56LGh5Lit55qE5bGe5oCnCiAgc2V0VmFsdWVCeVBhdGg6IGZ1bmN0aW9uIHNldFZhbHVlQnlQYXRoKG9iaiwgcGF0aCwgdmFsdWUsIHN1YkluZGV4KSB7CiAgICBpZiAoIW9iaiB8fCAhcGF0aCB8fCBwYXRoLmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIS9eXHc/LipbXHd8XF1dJC8udGVzdChwYXRoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgcGF0aEFyeSA9IHBhdGguc3BsaXQoIi4iKTsKICAgIGlmIChwYXRoQXJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgIG9ialtwYXRoXSA9IHZhbHVlOwogICAgfSBlbHNlIGlmIChwYXRoQXJ5Lmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHJldCA9IG9iajsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGtleSA9IHBhdGhBcnlbaV07CiAgICAgICAgdmFyIG1hdGNoID0gL14oXHcrKVxbKFxkKylcXSQvLmV4ZWMoa2V5KTsKICAgICAgICBpZiAoaSA9PSBwYXRoQXJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXSA9IHZhbHVlOwogICAgICAgICAgfSBlbHNlIGlmIChyZXQgJiYgcmV0LmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgICAgICBpZiAoc3ViSW5kZXggIT0gbnVsbCAmJiBzdWJJbmRleCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICB2YXIgcHJlSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoc3ViSW5kZXgpOwogICAgICAgICAgICAgIGlmICghaXNOYU4ocHJlSW5kZXgpKSB7CiAgICAgICAgICAgICAgICBpbmRleCA9IHByZUluZGV4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmouJHNldChyZXRbaW5kZXhdLCBrZXksIHZhbHVlKTsKICAgICAgICAgICAgLy9yZXRbaW5kZXhdW2tleV0gPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vcmV0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgb2JqLiRzZXQocmV0LCBrZXksIHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldCA9IHJldFttYXRjaFsxXV1bbWF0Y2hbMl1dOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0ID0gcmV0W2tleV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBvYmouJGZvcmNlVXBkYXRlKCk7CiAgfSwKICAvKioNCiAgICog5bCG5a2X56ym5Liy6L2s5Li6anNvbuWvueixoeOAgg0KICAgKiBAcGFyYW0ganNvblN0cg0KICAgKiBAcGFyYW0gdHlwZSAg5Y+v5LiN5aGr5YaZcGFyc2VUb0pzb24NCiAgICogQHJldHVybnMNCiAgICovCiAgcGFyc2VUb0pzb246IGZ1bmN0aW9uIHBhcnNlVG9Kc29uKGpzb25TdHIsIHR5cGUpIHsKICAgIHR5cGUgPSB0eXBlIHx8IDE7CiAgICBpZiAoIWpzb25TdHIgfHwganNvblN0ciA9PT0gIiIpIHJldHVybjsKICAgIC8v5aaC5p6c5YyF5ZCr5o2i6KGM77yM5LiL6Z2i6Kej5p6QanNvbuS8muaKpemUme+8jOaJgOS7peWwhuaNouihjOabv+aNouS4ujLkuKrnqbrmoLznrKYKICAgIGpzb25TdHIgPSBqc29uU3RyLnJlcGxhY2UoL1xuL2csICIgICIpOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgcmV0dXJuIGV2YWwoIigiICsganNvblN0ciArICIpIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICBKU09OLnBhcnNlKGpzb25TdHIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93ICLop6PmnpBqc29u5a+56LGh6ZSZ6K+vIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiB1dGlscy5wYXJzZVRvSnNvbihqc29uU3RyLCB0eXBlICsgMSk7CiAgICB9CiAgfSwKICAvKioNCiAgICog5bCG5pWw5a2X6L2s5o2i5oiQ5Lq65ZCN5biB5aSn5YaZ44CCDQogICAqDQogICAqIEBwYXJhbSBjdXJyZW5jeURpZ2l0cw0KICAgKiBAcmV0dXJucw0KICAgKi8KICBjb252ZXJ0Q3VycmVuY3k6IGZ1bmN0aW9uIGNvbnZlcnRDdXJyZW5jeShjdXJyZW5jeURpZ2l0cykgewogICAgdmFyIE1BWElNVU1fTlVNQkVSID0gOTk5OTk5OTk5OTkuOTk7CiAgICB2YXIgQ05fWkVSTyA9ICLpm7YiOwogICAgdmFyIENOX09ORSA9ICLlo7kiOwogICAgdmFyIENOX1RXTyA9ICLotLAiOwogICAgdmFyIENOX1RIUkVFID0gIuWPgSI7CiAgICB2YXIgQ05fRk9VUiA9ICLogoYiOwogICAgdmFyIENOX0ZJVkUgPSAi5LyNIjsKICAgIHZhciBDTl9TSVggPSAi6ZmGIjsKICAgIHZhciBDTl9TRVZFTiA9ICLmn5IiOwogICAgdmFyIENOX0VJR0hUID0gIuaNjCI7CiAgICB2YXIgQ05fTklORSA9ICLnjpYiOwogICAgdmFyIENOX1RFTiA9ICLmi74iOwogICAgdmFyIENOX0hVTkRSRUQgPSAi5L2wIjsKICAgIHZhciBDTl9USE9VU0FORCA9ICLku58iOwogICAgdmFyIENOX1RFTl9USE9VU0FORCA9ICLkuIciOwogICAgdmFyIENOX0hVTkRSRURfTUlMTElPTiA9ICLkur8iOwogICAgdmFyIENOX1NZTUJPTCA9ICIiOwogICAgdmFyIENOX0RPTExBUiA9ICLlhYMiOwogICAgdmFyIENOX1RFTl9DRU5UID0gIuinkiI7CiAgICB2YXIgQ05fQ0VOVCA9ICLliIYiOwogICAgdmFyIENOX0lOVEVHRVIgPSAi5pW0IjsKICAgIHZhciBpbnRlZ3JhbDsKICAgIHZhciBkZWNpbWFsOwogICAgdmFyIG91dHB1dENoYXJhY3RlcnM7CiAgICB2YXIgcGFydHM7CiAgICB2YXIgZGlnaXRzLCByYWRpY2VzLCBiaWdSYWRpY2VzLCBkZWNpbWFsczsKICAgIHZhciB6ZXJvQ291bnQ7CiAgICB2YXIgaSwgcCwgZDsKICAgIHZhciBxdW90aWVudCwgbW9kdWx1czsKICAgIGN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHMudG9TdHJpbmcoKTsKICAgIGlmIChjdXJyZW5jeURpZ2l0cyA9PSAiIikgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoY3VycmVuY3lEaWdpdHMubWF0Y2goL1teLC5cZF0vKSAhPSBudWxsKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmIChjdXJyZW5jeURpZ2l0cy5tYXRjaCgvXigoXGR7MSwzfSgsXGR7M30pKiguKChcZHszfSwpKlxkezEsM30pKT8pfChcZCsoLlxkKyk/KSkkLykgPT0gbnVsbCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBjdXJyZW5jeURpZ2l0cyA9IGN1cnJlbmN5RGlnaXRzLnJlcGxhY2UoLywvZywgIiIpOwogICAgY3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0cy5yZXBsYWNlKC9eMCsvLCAiIik7CiAgICBpZiAoTnVtYmVyKGN1cnJlbmN5RGlnaXRzKSA+IE1BWElNVU1fTlVNQkVSKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIHBhcnRzID0gY3VycmVuY3lEaWdpdHMuc3BsaXQoIi4iKTsKICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CiAgICAgIGludGVncmFsID0gcGFydHNbMF07CiAgICAgIGRlY2ltYWwgPSBwYXJ0c1sxXTsKICAgICAgZGVjaW1hbCA9IGRlY2ltYWwuc3Vic3RyKDAsIDIpOwogICAgfSBlbHNlIHsKICAgICAgaW50ZWdyYWwgPSBwYXJ0c1swXTsKICAgICAgZGVjaW1hbCA9ICIiOwogICAgfQogICAgZGlnaXRzID0gbmV3IEFycmF5KENOX1pFUk8sIENOX09ORSwgQ05fVFdPLCBDTl9USFJFRSwgQ05fRk9VUiwgQ05fRklWRSwgQ05fU0lYLCBDTl9TRVZFTiwgQ05fRUlHSFQsIENOX05JTkUpOwogICAgcmFkaWNlcyA9IG5ldyBBcnJheSgiIiwgQ05fVEVOLCBDTl9IVU5EUkVELCBDTl9USE9VU0FORCk7CiAgICBiaWdSYWRpY2VzID0gbmV3IEFycmF5KCIiLCBDTl9URU5fVEhPVVNBTkQsIENOX0hVTkRSRURfTUlMTElPTik7CiAgICBkZWNpbWFscyA9IG5ldyBBcnJheShDTl9URU5fQ0VOVCwgQ05fQ0VOVCk7CiAgICBvdXRwdXRDaGFyYWN0ZXJzID0gIiI7CiAgICBpZiAoTnVtYmVyKGludGVncmFsKSA+IDApIHsKICAgICAgemVyb0NvdW50ID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IGludGVncmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcCA9IGludGVncmFsLmxlbmd0aCAtIGkgLSAxOwogICAgICAgIGQgPSBpbnRlZ3JhbC5zdWJzdHIoaSwgMSk7CiAgICAgICAgcXVvdGllbnQgPSBwIC8gNDsKICAgICAgICBtb2R1bHVzID0gcCAlIDQ7CiAgICAgICAgaWYgKGQgPT0gIjAiKSB7CiAgICAgICAgICB6ZXJvQ291bnQrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHplcm9Db3VudCA+IDApIHsKICAgICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbMF07CiAgICAgICAgICB9CiAgICAgICAgICB6ZXJvQ291bnQgPSAwOwogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbTnVtYmVyKGQpXSArIHJhZGljZXNbbW9kdWx1c107CiAgICAgICAgfQogICAgICAgIGlmIChtb2R1bHVzID09IDAgJiYgemVyb0NvdW50IDwgNCkgewogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBiaWdSYWRpY2VzW3F1b3RpZW50XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBDTl9ET0xMQVI7CiAgICB9CiAgICBpZiAoZGVjaW1hbCAhPSAiIikgewogICAgICBmb3IgKGkgPSAwOyBpIDwgZGVjaW1hbC5sZW5ndGg7IGkrKykgewogICAgICAgIGQgPSBkZWNpbWFsLnN1YnN0cihpLCAxKTsKICAgICAgICBpZiAoZCAhPSAiMCIpIHsKICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gZGlnaXRzW051bWJlcihkKV0gKyBkZWNpbWFsc1tpXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChvdXRwdXRDaGFyYWN0ZXJzID09ICIiKSB7CiAgICAgIG91dHB1dENoYXJhY3RlcnMgPSBDTl9aRVJPICsgQ05fRE9MTEFSOwogICAgfQogICAgaWYgKGRlY2ltYWwgPT0gIiIpIHsKICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBDTl9JTlRFR0VSOwogICAgfQogICAgb3V0cHV0Q2hhcmFjdGVycyA9IENOX1NZTUJPTCArIG91dHB1dENoYXJhY3RlcnM7CiAgICByZXR1cm4gb3V0cHV0Q2hhcmFjdGVyczsKICB9LAogIC8qKg0KICAgKiDmlbDlrZfmoLzlvI/ovazmjaLmiJDljYPliIbkvY0NCiAgICpAcGFyYW17T2JqZWN0fW51bQ0KICAgKi8KICB0aG91c2FuZEJpdDogZnVuY3Rpb24gdGhvdXNhbmRCaXQobnVtKSB7CiAgICBpZiAoKG51bSArICIiKS50cmltKCkgPT0gIiIpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgaWYgKGlzTmFOKG51bSkpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgbnVtID0gbnVtICsgIiI7CiAgICBpZiAoL14uKlwuLiokLy50ZXN0KG51bSkpIHsKICAgICAgdmFyIHBvaW50SW5kZXggPSBudW0ubGFzdEluZGV4T2YoIi4iKTsKICAgICAgdmFyIGludFBhcnQgPSBudW0uc3Vic3RyaW5nKDAsIHBvaW50SW5kZXgpOwogICAgICB2YXIgcG9pbnRQYXJ0ID0gbnVtLnN1YnN0cmluZyhwb2ludEluZGV4ICsgMSwgbnVtLmxlbmd0aCk7CiAgICAgIHZhciBpbnRQYXJ0ID0gaW50UGFydCArICIiOwogICAgICB2YXIgcmUgPSAvKC0/XGQrKShcZHszfSkvOwogICAgICB3aGlsZSAocmUudGVzdChpbnRQYXJ0KSkgewogICAgICAgIGludFBhcnQgPSBpbnRQYXJ0LnJlcGxhY2UocmUsICIkMSwkMiIpOwogICAgICB9CiAgICAgIG51bSA9IGludFBhcnQgKyAiLiIgKyBwb2ludFBhcnQ7CiAgICB9IGVsc2UgewogICAgICBudW0gPSBudW0gKyAiIjsKICAgICAgdmFyIHJlID0gLygtP1xkKykoXGR7M30pLzsKICAgICAgd2hpbGUgKHJlLnRlc3QobnVtKSkgewogICAgICAgIG51bSA9IG51bS5yZXBsYWNlKHJlLCAiJDEsJDIiKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bTsKICB9LAogIC8qKg0KICAgKiDpgJrov4duYW1l6I635Y+W6aG16Z2idXJs5Zyw5Z2A5Y+C5pWwDQogICAqIEBwYXJhbSBuYW1lDQogICAqIEByZXR1cm5zDQogICAqDQogICAqLwogIGdldFVybEtleTogZnVuY3Rpb24gZ2V0VXJsS2V5KG5hbWUpIHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoKG5ldyBSZWdFeHAoJ1s/fCZdJyArIG5hbWUgKyAnPScgKyAnKFteJjtdKz8pKCZ8I3w7fCQpJykuZXhlYyhsb2NhdGlvbi5ocmVmKSB8fCBbLCAiIl0pWzFdLnJlcGxhY2UoL1wrL2csICclMjAnKSkgfHwgbnVsbDsKICB9LAogIC8v6YCJ5oup5Zmo5LiK5LiL56e7CiAgZG93bjogZnVuY3Rpb24gZG93bihhcnksIHNlbGVjdEFyciwgdGhpc18pIHsKICAgIGlmIChhcnkubGVuZ3RoID4gMCAmJiBzZWxlY3RBcnIubGVuZ3RoID4gMCkgewogICAgICB2YXIgaWR4ID0gc2VsZWN0QXJyLmluZGV4T2YoYXJ5W2FyeS5sZW5ndGggLSAxXSk7CiAgICAgIGlmIChpZHggKyAxIDwgc2VsZWN0QXJyLmxlbmd0aCkgewogICAgICAgIHZhciB0ID0gc2VsZWN0QXJyW2lkeCArIDFdOwogICAgICAgIHNlbGVjdEFycltpZHggKyAxXSA9IHNlbGVjdEFycltpZHhdOwogICAgICAgIHNlbGVjdEFycltpZHhdID0gdDsKICAgICAgICB0aGlzXy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgICAgdGhpc18uc3luY0lucHV0VmFsdWUoKTsKICAgICAgfQogICAgfQogIH0sCiAgdXA6IGZ1bmN0aW9uIHVwKGFyeSwgc2VsZWN0QXJyLCB0aGlzXykgewogICAgaWYgKGFyeS5sZW5ndGggPiAwICYmIHNlbGVjdEFyci5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBpZHggPSBzZWxlY3RBcnIuaW5kZXhPZihhcnlbYXJ5Lmxlbmd0aCAtIDFdKTsKICAgICAgaWYgKGlkeCAhPSAwKSB7CiAgICAgICAgdmFyIHQgPSBzZWxlY3RBcnJbaWR4IC0gMV07CiAgICAgICAgc2VsZWN0QXJyW2lkeCAtIDFdID0gc2VsZWN0QXJyW2lkeF07CiAgICAgICAgc2VsZWN0QXJyW2lkeF0gPSB0OwogICAgICAgIHRoaXNfLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgICB0aGlzXy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgICB9CiAgICB9CiAgfSwKICBBcnJheTogewogICAgLy/kuIrnp7vmjInpkq4KICAgIHVwOiBmdW5jdGlvbiB1cChpZHgsIGxpc3QpIHsKICAgICAgaWR4ID0gcGFyc2VJbnQoaWR4KTsKICAgICAgaWYgKGlkeCA8IDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHQgPSBsaXN0W2lkeCAtIDFdOwogICAgICBsaXN0W2lkeCAtIDFdID0gbGlzdFtpZHhdOwogICAgICBsaXN0W2lkeF0gPSB0OwogICAgfSwKICAgIC8v5LiL56e75oyJ6ZKuCiAgICBkb3duOiBmdW5jdGlvbiBkb3duKGlkeCwgbGlzdCkgewogICAgICBpZHggPSBwYXJzZUludChpZHgpOwogICAgICBpZiAoaWR4ID49IGxpc3QubGVuZ3RoIC0gMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgdCA9IGxpc3RbaWR4ICsgMV07CiAgICAgIGxpc3RbaWR4ICsgMV0gPSBsaXN0W2lkeF07CiAgICAgIGxpc3RbaWR4XSA9IHQ7CiAgICB9LAogICAgcmVzdW1lU246IGZ1bmN0aW9uIHJlc3VtZVNuKGxpc3QpIHsKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBsaXN0Lmxlbmd0aDsgaysrKSB7CiAgICAgICAgbGlzdFtrXS5zbiA9IGs7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9LAogICAgLyoqDQogICAgICogaWR4IOWOn+S9jee9rg0KICAgICAqIG51bSDnm67moIfkvY3nva4NCiAgICAgKiBsaXN0IOaVsOe7hA0KICAgICAqLwogICAgbW92ZVRvTnVtOiBmdW5jdGlvbiBtb3ZlVG9OdW0oaWR4LCB0YXJnZXQsIGxpc3QpIHsKICAgICAgaWYgKHRhcmdldCA9PSAtMSkgewogICAgICAgIHRhcmdldCA9IDA7CiAgICAgIH0gZWxzZSBpZiAoaWR4ID49IHRhcmdldCkgewogICAgICAgIHRhcmdldCA9IHRhcmdldCArIDE7CiAgICAgIH0KICAgICAgdmFyIHQgPSBsaXN0LnNwbGljZShpZHgsIDEpOwogICAgICBsaXN0Lmluc2VydCh0YXJnZXQsIHRbMF0pOwogICAgICB0aGlzLnJlc3VtZVNuKGxpc3QpOwogICAgfSwKICAgIC8v5Yig6Zmk5oyJ6ZKuCiAgICBkZWw6IGZ1bmN0aW9uIGRlbChpZHgsIGxpc3QpIHsKICAgICAgbGlzdC5zcGxpY2UoaWR4LCAxKTsKICAgIH0sCiAgICAvL+aJvuWIsOaMh+WumuWFg+e0oOeahOacquefpQogICAgaWR4T2Y6IGZ1bmN0aW9uIGlkeE9mKHZhbCwgbGlzdCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAobGlzdFtpXSA9PSB2YWwpIHJldHVybiBpOwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0sCiAgICAvL+WIoOmZpOaMh+WumuWFg+e0oAogICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUodmFsLCBsaXN0KSB7CiAgICAgIHZhciBpZHggPSB0aGlzLmlkeE9mKHZhbCwgbGlzdCk7CiAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgIGxpc3Quc3BsaWNlKGlkeCwgMSk7CiAgICAgIH0KICAgIH0sCiAgICAvL+e9rumhtgogICAgdG9wOiBmdW5jdGlvbiB0b3AoaWR4LCBsaXN0KSB7CiAgICAgIGlmIChpZHggPj0gbGlzdC5sZW5ndGggfHwgaWR4IDwgMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvL+mAkOS4quS6pOaNogogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkeDsgaSsrKSB7CiAgICAgICAgdmFyIHRlbXAgPSBsaXN0W2ldOwogICAgICAgIGxpc3RbaV0gPSBsaXN0W2lkeF07CiAgICAgICAgbGlzdFtpZHhdID0gdGVtcDsKICAgICAgfQogICAgfSwKICAgIC8v572u5bqVCiAgICBib3R0b206IGZ1bmN0aW9uIGJvdHRvbShpZHgsIGxpc3QpIHsKICAgICAgaWYgKGlkeCA+PSBsaXN0Lmxlbmd0aCAtIDEgfHwgaWR4IDwgMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvL+mAkOS4quS6pOaNogogICAgICBmb3IgKHZhciBpID0gbGlzdC5sZW5ndGggLSAxOyBpID4gaWR4OyBpLS0pIHsKICAgICAgICB2YXIgdGVtcCA9IGxpc3RbaV07CiAgICAgICAgbGlzdFtpXSA9IGxpc3RbaWR4XTsKICAgICAgICBsaXN0W2lkeF0gPSB0ZW1wOwogICAgICB9CiAgICB9CiAgfSwKICAvKioNCiAgICog5a+56LGh6L2sdXJs5Y+C5pWwDQogICAqIEBwYXJhbSB7Kn0gZGF0YQ0KICAgKiBAcGFyYW0geyp9IGlzUHJlZml4DQogICAqLwogIHF1ZXJ5UGFyYW1zOiBmdW5jdGlvbiBxdWVyeVBhcmFtcyhkYXRhKSB7CiAgICB2YXIgaXNQcmVmaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOwogICAgdmFyIHByZWZpeCA9IGlzUHJlZml4ID8gJz8nIDogJyc7CiAgICB2YXIgX3Jlc3VsdCA9IFtdOwogICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aoa2V5KSB7CiAgICAgIHZhciB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgLy8g5Y675o6J5Li656m655qE5Y+C5pWwCiAgICAgIGlmIChbJycsIHVuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXModmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIDE7IC8vIGNvbnRpbnVlCiAgICAgIH0KICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKF92YWx1ZSkgewogICAgICAgICAgX3Jlc3VsdC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJ1tdPScgKyBlbmNvZGVVUklDb21wb25lbnQoX3ZhbHVlKSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3Jlc3VsdC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7CiAgICAgIH0KICAgIH07CiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICBpZiAoX2xvb3Aoa2V5KSkgY29udGludWU7CiAgICB9CiAgICByZXR1cm4gX3Jlc3VsdC5sZW5ndGggPyBwcmVmaXggKyBfcmVzdWx0LmpvaW4oJyYnKSA6ICcnOwogIH0sCiAgTWVudTogewogICAgYWRkU3ViTWVudXM6IGZ1bmN0aW9uIGFkZFN1Yk1lbnVzKHRoYXQsIGNoaWxkcmVuKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgLy8JCQkJCWlmKCFwYXJlbnQuY2hpbGRyZW4pewogICAgICAgIC8vCQkJCQkJcGFyZW50LmNoaWxkcmVuID0gW3twYXRoOicvJywgcmVkaXJlY3Q6Y2hpbGRyZW5bMF0ubWVudVVybH1dOwogICAgICAgIC8vCQkJCQl9CiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgICAgICAgLy9jb25zdCByb3V0ZSA9IHtwYXRoOiBtLm1lbnVVcmwsIG5hbWU6IG0uYWxpYXMsICBjb21wb25lbnQ6IHJlc29sdmUgPT4gcmVxdWlyZShbYEAvJHttLnRlbXBsYXRlVXJsfWBdLCByZXNvbHZlICl9OwogICAgICAgICAgLy9wYXJlbnQuY2hpbGRyZW4ucHVzaChyb3V0ZSk7CiAgICAgICAgICBpZiAobS5jaGlsZHJlbiAmJiBtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpc18uYWRkU3ViTWVudXModGhhdCwgbS5jaGlsZHJlbik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBhZGRUb1JvdXRlcjogZnVuY3Rpb24gYWRkVG9Sb3V0ZXIodGhhdCwgcm91dGUpIHsKICAgICAgdmFyIHJvdXRlcyA9IHRoYXQuJHJvdXRlci5vcHRpb25zLnJvdXRlczsKICAgICAgdmFyIGlzSW4gPSBmYWxzZTsKICAgICAgcm91dGVzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICBpZiAoci5wYXRoID09IHJvdXRlLnBhdGgpIHsKICAgICAgICAgIGlzSW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmICghaXNJbikgewogICAgICAgIHRoYXQuJHJvdXRlci5vcHRpb25zLnJvdXRlcy5wdXNoKHJvdXRlKTsKICAgICAgICB0aGF0LiRyb3V0ZXIuYWRkUm91dGVzKFtyb3V0ZV0pOwogICAgICB9CiAgICB9LAogICAgYWRkU3luY01lbnVzOiBmdW5jdGlvbiBhZGRTeW5jTWVudXModGhhdCwgbWVudXMpIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgIGlmIChtZW51cyAmJiBtZW51cy5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgJiYgbWVudXMubGVuZ3RoID4gMCkgewogICAgICAgIC8vIOabtOaWsOW9k+WJjemAieS4reeahOiPnOWNlQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGN1clJvdXRlUGF0aCA9IHRoYXQuJHJvdXRlLnBhdGg7CiAgICAgICAgICBtZW51cy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgICAgICAgIC8v5bCG5Yqo5oCB6I+c5Y2V5re75Yqg5Yiw6Lev55SxCiAgICAgICAgICAgIGlmIChtLmNvZGUgIT0gJ2hvbWUnICYmIG0uY29kZSAhPSAnc3RhdGVtZW50JyAmJiB0aGF0Lm1lbnVNYXBzW20uY29kZV0pIHsKICAgICAgICAgICAgICAvL2NvbnN0IHJvdXRlID0ge3BhdGg6IG0ucGF0aCwgIGNvbXBvbmVudDogcmVzb2x2ZSA9PiByZXF1aXJlKFtgQC8ke20udGVtcGxhdGVVcmx9YF0sIHJlc29sdmUgKX07CiAgICAgICAgICAgICAgLy/mt7vliqDot6/nlLHkv6Hmga8KICAgICAgICAgICAgICBpZiAodGhhdC5tZW51TWFwc1ttLmNvZGVdICYmIHRoYXQubWVudU1hcHNbbS5jb2RlXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBfdGhpczIuYWRkU3ViTWVudXModGhhdCwgdGhhdC5tZW51TWFwc1ttLmNvZGVdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy90aGlzLmFkZFRvUm91dGVyKHRoYXQscm91dGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwID0gbmV3IFJlZ0V4cCgiXi8iLmNvbmNhdChtLmFsaWFzLCAiLy4qJCIpKTsKICAgICAgICAgICAgaWYgKHAudGVzdChjdXJSb3V0ZVBhdGgpKSB7CiAgICAgICAgICAgICAgdGhhdC5hY3RpdmVNZW51SW5kZXggPSBtLmFsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9LCAxMDApOwogICAgICB9CiAgICB9CiAgfQp9OwoKLy8g5Zyo5pWw57uE5LiK5omp5bGV5LiA5Liq5Yig6Zmk5oyH5a6a6aG555qE5pa55rOVCkFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSkgewogIHRoaXMuc3BsaWNlKHRoaXMuZmluZEluZGV4KGZ1bmN0aW9uICh2KSB7CiAgICByZXR1cm4gdiA9PT0gaXRlbTsKICB9KSwgMSk7Cn07CgovLyDlnKjmlbDnu4TkuIrmianlsZXkuIDkuKrljrvph43nmoTmlrnms5UKQXJyYXkucHJvdG90eXBlLnVuaXF1ZSA9IGZ1bmN0aW9uIChhcmcpIHsKICB2YXIgcmVzID0gbmV3IE1hcCgpOwogIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAobSkgewogICAgaWYgKGFyZykgewogICAgICByZXR1cm4gIXJlcy5oYXMobVthcmddKSAmJiByZXMuc2V0KG1bYXJnXSwgMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gIXJlcy5oYXMobSkgJiYgcmVzLnNldChtLCAxKTsKICAgIH0KICB9KTsKfTsKZXhwb3J0IGRlZmF1bHQgdXRpbHM7"},null]}