{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\dataShare-fvue\\src\\utils.js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\utils.js","mtime":1733825817797},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"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\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5qb2luLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IubWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3Iuc29tZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubWFwLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuc3RpY2t5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIjsKaW1wb3J0IHsgTWVzc2FnZSwgTWVzc2FnZUJveCwgTm90aWZpY2F0aW9uIH0gZnJvbSAnZWxlbWVudC11aSc7CnZhciBjbG9zZUFsbE5vdGlmaWNhdGlvbkZsYWcgPSBmYWxzZTsgLy/mmK/lkKbpmpDol4/mhJ/lj7nlj7fmoKHpqozmj5DnpLoKdmFyIG5vdGlmaWNhdGlvbnMgPSB7fTsgLy/nlKjmnaXojrflj5blvLnnqpfnmoTlrp7kvovvvIzku6Xlr7nlr7nlupTlvLnnqpfov5vooYzmk43kvZwKdmFyIHV0aWxzID0gewogIC8qKg0KICAgKiDpmo/mnLrnlJ/miJBpZA0KICAgKi8KICB1dWlkOiBmdW5jdGlvbiB1dWlkKCkgewogICAgdmFyIGhhc0h5cGhlbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7CiAgICByZXR1cm4gKGhhc0h5cGhlbiA/ICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnIDogJ3h4eHh4eHh4eHh4eDR4eHh5eHh4eHh4eHh4eHh4eHh4JykucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykgewogICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDA7CiAgICAgIHZhciB2ID0gYyA9PSAneCcgPyByIDogciAmIDB4MyB8IDB4ODsKICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpOwogICAgfSk7CiAgfSwKICBmaW5kQ29tcG9uZW50VXB3YXJkOiBmdW5jdGlvbiBmaW5kQ29tcG9uZW50VXB3YXJkKGNvbnRleHQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzKSB7CiAgICBpZiAodHlwZW9mIGNvbXBvbmVudE5hbWUgPT09ICdzdHJpbmcnKSB7CiAgICAgIGNvbXBvbmVudE5hbWVzID0gW2NvbXBvbmVudE5hbWVdOwogICAgfSBlbHNlIHsKICAgICAgY29tcG9uZW50TmFtZXMgPSBjb21wb25lbnROYW1lOwogICAgfQogICAgdmFyIHBhcmVudCA9IGNvbnRleHQuJHBhcmVudDsKICAgIHZhciBuYW1lID0gcGFyZW50LiRvcHRpb25zLm5hbWU7CiAgICB3aGlsZSAocGFyZW50ICYmICghbmFtZSB8fCBjb21wb25lbnROYW1lcy5pbmRleE9mKG5hbWUpIDwgMCkpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICAgIGlmIChwYXJlbnQpIG5hbWUgPSBwYXJlbnQuJG9wdGlvbnMubmFtZTsKICAgIH0KICAgIHJldHVybiBwYXJlbnQ7CiAgfSwKICBkZWVwQ2xvbmU6IGZ1bmN0aW9uIChfZGVlcENsb25lKSB7CiAgICBmdW5jdGlvbiBkZWVwQ2xvbmUoX3gpIHsKICAgICAgcmV0dXJuIF9kZWVwQ2xvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0KICAgIGRlZXBDbG9uZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIF9kZWVwQ2xvbmUudG9TdHJpbmcoKTsKICAgIH07CiAgICByZXR1cm4gZGVlcENsb25lOwogIH0oZnVuY3Rpb24gKGRhdGEpIHsKICAgIHZhciB0eXBlID0gZ2V0VHlwZShkYXRhKTsKICAgIHZhciBvYmo7CiAgICBpZiAodHlwZSA9PT0gJ2FycmF5JykgewogICAgICBvYmogPSBbXTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHsKICAgICAgb2JqID0ge307CiAgICB9IGVsc2UgewogICAgICAvLyDkuI3lho3lhbfmnInkuIvkuIDlsYLmrKEKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBpZiAodHlwZSA9PT0gJ2FycmF5JykgewogICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIG9iai5wdXNoKGRlZXBDbG9uZShkYXRhW2ldKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHsKICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICBvYmpba2V5XSA9IGRlZXBDbG9uZShkYXRhW2tleV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0pLAogIC8qKg0KICAgKiDmoLnmja7lrZflhbjnvJbnoIHojrflj5blrZflhbjmlbDmja4NCiAgICovCiAgZ2V0RGljdEl0ZW1zRnJvbUNhY2hlOiBmdW5jdGlvbiBnZXREaWN0SXRlbXNGcm9tQ2FjaGUoZGljdENvZGUpIHsKICAgIGlmICghZGljdENvZGUpIHsKICAgICAgcmV0dXJuICflrZflhbhDb2Rl5LiN6IO95Li656m6ISc7CiAgICB9CiAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpIHsKICAgICAgdmFyIGRpY3RfZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpOwogICAgICBpZiAoZGljdF9kYXRhW2RpY3RDb2RlXSkgewogICAgICAgIHZhciBkaXN0SXRlbSA9IGRpY3RfZGF0YVtkaWN0Q29kZV07CiAgICAgICAgcmV0dXJuIGRpc3RJdGVtOwogICAgICB9CiAgICB9CiAgfSwKICAvL+agueaNruS8oOWFpeeahOWAvOWSjOaVsOe7hOi/m+ihjOavlOi+g++8jOebuOetiei/lOWbnuivpeaVsOaNruS4quafkOadoeaVsOaNrgogIGluZGV4T2ZMaXN0OiBmdW5jdGlvbiBpbmRleE9mTGlzdChsaXN0LCBrZXksIHZhbHVlKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGxpc3RbaV1ba2V5XSA9PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBsaXN0W2ldOwogICAgICB9CiAgICB9CiAgfSwKICAvL+Wtl+iKguaVsOi9rEtC5oiW6ICFTUIKICBiaWdEZWNpbWFsOiBmdW5jdGlvbiBiaWdEZWNpbWFsKGJ5dGVzKSB7CiAgICB2YXIgcmV0dXJuVmFsdWUgPSBieXRlcyAvICgxMDI0ICogMTAyNCk7CiAgICBpZiAocmV0dXJuVmFsdWUgPiAxKSB7CiAgICAgIHJldHVybiByZXR1cm5WYWx1ZS50b0ZpeGVkKDIpICsgJ00nOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuVmFsdWUgPSBieXRlcyAvIDEwMjQ7CiAgICAgIHJldHVybiByZXR1cm5WYWx1ZS50b0ZpeGVkKDApICsgJ0tCJzsKICAgIH0KICB9LAogIC8v6I635Y+W5oyH5a6a5a2X56ym5ZCO6Z2i5omA5pyJ5a2X56ymCiAgc3Vic3RyaW5nVHlwZTogZnVuY3Rpb24gc3Vic3RyaW5nVHlwZShzdHIsIHR5cGUpIHsKICAgIHZhciByZXR1cm5WYWx1ZSA9IHN0ci5zcGxpdCgnLicpOwogICAgcmV0dXJuIHJldHVyblZhbHVlW3JldHVyblZhbHVlLmxlbmd0aCAtIDFdOwogIH0sCiAgLy8g6I635Y+W6ZqP5py655qE5ZCN56ewCiAgZ2V0TmFtZTogZnVuY3Rpb24gZ2V0TmFtZSgpIHsKICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMik7CiAgfSwKICAvLyDojrflj5bmjqfku7bmmK/lkKblj6/nvJbovpEKICBnZXRXcml0ZWFibGU6IGZ1bmN0aW9uIGdldFdyaXRlYWJsZShwZXJtaXNzaW9uKSB7CiAgICBpZiAocGVybWlzc2lvbiA9PT0gJ3cnIHx8IHBlcm1pc3Npb24gPT09ICdiJykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9LAogIC8vIOiOt+WPluaOp+S7tuaYr+WQpua3u+WKoOW/heWhq+agoemqjAogIGFkZFJlcXVpcmVkT3JOb3Q6IGZ1bmN0aW9uIGFkZFJlcXVpcmVkT3JOb3QocGVybWlzc2lvbiwgdmFsaWRhdGUsIGxpbmthZ2VWYWxpZGF0ZSwgX3RoaXMpIHsKICAgIC8v5Yik5pat5piv5ZCm5pyJ6IGU5Yqo5qCh6aqMCiAgICBpZiAobGlua2FnZVZhbGlkYXRlLmxlbmd0aCA+IDApIHsKICAgICAgbGlua2FnZVZhbGlkYXRlLmZvckVhY2goZnVuY3Rpb24gKGVsZSkgewogICAgICAgIGlmIChlbGUgJiYgZWxlLnZhbGlkYXRlICYmICdkYXRhLicgKyBlbGUudGFyZ2V0ID09IF90aGlzLmF0dGVyKSB7CiAgICAgICAgICB2YWxpZGF0ZSA9IGVsZS52YWxpZGF0ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgaWYgKHBlcm1pc3Npb24gIT09ICdiJykgewogICAgICByZXR1cm4gdmFsaWRhdGU7CiAgICB9CiAgICAvL+WmguaenOihqOWNleaOiOadg+S4uuafkOaOp+S7tuWKoOS6huW/heWhq+WImeW/heWhqwogICAgaWYgKHBlcm1pc3Npb24gPT09ICdiJyAmJiB2YWxpZGF0ZSAmJiAhdmFsaWRhdGUucmVxdWlyZWQgJiYgdmFsaWRhdGUuY29uc3RydWN0b3IgPT09IE9iamVjdCkgewogICAgICB2YWxpZGF0ZS5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICBpZiAodmFsaWRhdGUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0ZSA9PT0gbnVsbCkgewogICAgICB2YWxpZGF0ZSA9ICdyZXF1aXJlZCc7CiAgICB9IGVsc2UgaWYgKHZhbGlkYXRlLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgdmFyIGFyeSA9IHZhbGlkYXRlLnNwbGl0KCd8Jyk7CiAgICAgIGlmICghYXJ5LnNvbWUoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICByZXR1cm4gaXRlbSA9PT0gJ3JlcXVpcmVkJzsKICAgICAgfSkpIHsKICAgICAgICBhcnkuc3BsaWNlKDAsIDAsICdyZXF1aXJlZCcpOwogICAgICAgIHZhbGlkYXRlID0gYXJ5LmpvaW4oJ3wnKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh2YWxpZGF0ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgICAgIHZhbGlkYXRlID0gT2JqZWN0LmFzc2lnbih7CiAgICAgICAgcmVxdWlyZWQ6IHRydWUKICAgICAgfSwgdmFsaWRhdGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgJ3ZhbGlkYXRl5LiN5piv5YWB6K6455qE57G75Z6LJzsKICAgIH0KICAgIHJldHVybiB2YWxpZGF0ZTsKICB9LAogIC8vIOagvOW8j+WMluaXpeacnwogIGZvcm1hdERhdGU6IGZ1bmN0aW9uIGZvcm1hdERhdGUodmFsdWUpIHsKICAgIHZhciBkYXRlID0gbnVsbDsKICAgIGlmICghdmFsdWUpIHsKICAgICAgcmV0dXJuIGRhdGU7CiAgICB9CiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gRGF0ZSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkgewogICAgICBkYXRlID0gdmFsdWU7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IFN0cmluZyB8fCB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBOdW1iZXIpIHsKICAgICAgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICfmoLzlvI/ljJbml6XmnJ/ml7bvvIzkvKDlhaXnmoTmlbDmja7moLzlvI/kuI3mraPnoa7jgIInOwogICAgfQogICAgdmFyIHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICB2YXIgTU0gPSBkYXRlLmdldE1vbnRoKCkgKyAxOwogICAgTU0gPSBNTSA8IDEwID8gJzAnICsgTU0gOiBNTTsKICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7CiAgICBkID0gZCA8IDEwID8gJzAnICsgZCA6IGQ7CiAgICB2YXIgaCA9IGRhdGUuZ2V0SG91cnMoKTsKICAgIGggPSBoIDwgMTAgPyAnMCcgKyBoIDogaDsKICAgIHZhciBtID0gZGF0ZS5nZXRNaW51dGVzKCk7CiAgICBtID0gbSA8IDEwID8gJzAnICsgbSA6IG07CiAgICB2YXIgcyA9IGRhdGUuZ2V0U2Vjb25kcygpOwogICAgcyA9IHMgPCAxMCA/ICcwJyArIHMgOiBzOwogICAgcmV0dXJuIHkgKyAnLScgKyBNTSArICctJyArIGQgKyAnICcgKyBoICsgJzonICsgbSArICc6JyArIHM7CiAgfSwKICAvLyDmoLzlvI/ljJbml6XmnJ8KICBmb3JtYXREYXRlWWVhcjogZnVuY3Rpb24gZm9ybWF0RGF0ZVllYXIodmFsdWUpIHsKICAgIHZhciBkYXRlID0gbmV3IERhdGUodmFsdWUpOwogICAgdmFyIHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICB2YXIgTU0gPSBkYXRlLmdldE1vbnRoKCkgKyAxOwogICAgTU0gPSBNTSA8IDEwID8gJzAnICsgTU0gOiBNTTsKICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7CiAgICBkID0gZCA8IDEwID8gJzAnICsgZCA6IGQ7CiAgICByZXR1cm4geSArICctJyArIE1NICsgJy0nICsgZDsKICB9LAogIC8vIOavlOi+gzLkuKrml6XmnJ8KICBkYXlzQmV0d2VlbjogZnVuY3Rpb24gZGF5c0JldHdlZW4oRGF0ZU9uZSwgRGF0ZVR3bywgbm90U3VwcG9ydEVxdWFscykgewogICAgaWYgKCFEYXRlT25lIHx8ICFEYXRlVHdvKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdmFyIGRhdGUxID0gbmV3IERhdGUoRGF0ZU9uZSkuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCd5eXl5LU1NLWRkJykgKyAnICcgKyBEYXRlT25lKS5nZXRUaW1lKCk7CiAgICB2YXIgZGF0ZTIgPSBuZXcgRGF0ZShEYXRlVHdvKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoJ3l5eXktTU0tZGQnKSArICcgJyArIERhdGVUd28pLmdldFRpbWUoKTsKICAgIGlmIChub3RTdXBwb3J0RXF1YWxzKSB7CiAgICAgIC8v5aSn5LqO44CCdjI+djEg44CCCiAgICAgIGlmIChkYXRlMiA+IGRhdGUxKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvL+Wkp+S6juetieS6juOAgnYyPj12MSDjgILlj6ropoF2MeS4jeWkp+S6jnYy5Y2z5Y+vCiAgICAgIGlmIChkYXRlMSA+IGRhdGUyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgfSwKICBkYXRlQ2FsYzogZnVuY3Rpb24gZGF0ZUNhbGMoc3RhcnREYXRlLCBlbmREYXRlLCBvcCkgewogICAgaWYgKCFzdGFydERhdGUgfHwgIWVuZERhdGUgfHwgc3RhcnREYXRlLmxlbmd0aCA9PSAwIHx8IGVuZERhdGUubGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAob3AubGVnZW5kID09IDApIHsKICAgICAgb3AgPSAnZGF5JzsKICAgIH0KICAgIHZhciBkYXRlMSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSkuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCd5eXl5LU1NLWRkJykgKyAnICcgKyBzdGFydERhdGUpLmdldFRpbWUoKTsKICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKGVuZERhdGUpLmdldFRpbWUoKSB8fCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmZvcm1hdCgneXl5eS1NTS1kZCcpICsgJyAnICsgZW5kRGF0ZSkuZ2V0VGltZSgpOwogICAgdmFyIHJlcyA9IDA7CiAgICB2YXIgZGF5cyA9IGRhdGUyIC0gZGF0ZTE7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgJ21vbnRoJzoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiAzMCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdkYXknOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdob3VyJzoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ21pbnV0ZSc6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjApKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gMTAwMCk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0sCiAgLy8g5bmz6ZO657uT5p6E6L2s5bWM5aWX57uT5p6ECiAgdGlsZTJuZXN0OiBmdW5jdGlvbiB0aWxlMm5lc3QoYXJyYXksIGtleSwgcEtleSwgY2hpbGRyZW5LZXkpIHsKICAgIGlmICghYXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIC8vIOWkjeWItuS4gOS7ve+8jOmBv+WFjeS/ruaUueWOn+Wni+aVsOe7hAogICAgdmFyIGFyeSA9IF90b0NvbnN1bWFibGVBcnJheShhcnJheSk7CiAgICBrZXkgPSBrZXkgfHwgJ2lkJzsKICAgIHBLZXkgPSBwS2V5IHx8ICdwYXJlbnRJZCc7CiAgICBjaGlsZHJlbktleSA9IGNoaWxkcmVuS2V5IHx8ICdjaGlsZHJlbic7CiAgICAvLyDlrprkuYnkuIDkuKrlvoXnp7vpmaTmlbDnu4QKICAgIHZhciBhcnkycmVtb3ZlID0gW107CiAgICBhcnkubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGlmIChpdGVtW2tleV0gIT09IGl0ZW1bcEtleV0pIHsKICAgICAgICAvLyDmib7niLboioLngrkKICAgICAgICB2YXIgcCA9IGFyeS5maWx0ZXIoZnVuY3Rpb24gKGMpIHsKICAgICAgICAgIHJldHVybiBjW2tleV0gPT09IGl0ZW1bcEtleV07CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHAgJiYgcC5sZW5ndGggPT0gMSkgewogICAgICAgICAgcFswXS5jaGlsZHJlbiA9IHBbMF0uY2hpbGRyZW4gfHwgW107CiAgICAgICAgICAvLyDlsIblrZDoioLngrnmlL7liLDniLboioLngrnkuK0KICAgICAgICAgIHBbMF0uY2hpbGRyZW4ucHVzaChpdGVtKTsKICAgICAgICAgIGFyeTJyZW1vdmUucHVzaChpdGVtW2tleV0pOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICAvLyDpgY3ljobnp7vpmaTlvoXliKDpmaTlr7nosaEKICAgIGFyeTJyZW1vdmUubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGFyeSA9IGFyeS5maWx0ZXIoZnVuY3Rpb24gKGMpIHsKICAgICAgICByZXR1cm4gY1trZXldICE9PSBpdGVtOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGFyeTsKICB9LAogIC8vIOS7juWvueixoeS4reiOt+WPluWSjOmqjOivgeWtl+autei3r+W+hAogIGdldEFuZFZhbGlkUGF0aDogZnVuY3Rpb24gZ2V0QW5kVmFsaWRQYXRoKG9iaiwga2V5KSB7CiAgICBpZiAoIW9iaiB8fCBvYmouY29uc3RydWN0b3IgIT0gT2JqZWN0IHx8ICFrZXkgfHwga2V5LmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcGF0aCA9IG9ialtrZXldOwogICAgaWYgKC9eXHcrLipcdyskLy50ZXN0KHBhdGgpKSB7CiAgICAgIHJldHVybiBwYXRoOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfSwKICAvLyDojrflj5ZWdWXlrp7kvovkuK3mjIflrppjbGFzc05hbWXnmoTniLblrp7kvosKICBnZXRQYXJlbnRJbnN0YW5jZUJ5Q2xhc3NOYW1lOiBmdW5jdGlvbiBnZXRQYXJlbnRJbnN0YW5jZUJ5Q2xhc3NOYW1lKGluc3RhbmNlLCBjbGFzc05hbWUpIHsKICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgdGhyb3cgJ1Z1ZUNvbXBvbmVudOWunuS+i+S4uuepui4nOwogICAgfQogICAgaWYgKGluc3RhbmNlLiRlbC5jbGFzc05hbWUgJiYgaW5zdGFuY2UuJGVsLmNsYXNzTmFtZS5pbmRleE9mKGNsYXNzTmFtZSkgPiAtMSkgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRyb290ICYmIGluc3RhbmNlLiRyb290Ll91aWQgPT0gaW5zdGFuY2UuX3VpZCkgewogICAgICB0aHJvdyAiXHU2N0U1XHU2MjdFVnVlQ29tcG9uZW50XHU1QjlFXHU0RjhCXHU2ODExXHU2NUY2XHU2MjdFXHU1MjMwXHU2ODM5XHU4MjgyXHU3MEI5XHU5MEZEXHU2NzJBXHU2MjdFXHU1MjMwY2xhc3NOYW1lXHU0RTNBIi5jb25jYXQoY2xhc3NOYW1lLCAiXHU3Njg0XHU1QjlFXHU0RjhCLiIpOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRQYXJlbnRJbnN0YW5jZUJ5Q2xhc3NOYW1lKGluc3RhbmNlLiRwYXJlbnQsIGNsYXNzTmFtZSk7CiAgICB9CiAgfSwKICAvLyDojrflj5bmjqfku7bmiYDlnKjooajljZXlr7nlupTnmoTlrp7kvovlr7nosaEKICBnZXRPbmxpbmVGb3JtSW5zdGFuY2U6IGZ1bmN0aW9uIGdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0YW5jZSkgewogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICB0aHJvdyAnVnVlQ29tcG9uZW505a6e5L6L5Li656m6Lic7CiAgICB9CiAgICBpZiAoaW5zdGFuY2UuJGVsLmdldEF0dHJpYnV0ZSAmJiBpbnN0YW5jZS4kZWwuZ2V0QXR0cmlidXRlKCduYW1lJykgPT09ICdvbmxpbmUtZm9ybScpIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcm9vdCAmJiBpbnN0YW5jZS4kcm9vdC5fdWlkID09IGluc3RhbmNlLl91aWQpIHsKICAgICAgdGhyb3cgIlx1NjdFNVx1NjI3RVZ1ZUNvbXBvbmVudFx1NUI5RVx1NEY4Qlx1NjgxMVx1NjVGNlx1NjI3RVx1NTIzMFx1NjgzOVx1ODI4Mlx1NzBCOVx1OTBGRFx1NjcyQVx1NjI3RVx1NTIzMG5hbWVcdTRFM0FvbmxpbmUtZm9ybVx1NzY4NFx1NUI5RVx1NEY4Qi4iOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoaW5zdGFuY2UuJHBhcmVudCk7CiAgICB9CiAgfSwKICAvLyDmoLnmja7oh6rlrprkuYnmoIfnrb7lkI0o57uE5Lu25ZCNKeiOt+WPluafkOS4qlZ1ZeWunuS+iwogIGdldEluc3RhbmNlQnlUYWc6IGZ1bmN0aW9uIGdldEluc3RhbmNlQnlUYWcoaW5zdGFuY2UsIGFyZ3MpIHsKICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgdGhyb3cgJ1Z1ZUNvbXBvbmVudOWunuS+i+S4uuepui4nOwogICAgfQogICAgaWYgKGFyZ3MuaW5jbHVkZXMoaW5zdGFuY2UuJG9wdGlvbnMuX2NvbXBvbmVudFRhZykpIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcm9vdCAmJiBpbnN0YW5jZS4kcm9vdC5fdWlkID09IGluc3RhbmNlLl91aWQpIHsKICAgICAgdGhyb3cgIlx1NjdFNVx1NjI3RVZ1ZUNvbXBvbmVudFx1NUI5RVx1NEY4Qlx1NjgxMVx1NjVGNlx1NjI3RVx1NTIzMFx1NjgzOVx1ODI4Mlx1NzBCOVx1OTBGRFx1NjcyQVx1NjI3RVx1NTIzMG5hbWVcdTRFM0F0YWdcdTc2ODRcdTVCOUVcdTRGOEIuIjsKICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuJHBhcmVudCkgewogICAgICByZXR1cm4gdXRpbHMuZ2V0SW5zdGFuY2VCeVRhZyhpbnN0YW5jZS4kcGFyZW50LCBhcmdzKTsKICAgIH0KICB9LAogIC8vIOiOt+WPllZ1ZeWunuS+i+WPiueItue6p+WunuS+i+S4reaciXJlbG9hZOaWueazleeahOWunuS+iwogIGdldFJlbG9hZE1ldGhvZDogZnVuY3Rpb24gZ2V0UmVsb2FkTWV0aG9kKGluc3RhbmNlKSB7CiAgICBpZiAoIWluc3RhbmNlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGluc3RhbmNlLnJlbG9hZCAmJiBpbnN0YW5jZS5yZWxvYWQuY29uc3RydWN0b3IgPT09IEZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuJHJvb3QgJiYgaW5zdGFuY2UuJHJvb3QuX3VpZCA9PSBpbnN0YW5jZS5fdWlkKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRSZWxvYWRNZXRob2QoaW5zdGFuY2UuJHBhcmVudCk7CiAgICB9CiAgfSwKICAvLyDph43mlrDliqDovb3lvZPliY3pobXpnaIo5LiN5Lya5Yi35paw5pW05Liq6aG16Z2i77yM5Y+q5Yi35pawcm91dGVyLXZpZXfpg6jliIYpCiAgcmVsb2FkOiBmdW5jdGlvbiByZWxvYWQoKSB7CiAgICB2YXIgdmlld0VsZW1lbnRBcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnYXBwLWJhc2UtbWFpbicpOwogICAgaWYgKCF2aWV3RWxlbWVudEFyeSB8fCB2aWV3RWxlbWVudEFyeS5sZW5ndGggIT0gMSkgewogICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgdmlld0luc3QgPSB2aWV3RWxlbWVudEFyeVswXS5fX3Z1ZV9fOwogICAgICBpZiAoIXZpZXdJbnN0IHx8ICF2aWV3SW5zdC5faXNWdWUpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgIH0KICAgICAgdmFyIHIgPSB1dGlscy5nZXRSZWxvYWRNZXRob2Qodmlld0luc3QpOwogICAgICBpZiAocikgewogICAgICAgIHIucmVsb2FkKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICB9CiAgICB9CiAgfSwKICAvLyDojrflj5blnKjnur/ooajljZXnmoRqc29u5qC85byP5a2X56ym5Liy55qE6KGo5Y2V5pWw5o2uKHZhbGlkYXRl5Y+C5pWw5Yaz5a6a5piv5ZCm6ZyA6KaB5a+56KGo5Y2V6L+b6KGM6aqM6K+BKQogIGdldE9ubGluZUZvcm1EYXRhOiBmdW5jdGlvbiBnZXRPbmxpbmVGb3JtRGF0YSh2YWxpZGF0ZSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGZvcm1FbGVtZW50QXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ29ubGluZS1mb3JtJyk7CiAgICAgIGlmICghZm9ybUVsZW1lbnRBcnkgfHwgZm9ybUVsZW1lbnRBcnkubGVuZ3RoIDwgMSkgewogICAgICAgIHZhciBmcm1GcmFtZSA9ICQoJyNmcm1GcmFtZScpOwogICAgICAgIGlmIChmcm1GcmFtZSAmJiBmcm1GcmFtZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YXIgZnJtID0gZnJtRnJhbWVbMF07CiAgICAgICAgICB2YXIgaXNDYWxsQmFjayA9IGZhbHNlOwogICAgICAgICAgdmFyIGNhbmNlbFRpbWVvdXQgPSBmYWxzZTsKICAgICAgICAgIHZhciBpc1RpbWVPdXQgPSBmYWxzZTsKICAgICAgICAgIC8vIOWtkOmhtemdouaYr+WQpuaUtuWIsOS6hua2iOaBrwogICAgICAgICAgdmFyIGlzUm9nZXIgPSBmYWxzZTsKICAgICAgICAgIGZybS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdzYXZlRGF0YScsICcqJyk7CiAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGlmIChlLmRhdGEgJiYgZS5kYXRhLmNvbnN0cnVjdG9yID09IE9iamVjdCkgewogICAgICAgICAgICAgIGlmIChlLmRhdGEudHlwZSA9PSAnc2F2ZURhdGEnICYmICFpc0NhbGxCYWNrKSB7CiAgICAgICAgICAgICAgICBpc0NhbGxCYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuc3RhdGUgJiYgIWlzVGltZU91dCkgewogICAgICAgICAgICAgICAgICB2YXIgaWZyYW1lRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0tleTogZS5kYXRhLmJ1c2luZXNzS2V5LAogICAgICAgICAgICAgICAgICAgIHN5c0NvZGU6IGUuZGF0YS5zeXNDb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIGlmIChlLmRhdGEudmFycykgewogICAgICAgICAgICAgICAgICAgIGlmcmFtZURhdGEudmFycyA9IGUuZGF0YS52YXJzOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHJlc29sdmUoaWZyYW1lRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEudHlwZSA9PSAnY2FuY2VsVGltZW91dCcpIHsKICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVvdXQgPSB0cnVlOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5kYXRhLnR5cGUgPT0gJ3JvZ2VyJyAmJiAhaXNSb2dlcikgewogICAgICAgICAgICAgICAgaXNSb2dlciA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICAvLyDlj6ropoHlrZDpobXpnaLlvJXlhaXkuoZob3RlbnQuaGVscGVyLmpz77yM54i26aG16Z2i5Y+R6YCB5LqG5raI5oGv5ZCO77yM5a2Q6aG16Z2i5Lya6ams5LiK5Zue5aSNYHJvZ2VyYOOAggogICAgICAgICAgLy8g6L+Z6YeM6K6+572uMC4156eS5ZCO5pyq5pS25YiwYHJvZ2VyYOa2iOaBr+WImeiupOS4uuWtkOmhtemdouacquW8leWFpWhvdGVudC5oZWxwZXIuanPvvIzmraTml7bnm7TmjqVyZWplY3TjgIIKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIWlzUm9nZXIpIHsKICAgICAgICAgICAgICByZWplY3QoNik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIDUwMCk7CgogICAgICAgICAgLy8g6K6+572uMTDnp5LotoXml7bmnLrliLbvvIzlpoLmnpzotoXml7bliJnkuI3lho3lvoDkuIvmiafooYwKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIWlzQ2FsbEJhY2sgJiYgIWNhbmNlbFRpbWVvdXQpIHsKICAgICAgICAgICAgICBpc1RpbWVPdXQgPSB0cnVlOwogICAgICAgICAgICAgIHJlamVjdCg1KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgMTAwMDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWplY3QoMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBmcm1JbnN0ID0gZm9ybUVsZW1lbnRBcnlbMF0uX192dWVfXzsKICAgICAgICBpZiAoIWZybUluc3QgfHwgIWZybUluc3QuX2lzVnVlKSB7CiAgICAgICAgICByZWplY3QoMik7CiAgICAgICAgfQogICAgICAgIC8v5aSE55CGaGFuZHNvbnRhYmxl5a2Q6KGo5pWw5o2uCiAgICAgICAgdmFyIHJlZnMgPSBmcm1JbnN0LiRyZWZzWydvbmxpbmVGb3JtJ10uJHJlZnM7CiAgICAgICAgdmFyIGhvdERhdGEgPSB0cnVlOwogICAgICAgIGlmIChyZWZzKSB7CiAgICAgICAgICBmb3IgKHZhciByZWYgaW4gcmVmcykgewogICAgICAgICAgICBpZiAocmVmcy5oYXNPd25Qcm9wZXJ0eShyZWYpICYmIHJlZi5pbmRleE9mKCdob3R0YWJsZS4nKSA9PSAwKSB7CiAgICAgICAgICAgICAgdmFyIHJlZkVsZSA9IHJlZnNbcmVmXTsKICAgICAgICAgICAgICBob3REYXRhID0gcmVmRWxlLmdldEhvdFRhYmxlRGF0YSh0cnVlKTsKICAgICAgICAgICAgICBpZiAoaG90RGF0YSAmJiBBcnJheS5pc0FycmF5KGhvdERhdGEpKSB7CiAgICAgICAgICAgICAgICB2YXIgbmFtZXMgPSByZWYuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgIGlmIChob3REYXRhICYmIEFycmF5LmlzQXJyYXkoaG90RGF0YSkpIHsKICAgICAgICAgICAgICAgICAgZnJtSW5zdC5kYXRhW25hbWVzWzFdXVtuYW1lc1syXV0gPSBfdG9Db25zdW1hYmxlQXJyYXkoaG90RGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBmcm1JbnN0LmRhdGFbbmFtZXNbMV1dW25hbWVzWzJdXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXZhbGlkYXRlKSB7CiAgICAgICAgICByZXNvbHZlKEpTT04uc3RyaW5naWZ5KGZybUluc3QuZGF0YSkpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmcm1JbnN0LiRyb290LiR2YWxpZGF0b3IudmFsaWRhdGVBbGwoJ2N1c3RvbS1mb3JtJykudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICBpZiAoaG90RGF0YSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy9ob3R0YWJsZeWtkOihqOaVsOaNruagoemqjOWksei0pQogICAgICAgICAgICByZWplY3QoNyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgcmVzb2x2ZShKU09OLnN0cmluZ2lmeShmcm1JbnN0LmRhdGEpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlamVjdCh7CiAgICAgICAgICAgICAgcmVhc29uOiAzLAogICAgICAgICAgICAgIGVycm9yczogZnJtSW5zdC4kcm9vdC4kdmFsaWRhdG9yLmVycm9ycy5pdGVtcwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgfSwKICAvLyDojrflj5booajljZXmlbDmja7lpLHotKXnmoTlpITnkIYKICBoYW5kbGVHZXRGb3JtRGF0YVJlamVjdDogZnVuY3Rpb24gaGFuZGxlR2V0Rm9ybURhdGFSZWplY3QocmVhc29uLCBuZWVkQ29uZmlybSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGVycm9ycyA9IFtdOwogICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5jb25zdHJ1Y3RvciA9PSBPYmplY3QpIHsKICAgICAgICBlcnJvcnMgPSByZWFzb24uZXJyb3JzOwogICAgICAgIHJlYXNvbiA9IHJlYXNvbi5yZWFzb247CiAgICAgIH0KICAgICAgc3dpdGNoIChyZWFzb24pIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBNZXNzYWdlLmVycm9yKCfmnKrojrflj5bliLDlnKjnur/ooajljZXmiJbogIVVUkzooajljZUuJyk7CiAgICAgICAgICByZWplY3QoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ+S9v+eUqOS6huWcqOe6v+ihqOWNle+8jOS9huaYr+ihqOWNleS4uuepuuaIluiAheWKoOi9veWksei0pS4nKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgdmFyIGVycm9yTXNnID0gW107CiAgICAgICAgICBlcnJvcnMgJiYgZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIGZpZWxkTGFiZWwgPSAnJzsKICAgICAgICAgICAgaWYgKGUuZmllbGQpIHsKICAgICAgICAgICAgICBpZiAoZS5maWVsZC5pbmRleE9mKCctJykgIT0gLTEpIHsKICAgICAgICAgICAgICAgIGZpZWxkTGFiZWwgPSBlLmZpZWxkLnN1YnN0cihlLmZpZWxkLmluZGV4T2YoJy0nKSArIDEpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmaWVsZExhYmVsID0gZS5maWVsZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3JNc2cucHVzaCgiIi5jb25jYXQoZmllbGRMYWJlbCwgIiAiKS5jb25jYXQoZS5tc2cpKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKGVycm9yTXNnLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCdvbmxpbmUtZm9ybScpWzBdKSB7CiAgICAgICAgICAgICAgdmFyIGZybUluc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnb25saW5lLWZvcm0nKVswXS5fX3Z1ZV9fOwogICAgICAgICAgICAgIHZhciBqc29uT2JqID0gZnJtSW5zdC4kcmVmcy5vbmxpbmVGb3JtLiRyZWZzOwogICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBqc29uT2JqKSB7CiAgICAgICAgICAgICAgICBpZiAoanNvbk9ialtrZXldLiRlbC50ZXh0Q29udGVudCkgewogICAgICAgICAgICAgICAgICB2YXIgdGV4dENvbnRlbnQgPSBqc29uT2JqW2tleV0uJGVsLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9yTXNnLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LmluZGV4T2YoZXJyb3JNc2dbaV0pICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGtleSlbMF0uc3R5bGUuY29sb3IgPSAncmVkJzsKICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB1dGlscy5oYW5kbGVSZWplY3QoZXJyb3JNc2cpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgTWVzc2FnZS53YXJuaW5nKCfor7fmraPnoa7nmoTloavlhpnooajljZXlhoXlrrkuJyk7CiAgICAgICAgICB9CiAgICAgICAgICByZWplY3QoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNToKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoJ1VSTOihqOWNleWkhOeQhuS4muWKoeaVsOaNrui2heaXti4nKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgaWYgKG5lZWRDb25maXJtKSB7CiAgICAgICAgICAgIE1lc3NhZ2VCb3guY29uZmlybSgnVVJM6KGo5Y2V6aG16Z2i5pyq5q2j56Gu5aSE55CG5pWw5o2u77yM5piv5ZCm5LuN54S25ZCv5Yqo5rWB56iL77yfJywgewogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJwogICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdCgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIC8vaG90dGFibGXlrZDooajmlbDmja7moKHpqozlpLHotKXjgIIKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoIlx1ODNCN1x1NTNENlx1ODg2OFx1NTM1NVx1NjU3MFx1NjM2RVx1NjVGNlx1NTNEMVx1NzUxRlx1OTg4NFx1NjcxRlx1NEU0Qlx1NTkxNlx1NzY4NFx1NUYwMlx1NUUzOFx1RkYwQ3JlYXNvbjoiLmNvbmNhdChyZWFzb24pKTsKICAgICAgICAgIHJlamVjdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0sCiAgLy/lhbPpl63miYDmnInmoKHpqozpgJrnn6UKICBjbG9zZUFsbE5vdGlmaWNhdGlvbjogZnVuY3Rpb24gY2xvc2VBbGxOb3RpZmljYXRpb24oKSB7CiAgICBjbG9zZUFsbE5vdGlmaWNhdGlvbkZsYWcgPSB0cnVlOwogICAgZm9yICh2YXIga2V5IGluIG5vdGlmaWNhdGlvbnMpIHsKICAgICAgbm90aWZpY2F0aW9uc1trZXldLmNsb3NlKCk7CiAgICAgIGRlbGV0ZSBub3RpZmljYXRpb25zW2tleV07CiAgICB9CiAgfSwKICBoYW5kbGVSZWplY3Q6IGZ1bmN0aW9uIGhhbmRsZVJlamVjdChlcnJvck1zZykgewogICAgdXRpbHMuY2xvc2VBbGxOb3RpZmljYXRpb24oKTsKICAgIGNsb3NlQWxsTm90aWZpY2F0aW9uRmxhZyA9IGZhbHNlOwogICAgdmFyIG5vdGlmaSA9IE5vdGlmaWNhdGlvbi5lcnJvcih7CiAgICAgIHRpdGxlOiAn6ZSZ6K+v5o+Q56S6JywKICAgICAgZGFuZ2Vyb3VzbHlVc2VIVE1MU3RyaW5nOiB0cnVlLAogICAgICBtZXNzYWdlOiAiXHU4QkY3XHU2QjYzXHU3ODZFXHU3Njg0XHU1ODZCXHU1MTk5XHU0RUU1XHU0RTBCXHU4ODY4XHU1MzU1XHU1MTg1XHU1QkI5XHVGRjFBPGJyLz4iLmNvbmNhdChlcnJvck1zZy5qb2luKCc8YnIvPicpKSwKICAgICAgZHVyYXRpb246IDAsCiAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uIG9uQ2xvc2UoKSB7CiAgICAgICAgaWYgKCFjbG9zZUFsbE5vdGlmaWNhdGlvbkZsYWcpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbiA9IE5vdGlmaWNhdGlvbi53YXJuaW5nKHsKICAgICAgICAgICAgICBjdXN0b21DbGFzczogJ2N1c3RvbUNsYXNzJywKICAgICAgICAgICAgICBkdXJhdGlvbjogMCwKICAgICAgICAgICAgICBzaG93Q2xvc2U6IGZhbHNlLAogICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7CiAgICAgICAgICAgICAgICBuLmNsb3NlKCk7CiAgICAgICAgICAgICAgICB1dGlscy5oYW5kbGVSZWplY3QoZXJyb3JNc2cpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG5vdGlmaWNhdGlvbnNbbi5pZF0gPSBuOwogICAgICAgICAgfSwgMTApOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBub3RpZmljYXRpb25zW25vdGlmaS5pZF0gPSBub3RpZmk7CiAgfSwKICAvLyDojrflj5bmjIflrppkb23lhYPntKDnmoTniLbnuqfkuK3lhbfmnInmjIflrprlsZ7mgKfnmoRkb23lhYPntKAKICBnZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGU6IGZ1bmN0aW9uIGdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKSB7CiAgICBpZiAoIWVsIHx8ICFlbC5oYXNBdHRyaWJ1dGUgfHwgZWwuaGFzQXR0cmlidXRlLmNvbnN0cnVjdG9yICE9PSBGdW5jdGlvbikgewogICAgICB0aHJvdyAn5Lyg5YWl55qE5YWD57SgZWzkuI3og73kuLrnqbrkuJTlv4XpobvkuLpIVE1MSHRtbEVsZW1lbnTnsbvlnosuJzsKICAgIH0KICAgIGlmICghYXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7CiAgICAgIHRocm93ICfkvKDlhaXnmoTlsZ7mgKdhdHRyaWJ1dGXkuI3og73kuLrnqbrkuJTlv4XpobvkuLpTdHJpbmfnsbvlnosuJzsKICAgIH0KICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgaWYgKGVsLnRhZ05hbWUgPT09ICdIVE1MJykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwucGFyZW50RWxlbWVudCwgYXR0cmlidXRlKTsKICAgIH0KICB9LAogIC8vIOS7jueItue6p2RvbeWFg+e0oOS4reiOt+WPluaMh+WumuWxnuaAp+eahOWAvAogIGdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudDogZnVuY3Rpb24gZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KGVsLCBhdHRyaWJ1dGUpIHsKICAgIHZhciBwRWwgPSB1dGlscy5nZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwsIGF0dHJpYnV0ZSk7CiAgICBpZiAocEVsICYmIHBFbC5nZXRBdHRyaWJ1dGUgJiYgcEVsLmdldEF0dHJpYnV0ZS5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb24pIHsKICAgICAgcmV0dXJuIHBFbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgLy8g6YCa6L+H6Lev5b6E5Y+W5b6X5a+56LGh5Lit55qE5bGe5oCnCiAgZ2V0VmFsdWVCeVBhdGg6IGZ1bmN0aW9uIGdldFZhbHVlQnlQYXRoKG9iaiwgcGF0aCwgc3ViSW5kZXgpIHsKICAgIGlmICghb2JqIHx8ICFwYXRoIHx8IHBhdGguY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCEvXlx3Py4qW1x3fFxdXSQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcGF0aEFyeSA9IHBhdGguc3BsaXQoJy4nKTsKICAgIGlmIChwYXRoQXJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBvYmpbcGF0aF07CiAgICB9IGVsc2UgaWYgKHBhdGhBcnkubGVuZ3RoID4gMSkgewogICAgICB2YXIgcmV0ID0gb2JqOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIga2V5ID0gcGF0aEFyeVtpXTsKICAgICAgICB2YXIgbWF0Y2ggPSAvXihcdyspXFsoXGQrKVxdJC8uZXhlYyhrZXkpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgcmV0ID0gcmV0W21hdGNoWzFdXVttYXRjaFsyXV07CiAgICAgICAgfSBlbHNlIGlmIChyZXQgJiYgcmV0LmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICAgIGlmIChzdWJJbmRleCAhPSBudWxsICYmIHN1YkluZGV4ICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICB2YXIgcHJlSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoc3ViSW5kZXgpOwogICAgICAgICAgICBpZiAoIWlzTmFOKHByZUluZGV4KSkgewogICAgICAgICAgICAgIGluZGV4ID0gcHJlSW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldCA9IHJldFtpbmRleF1ba2V5XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0ID0gcmV0W2tleV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9LAogIC8vIOmAmui/h+i3r+W+hOiuvue9ruWvueixoeS4reeahOWxnuaApwogIHNldFZhbHVlQnlQYXRoOiBmdW5jdGlvbiBzZXRWYWx1ZUJ5UGF0aChvYmosIHBhdGgsIHZhbHVlLCBzdWJJbmRleCkgewogICAgaWYgKCFvYmogfHwgIXBhdGggfHwgcGF0aC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEvXlx3Py4qW1x3fFxdXSQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHBhdGhBcnkgPSBwYXRoLnNwbGl0KCcuJyk7CiAgICBpZiAocGF0aEFyeS5sZW5ndGggPT0gMSkgewogICAgICBvYmpbcGF0aF0gPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAocGF0aEFyeS5sZW5ndGggPiAxKSB7CiAgICAgIHZhciByZXQgPSBvYmo7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyeS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBrZXkgPSBwYXRoQXJ5W2ldOwogICAgICAgIHZhciBtYXRjaCA9IC9eKFx3KylcWyhcZCspXF0kLy5leGVjKGtleSk7CiAgICAgICAgaWYgKGkgPT0gcGF0aEFyeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0W21hdGNoWzFdXVttYXRjaFsyXV0gPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICYmIHJldC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICAgICAgaWYgKHN1YkluZGV4ICE9IG51bGwgJiYgc3ViSW5kZXggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgdmFyIHByZUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHN1YkluZGV4KTsKICAgICAgICAgICAgICBpZiAoIWlzTmFOKHByZUluZGV4KSkgewogICAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqLiRzZXQocmV0W2luZGV4XSwga2V5LCB2YWx1ZSk7CiAgICAgICAgICAgIC8vcmV0W2luZGV4XVtrZXldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL3JldFtrZXldID0gdmFsdWU7CiAgICAgICAgICAgIG9iai4kc2V0KHJldCwga2V5LCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXQgPSByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IHJldFtrZXldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgb2JqLiRmb3JjZVVwZGF0ZSgpOwogIH0sCiAgLyoqDQogICAqIOWwhuWtl+espuS4sui9rOS4umpzb27lr7nosaHjgIINCiAgICogQHBhcmFtIGpzb25TdHINCiAgICogQHBhcmFtIHR5cGUgIOWPr+S4jeWhq+WGmXBhcnNlVG9Kc29uDQogICAqIEByZXR1cm5zDQogICAqLwogIHBhcnNlVG9Kc29uOiBmdW5jdGlvbiBwYXJzZVRvSnNvbihqc29uU3RyLCB0eXBlKSB7CiAgICB0eXBlID0gdHlwZSB8fCAxOwogICAgaWYgKCFqc29uU3RyIHx8IGpzb25TdHIgPT09ICcnKSByZXR1cm47CiAgICAvL+WmguaenOWMheWQq+aNouihjO+8jOS4i+mdouino+aekGpzb27kvJrmiqXplJnvvIzmiYDku6XlsIbmjaLooYzmm7/mjaLkuLoy5Liq56m65qC856ymCiAgICBqc29uU3RyID0ganNvblN0ci5yZXBsYWNlKC9cbi9nLCAnICAnKTsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBldmFsKCcoJyArIGpzb25TdHIgKyAnKScpOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIEpTT04ucGFyc2UoanNvblN0cik7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgJ+ino+aekGpzb27lr7nosaHplJnor68nOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiB1dGlscy5wYXJzZVRvSnNvbihqc29uU3RyLCB0eXBlICsgMSk7CiAgICB9CiAgfSwKICAvKioNCiAgICog5bCG5pWw5a2X6L2s5o2i5oiQ5Lq65ZCN5biB5aSn5YaZ44CCDQogICAqDQogICAqIEBwYXJhbSBjdXJyZW5jeURpZ2l0cw0KICAgKiBAcmV0dXJucw0KICAgKi8KICBjb252ZXJ0Q3VycmVuY3k6IGZ1bmN0aW9uIGNvbnZlcnRDdXJyZW5jeShjdXJyZW5jeURpZ2l0cykgewogICAgdmFyIE1BWElNVU1fTlVNQkVSID0gOTk5OTk5OTk5OTkuOTk7CiAgICB2YXIgQ05fWkVSTyA9ICfpm7YnOwogICAgdmFyIENOX09ORSA9ICflo7knOwogICAgdmFyIENOX1RXTyA9ICfotLAnOwogICAgdmFyIENOX1RIUkVFID0gJ+WPgSc7CiAgICB2YXIgQ05fRk9VUiA9ICfogoYnOwogICAgdmFyIENOX0ZJVkUgPSAn5LyNJzsKICAgIHZhciBDTl9TSVggPSAn6ZmGJzsKICAgIHZhciBDTl9TRVZFTiA9ICfmn5InOwogICAgdmFyIENOX0VJR0hUID0gJ+aNjCc7CiAgICB2YXIgQ05fTklORSA9ICfnjpYnOwogICAgdmFyIENOX1RFTiA9ICfmi74nOwogICAgdmFyIENOX0hVTkRSRUQgPSAn5L2wJzsKICAgIHZhciBDTl9USE9VU0FORCA9ICfku58nOwogICAgdmFyIENOX1RFTl9USE9VU0FORCA9ICfkuIcnOwogICAgdmFyIENOX0hVTkRSRURfTUlMTElPTiA9ICfkur8nOwogICAgdmFyIENOX1NZTUJPTCA9ICcnOwogICAgdmFyIENOX0RPTExBUiA9ICflhYMnOwogICAgdmFyIENOX1RFTl9DRU5UID0gJ+inkic7CiAgICB2YXIgQ05fQ0VOVCA9ICfliIYnOwogICAgdmFyIENOX0lOVEVHRVIgPSAn5pW0JzsKICAgIHZhciBpbnRlZ3JhbDsKICAgIHZhciBkZWNpbWFsOwogICAgdmFyIG91dHB1dENoYXJhY3RlcnM7CiAgICB2YXIgcGFydHM7CiAgICB2YXIgZGlnaXRzLCByYWRpY2VzLCBiaWdSYWRpY2VzLCBkZWNpbWFsczsKICAgIHZhciB6ZXJvQ291bnQ7CiAgICB2YXIgaSwgcCwgZDsKICAgIHZhciBxdW90aWVudCwgbW9kdWx1czsKICAgIGN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHMudG9TdHJpbmcoKTsKICAgIGlmIChjdXJyZW5jeURpZ2l0cyA9PSAnJykgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBpZiAoY3VycmVuY3lEaWdpdHMubWF0Y2goL1teLC5cZF0vKSAhPSBudWxsKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIGlmIChjdXJyZW5jeURpZ2l0cy5tYXRjaCgvXigoXGR7MSwzfSgsXGR7M30pKiguKChcZHszfSwpKlxkezEsM30pKT8pfChcZCsoLlxkKyk/KSkkLykgPT0gbnVsbCkgewogICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBjdXJyZW5jeURpZ2l0cyA9IGN1cnJlbmN5RGlnaXRzLnJlcGxhY2UoLywvZywgJycpOwogICAgY3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0cy5yZXBsYWNlKC9eMCsvLCAnJyk7CiAgICBpZiAoTnVtYmVyKGN1cnJlbmN5RGlnaXRzKSA+IE1BWElNVU1fTlVNQkVSKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHBhcnRzID0gY3VycmVuY3lEaWdpdHMuc3BsaXQoJy4nKTsKICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CiAgICAgIGludGVncmFsID0gcGFydHNbMF07CiAgICAgIGRlY2ltYWwgPSBwYXJ0c1sxXTsKICAgICAgZGVjaW1hbCA9IGRlY2ltYWwuc3Vic3RyKDAsIDIpOwogICAgfSBlbHNlIHsKICAgICAgaW50ZWdyYWwgPSBwYXJ0c1swXTsKICAgICAgZGVjaW1hbCA9ICcnOwogICAgfQogICAgZGlnaXRzID0gbmV3IEFycmF5KENOX1pFUk8sIENOX09ORSwgQ05fVFdPLCBDTl9USFJFRSwgQ05fRk9VUiwgQ05fRklWRSwgQ05fU0lYLCBDTl9TRVZFTiwgQ05fRUlHSFQsIENOX05JTkUpOwogICAgcmFkaWNlcyA9IG5ldyBBcnJheSgnJywgQ05fVEVOLCBDTl9IVU5EUkVELCBDTl9USE9VU0FORCk7CiAgICBiaWdSYWRpY2VzID0gbmV3IEFycmF5KCcnLCBDTl9URU5fVEhPVVNBTkQsIENOX0hVTkRSRURfTUlMTElPTik7CiAgICBkZWNpbWFscyA9IG5ldyBBcnJheShDTl9URU5fQ0VOVCwgQ05fQ0VOVCk7CiAgICBvdXRwdXRDaGFyYWN0ZXJzID0gJyc7CiAgICBpZiAoTnVtYmVyKGludGVncmFsKSA+IDApIHsKICAgICAgemVyb0NvdW50ID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IGludGVncmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcCA9IGludGVncmFsLmxlbmd0aCAtIGkgLSAxOwogICAgICAgIGQgPSBpbnRlZ3JhbC5zdWJzdHIoaSwgMSk7CiAgICAgICAgcXVvdGllbnQgPSBwIC8gNDsKICAgICAgICBtb2R1bHVzID0gcCAlIDQ7CiAgICAgICAgaWYgKGQgPT0gJzAnKSB7CiAgICAgICAgICB6ZXJvQ291bnQrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHplcm9Db3VudCA+IDApIHsKICAgICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbMF07CiAgICAgICAgICB9CiAgICAgICAgICB6ZXJvQ291bnQgPSAwOwogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbTnVtYmVyKGQpXSArIHJhZGljZXNbbW9kdWx1c107CiAgICAgICAgfQogICAgICAgIGlmIChtb2R1bHVzID09IDAgJiYgemVyb0NvdW50IDwgNCkgewogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBiaWdSYWRpY2VzW3F1b3RpZW50XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBDTl9ET0xMQVI7CiAgICB9CiAgICBpZiAoZGVjaW1hbCAhPSAnJykgewogICAgICBmb3IgKGkgPSAwOyBpIDwgZGVjaW1hbC5sZW5ndGg7IGkrKykgewogICAgICAgIGQgPSBkZWNpbWFsLnN1YnN0cihpLCAxKTsKICAgICAgICBpZiAoZCAhPSAnMCcpIHsKICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gZGlnaXRzW051bWJlcihkKV0gKyBkZWNpbWFsc1tpXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChvdXRwdXRDaGFyYWN0ZXJzID09ICcnKSB7CiAgICAgIG91dHB1dENoYXJhY3RlcnMgPSBDTl9aRVJPICsgQ05fRE9MTEFSOwogICAgfQogICAgaWYgKGRlY2ltYWwgPT0gJycpIHsKICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBDTl9JTlRFR0VSOwogICAgfQogICAgb3V0cHV0Q2hhcmFjdGVycyA9IENOX1NZTUJPTCArIG91dHB1dENoYXJhY3RlcnM7CiAgICByZXR1cm4gb3V0cHV0Q2hhcmFjdGVyczsKICB9LAogIC8qKg0KICAgKiDmlbDlrZfmoLzlvI/ovazmjaLmiJDljYPliIbkvY0NCiAgICpAcGFyYW17T2JqZWN0fW51bQ0KICAgKi8KICB0aG91c2FuZEJpdDogZnVuY3Rpb24gdGhvdXNhbmRCaXQobnVtKSB7CiAgICBpZiAoKG51bSArICcnKS50cmltKCkgPT0gJycpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgaWYgKGlzTmFOKG51bSkpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQogICAgbnVtID0gbnVtICsgJyc7CiAgICBpZiAoL14uKlwuLiokLy50ZXN0KG51bSkpIHsKICAgICAgdmFyIHBvaW50SW5kZXggPSBudW0ubGFzdEluZGV4T2YoJy4nKTsKICAgICAgdmFyIGludFBhcnQgPSBudW0uc3Vic3RyaW5nKDAsIHBvaW50SW5kZXgpOwogICAgICB2YXIgcG9pbnRQYXJ0ID0gbnVtLnN1YnN0cmluZyhwb2ludEluZGV4ICsgMSwgbnVtLmxlbmd0aCk7CiAgICAgIHZhciBpbnRQYXJ0ID0gaW50UGFydCArICcnOwogICAgICB2YXIgcmUgPSAvKC0/XGQrKShcZHszfSkvOwogICAgICB3aGlsZSAocmUudGVzdChpbnRQYXJ0KSkgewogICAgICAgIGludFBhcnQgPSBpbnRQYXJ0LnJlcGxhY2UocmUsICckMSwkMicpOwogICAgICB9CiAgICAgIG51bSA9IGludFBhcnQgKyAnLicgKyBwb2ludFBhcnQ7CiAgICB9IGVsc2UgewogICAgICBudW0gPSBudW0gKyAnJzsKICAgICAgdmFyIHJlID0gLygtP1xkKykoXGR7M30pLzsKICAgICAgd2hpbGUgKHJlLnRlc3QobnVtKSkgewogICAgICAgIG51bSA9IG51bS5yZXBsYWNlKHJlLCAnJDEsJDInKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bTsKICB9LAogIC8qKg0KICAgKiDpgJrov4duYW1l6I635Y+W6aG16Z2idXJs5Zyw5Z2A5Y+C5pWwDQogICAqIEBwYXJhbSBuYW1lDQogICAqIEByZXR1cm5zDQogICAqDQogICAqLwogIGdldFVybEtleTogZnVuY3Rpb24gZ2V0VXJsS2V5KG5hbWUpIHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoKG5ldyBSZWdFeHAoJ1s/fCZdJyArIG5hbWUgKyAnPScgKyAnKFteJjtdKz8pKCZ8I3w7fCQpJykuZXhlYyhsb2NhdGlvbi5ocmVmKSB8fCBbLCAnJ10pWzFdLnJlcGxhY2UoL1wrL2csICclMjAnKSkgfHwgbnVsbDsKICB9LAogIC8v6YCJ5oup5Zmo5LiK5LiL56e7CiAgZG93bjogZnVuY3Rpb24gZG93bihhcnksIHNlbGVjdEFyciwgdGhpc18pIHsKICAgIGlmIChhcnkubGVuZ3RoID4gMCAmJiBzZWxlY3RBcnIubGVuZ3RoID4gMCkgewogICAgICB2YXIgaWR4ID0gc2VsZWN0QXJyLmluZGV4T2YoYXJ5W2FyeS5sZW5ndGggLSAxXSk7CiAgICAgIGlmIChpZHggKyAxIDwgc2VsZWN0QXJyLmxlbmd0aCkgewogICAgICAgIHZhciB0ID0gc2VsZWN0QXJyW2lkeCArIDFdOwogICAgICAgIHNlbGVjdEFycltpZHggKyAxXSA9IHNlbGVjdEFycltpZHhdOwogICAgICAgIHNlbGVjdEFycltpZHhdID0gdDsKICAgICAgICB0aGlzXy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCk7CiAgICAgICAgdGhpc18uc3luY0lucHV0VmFsdWUoKTsKICAgICAgfQogICAgfQogIH0sCiAgdXA6IGZ1bmN0aW9uIHVwKGFyeSwgc2VsZWN0QXJyLCB0aGlzXykgewogICAgaWYgKGFyeS5sZW5ndGggPiAwICYmIHNlbGVjdEFyci5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBpZHggPSBzZWxlY3RBcnIuaW5kZXhPZihhcnlbYXJ5Lmxlbmd0aCAtIDFdKTsKICAgICAgaWYgKGlkeCAhPSAwKSB7CiAgICAgICAgdmFyIHQgPSBzZWxlY3RBcnJbaWR4IC0gMV07CiAgICAgICAgc2VsZWN0QXJyW2lkeCAtIDFdID0gc2VsZWN0QXJyW2lkeF07CiAgICAgICAgc2VsZWN0QXJyW2lkeF0gPSB0OwogICAgICAgIHRoaXNfLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgICB0aGlzXy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgICB9CiAgICB9CiAgfSwKICBBcnJheTogewogICAgLy/kuIrnp7vmjInpkq4KICAgIHVwOiBmdW5jdGlvbiB1cChpZHgsIGxpc3QpIHsKICAgICAgaWR4ID0gcGFyc2VJbnQoaWR4KTsKICAgICAgaWYgKGlkeCA8IDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHQgPSBsaXN0W2lkeCAtIDFdOwogICAgICBsaXN0W2lkeCAtIDFdID0gbGlzdFtpZHhdOwogICAgICBsaXN0W2lkeF0gPSB0OwogICAgfSwKICAgIC8v5LiL56e75oyJ6ZKuCiAgICBkb3duOiBmdW5jdGlvbiBkb3duKGlkeCwgbGlzdCkgewogICAgICBpZHggPSBwYXJzZUludChpZHgpOwogICAgICBpZiAoaWR4ID49IGxpc3QubGVuZ3RoIC0gMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgdCA9IGxpc3RbaWR4ICsgMV07CiAgICAgIGxpc3RbaWR4ICsgMV0gPSBsaXN0W2lkeF07CiAgICAgIGxpc3RbaWR4XSA9IHQ7CiAgICB9LAogICAgcmVzdW1lU246IGZ1bmN0aW9uIHJlc3VtZVNuKGxpc3QpIHsKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBsaXN0Lmxlbmd0aDsgaysrKSB7CiAgICAgICAgbGlzdFtrXS5zbiA9IGs7CiAgICAgIH0KICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9LAogICAgLyoqDQogICAgICogaWR4IOWOn+S9jee9rg0KICAgICAqIG51bSDnm67moIfkvY3nva4NCiAgICAgKiBsaXN0IOaVsOe7hA0KICAgICAqLwogICAgbW92ZVRvTnVtOiBmdW5jdGlvbiBtb3ZlVG9OdW0oaWR4LCB0YXJnZXQsIGxpc3QpIHsKICAgICAgaWYgKHRhcmdldCA9PSAtMSkgewogICAgICAgIHRhcmdldCA9IDA7CiAgICAgIH0gZWxzZSBpZiAoaWR4ID49IHRhcmdldCkgewogICAgICAgIHRhcmdldCA9IHRhcmdldCArIDE7CiAgICAgIH0KICAgICAgdmFyIHQgPSBsaXN0LnNwbGljZShpZHgsIDEpOwogICAgICBsaXN0Lmluc2VydCh0YXJnZXQsIHRbMF0pOwogICAgICB0aGlzLnJlc3VtZVNuKGxpc3QpOwogICAgfSwKICAgIC8v5Yig6Zmk5oyJ6ZKuCiAgICBkZWw6IGZ1bmN0aW9uIGRlbChpZHgsIGxpc3QpIHsKICAgICAgbGlzdC5zcGxpY2UoaWR4LCAxKTsKICAgIH0sCiAgICAvL+aJvuWIsOaMh+WumuWFg+e0oOeahOacquefpQogICAgaWR4T2Y6IGZ1bmN0aW9uIGlkeE9mKHZhbCwgbGlzdCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAobGlzdFtpXSA9PSB2YWwpIHJldHVybiBpOwogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0sCiAgICAvL+WIoOmZpOaMh+WumuWFg+e0oAogICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUodmFsLCBsaXN0KSB7CiAgICAgIHZhciBpZHggPSB0aGlzLmlkeE9mKHZhbCwgbGlzdCk7CiAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgIGxpc3Quc3BsaWNlKGlkeCwgMSk7CiAgICAgIH0KICAgIH0sCiAgICAvL+e9rumhtgogICAgdG9wOiBmdW5jdGlvbiB0b3AoaWR4LCBsaXN0KSB7CiAgICAgIGlmIChpZHggPj0gbGlzdC5sZW5ndGggfHwgaWR4IDwgMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvL+mAkOS4quS6pOaNogogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkeDsgaSsrKSB7CiAgICAgICAgdmFyIHRlbXAgPSBsaXN0W2ldOwogICAgICAgIGxpc3RbaV0gPSBsaXN0W2lkeF07CiAgICAgICAgbGlzdFtpZHhdID0gdGVtcDsKICAgICAgfQogICAgfSwKICAgIC8v572u5bqVCiAgICBib3R0b206IGZ1bmN0aW9uIGJvdHRvbShpZHgsIGxpc3QpIHsKICAgICAgaWYgKGlkeCA+PSBsaXN0Lmxlbmd0aCAtIDEgfHwgaWR4IDwgMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvL+mAkOS4quS6pOaNogogICAgICBmb3IgKHZhciBpID0gbGlzdC5sZW5ndGggLSAxOyBpID4gaWR4OyBpLS0pIHsKICAgICAgICB2YXIgdGVtcCA9IGxpc3RbaV07CiAgICAgICAgbGlzdFtpXSA9IGxpc3RbaWR4XTsKICAgICAgICBsaXN0W2lkeF0gPSB0ZW1wOwogICAgICB9CiAgICB9CiAgfSwKICAvKioNCiAgICog5a+56LGh6L2sdXJs5Y+C5pWwDQogICAqIEBwYXJhbSB7Kn0gZGF0YQ0KICAgKiBAcGFyYW0geyp9IGlzUHJlZml4DQogICAqLwogIHF1ZXJ5UGFyYW1zOiBmdW5jdGlvbiBxdWVyeVBhcmFtcyhkYXRhKSB7CiAgICB2YXIgaXNQcmVmaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlOwogICAgdmFyIHByZWZpeCA9IGlzUHJlZml4ID8gJz8nIDogJyc7CiAgICB2YXIgX3Jlc3VsdCA9IFtdOwogICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aoa2V5KSB7CiAgICAgIHZhciB2YWx1ZSA9IGRhdGFba2V5XTsKICAgICAgLy8g5Y675o6J5Li656m655qE5Y+C5pWwCiAgICAgIGlmIChbJycsIHVuZGVmaW5lZCwgbnVsbF0uaW5jbHVkZXModmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIDE7IC8vIGNvbnRpbnVlCiAgICAgIH0KICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKF92YWx1ZSkgewogICAgICAgICAgX3Jlc3VsdC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJ1tdPScgKyBlbmNvZGVVUklDb21wb25lbnQoX3ZhbHVlKSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3Jlc3VsdC5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7CiAgICAgIH0KICAgIH07CiAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICBpZiAoX2xvb3Aoa2V5KSkgY29udGludWU7CiAgICB9CiAgICByZXR1cm4gX3Jlc3VsdC5sZW5ndGggPyBwcmVmaXggKyBfcmVzdWx0LmpvaW4oJyYnKSA6ICcnOwogIH0sCiAgTWVudTogewogICAgYWRkU3ViTWVudXM6IGZ1bmN0aW9uIGFkZFN1Yk1lbnVzKHRoYXQsIGNoaWxkcmVuKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgLy8JCQkJCWlmKCFwYXJlbnQuY2hpbGRyZW4pewogICAgICAgIC8vCQkJCQkJcGFyZW50LmNoaWxkcmVuID0gW3twYXRoOicvJywgcmVkaXJlY3Q6Y2hpbGRyZW5bMF0ubWVudVVybH1dOwogICAgICAgIC8vCQkJCQl9CiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgICAgICAgLy9jb25zdCByb3V0ZSA9IHtwYXRoOiBtLm1lbnVVcmwsIG5hbWU6IG0uYWxpYXMsICBjb21wb25lbnQ6IHJlc29sdmUgPT4gcmVxdWlyZShbYEAvJHttLnRlbXBsYXRlVXJsfWBdLCByZXNvbHZlICl9OwogICAgICAgICAgLy9wYXJlbnQuY2hpbGRyZW4ucHVzaChyb3V0ZSk7CiAgICAgICAgICBpZiAobS5jaGlsZHJlbiAmJiBtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpc18uYWRkU3ViTWVudXModGhhdCwgbS5jaGlsZHJlbik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBhZGRUb1JvdXRlcjogZnVuY3Rpb24gYWRkVG9Sb3V0ZXIodGhhdCwgcm91dGUpIHsKICAgICAgdmFyIHJvdXRlcyA9IHRoYXQuJHJvdXRlci5vcHRpb25zLnJvdXRlczsKICAgICAgdmFyIGlzSW4gPSBmYWxzZTsKICAgICAgcm91dGVzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICBpZiAoci5wYXRoID09IHJvdXRlLnBhdGgpIHsKICAgICAgICAgIGlzSW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmICghaXNJbikgewogICAgICAgIHRoYXQuJHJvdXRlci5vcHRpb25zLnJvdXRlcy5wdXNoKHJvdXRlKTsKICAgICAgICB0aGF0LiRyb3V0ZXIuYWRkUm91dGVzKFtyb3V0ZV0pOwogICAgICB9CiAgICB9LAogICAgYWRkU3luY01lbnVzOiBmdW5jdGlvbiBhZGRTeW5jTWVudXModGhhdCwgbWVudXMpIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgIGlmIChtZW51cyAmJiBtZW51cy5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgJiYgbWVudXMubGVuZ3RoID4gMCkgewogICAgICAgIC8vIOabtOaWsOW9k+WJjemAieS4reeahOiPnOWNlQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGN1clJvdXRlUGF0aCA9IHRoYXQuJHJvdXRlLnBhdGg7CiAgICAgICAgICBtZW51cy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgICAgICAgIC8v5bCG5Yqo5oCB6I+c5Y2V5re75Yqg5Yiw6Lev55SxCiAgICAgICAgICAgIGlmIChtLmNvZGUgIT0gJ2hvbWUnICYmIG0uY29kZSAhPSAnc3RhdGVtZW50JyAmJiB0aGF0Lm1lbnVNYXBzW20uY29kZV0pIHsKICAgICAgICAgICAgICAvL2NvbnN0IHJvdXRlID0ge3BhdGg6IG0ucGF0aCwgIGNvbXBvbmVudDogcmVzb2x2ZSA9PiByZXF1aXJlKFtgQC8ke20udGVtcGxhdGVVcmx9YF0sIHJlc29sdmUgKX07CiAgICAgICAgICAgICAgLy/mt7vliqDot6/nlLHkv6Hmga8KICAgICAgICAgICAgICBpZiAodGhhdC5tZW51TWFwc1ttLmNvZGVdICYmIHRoYXQubWVudU1hcHNbbS5jb2RlXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBfdGhpczIuYWRkU3ViTWVudXModGhhdCwgdGhhdC5tZW51TWFwc1ttLmNvZGVdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy90aGlzLmFkZFRvUm91dGVyKHRoYXQscm91dGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwID0gbmV3IFJlZ0V4cCgiXi8iLmNvbmNhdChtLmFsaWFzLCAiLy4qJCIpKTsKICAgICAgICAgICAgaWYgKHAudGVzdChjdXJSb3V0ZVBhdGgpKSB7CiAgICAgICAgICAgICAgdGhhdC5hY3RpdmVNZW51SW5kZXggPSBtLmFsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9LCAxMDApOwogICAgICB9CiAgICB9CiAgfQp9OwoKLy8g5Zyo5pWw57uE5LiK5omp5bGV5LiA5Liq5Yig6Zmk5oyH5a6a6aG555qE5pa55rOVCkFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSkgewogIHRoaXMuc3BsaWNlKHRoaXMuZmluZEluZGV4KGZ1bmN0aW9uICh2KSB7CiAgICByZXR1cm4gdiA9PT0gaXRlbTsKICB9KSwgMSk7Cn07CgovLyDlnKjmlbDnu4TkuIrmianlsZXkuIDkuKrljrvph43nmoTmlrnms5UKQXJyYXkucHJvdG90eXBlLnVuaXF1ZSA9IGZ1bmN0aW9uIChhcmcpIHsKICB2YXIgcmVzID0gbmV3IE1hcCgpOwogIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAobSkgewogICAgaWYgKGFyZykgewogICAgICByZXR1cm4gIXJlcy5oYXMobVthcmddKSAmJiByZXMuc2V0KG1bYXJnXSwgMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gIXJlcy5oYXMobSkgJiYgcmVzLnNldChtLCAxKTsKICAgIH0KICB9KTsKfTsKZXhwb3J0IGRlZmF1bHQgdXRpbHM7"},null]}